1为什么要在对象子类中重写(修改)equals方法?
1)在java中创建的两个对象当我们判断他们两个是否为同一个对象时往往要有两个判断标准,一个是判断内存地址,一个是判断其各个属性是否相等,两个条件中只要有一个满足我们就认为两个对象为同一个人.然而有时两个对象的地址虽然不一样,但各个属性却相同(比如银行系统中系统中存入的用户信息地址在常量区中,而Scanner用户登录时要重新创建(new)一个对象,此时new的对象将被存放在堆内存中,二者的内存地址不同,因此这两个对象用内存地址判断的话不是同一个对象),此时两个对象仍然是一个人,所以就要修改equals方法增加判断属性是否相等的代码,因为equals只能判断地址是否相同.
2)即使不修改equals方法也可以在main方法中通过判断语句来对两个对象的地址和属性进行一一判断(this == obj判断地址,equals判断属性是否相等)此时两个对象还好说,但比较的对象一多就要写很多的方法会造成代码冗余,因此要在类中重写(修改)equals方法,再在main方法中调用即可,这样就可以省去很多代码量
重写(修改)equals代码展示如下:
//测试类
public class Text {
public static void main(String[] args) {
Person p1 = new Person("张三", "男");
Person p2 = new Person("张三", "男");
p1.equals(p2);
System.out.println(p1.equals(p2));
}
}
//人物类
public class Person {
String name ;
String gender ;
public Person(String name, String gender) {
super();
this.name = name;
this.gender = gender;
}
public Person() {
super();
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (this == obj) {
//return单独使用跳出main方法
//break结束当前 循环
//在main中调用的是修改后的equals方法
return true;
}
//判断传入的数据是否为Person的类对象
if (obj instanceof Person) {
//如果是,父转子再调用子的属性进行判断
Person person = (Person)obj ;
if (this.name.equals(person.name)&&this.gender.equals(person.gender)) {
return true ;
}
}
return false;
}
}
代码总结:
1)return单独使用表示直接结束程序.break在循环中使用表示结束循环
2)谁调用this所在的方法this就代表谁,此案例在main方法中p1调用了equals方法(修改后的equals方法)因此这个this就代表p1,因此equals方法中和传进的obj进行判断地址是否相等的是p1而equals中的形参就是p2
3)在判断属性时还要判断传进来的obj是否属于人这个类(用instenceof判断)如果是,则在执行语句中将其强转为子类对象(父转子),因为在判断属性是否相同时用子类对象名调子类对象的属性,如果不转则实参子类传进来自动转为父类,子转父不能调用子类的属性