【Java面向对象】对象比较实验

背景介绍

equals方法作用:

equals()被用来检测两个对象是否相等,即两个对象的内容是否相等。

  • equals 方法是String类从它的超类Object中继承的

  • ==用于比较引用和比较基本数据类型时具有不同的功能:

比较基本数据类型,如果两个值相同,则结果为true

而在比较引用时,如果引用指向内存中的同一对象,结果为true

equals()方法在object类中定义:

public boolean equals(Object obj) {  
    return (this == obj);  
}  

实验环境

ASUS VivoBook + Windows10 + IntelliJ IDEA 2021.3.2 (Community Edition) + JDK17

实验内容

实现一个名为Value 的类,其中含有一个字符类型的成员x 和双精度类型的成员y。请重写(override)其equals( )方法,使得用equals( )比较Value 类的两个对象的内容时,相等条件是对象的所有成员分别对应相等。

(1)实验思路

①定义类Value,设置其成员变量(包括但不限于)为char型变量x和double型变量y。

②equals方法本是对引用地址进行比较,现需要根据两个类内容中的成员变量对内容进行比较,对于Value类对象而言需要将其与其他Value类对象进行比较。故重写方法返回值为boolean型,方法名保留为equals,参数列表为Value类对象b。借助比较运算符“==”和“this”关键字对两个类的成员变量进行判定,若满足则返回true,不满足则返回false。

③通过添加有参构造器可以对Value类的成员变量x和y进行初始化。

④在类中定义main方法,创建实例进行比较。

(2)实验源码

Value类:

public class Value {
    char x;
    double y;
    boolean equals(Value b) {
        return (this.x == b.x) && (this.y == b.y);
    }

    Value(char m,double n){
        this.x=m;
        this.y=n;
    }

    public static void main(String[] args) {
        Value classOne = new Value('x',2.5);
        Value classTwo = new Value('x',2.5);
        System.out.println(classOne.equals(classTwo));
    }
}

(3)实验截图

(4)实验心得

此题中共有两个难点。

第一个难点在于equals方法的重写判定。我们需要通过比较成员变量来比较类的内容,“==”本身不能用来比较引用对象的内容,但对于基本类型char和double,“==”却能够进行内容比较。故在equals方法中,我们借助“==”对基本类型进行内容比较,进而实现类的实例比较。

第二个难点在于实例创建。如果我们在创建类时指定成员变量的值,那就失去了比较的意义。通过创造构造器,使得用户自行输入两个Value类的实例的成员变量值,可以更好地帮助我们检验程序的正确性。

(5)实验重点

这里涉及了三个知识点,重写,判断实例的类和向下转型。

重写即在子类中定义方法名、返回类型和参数表和父类完全相同的方法,但方法实现过程不一样。这里格外需要注意的是子类中重写的方法访问权限只能增大不能减少,Object类中equals方法的访问权限为public,因此Valuez中重写的equals方法的访问权限只能为public。

判断实例的类是否是Value,在这个实验的程序中使用obj.getClass()==this.getClass() 来判断,另外还可以使用obj instanceof Value来判断。

只有先经过向上转型的对象才能继续向下转型。如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。

(摘自CSDN博主「CN_BIT」,链接:https://blog.csdn.net/CN_BIT/article/details/108778669

猜你喜欢

转载自blog.csdn.net/ayaishere_/article/details/128711820
今日推荐