子类重写equals

发布时间 2023-06-15 00:46:32作者: Hello_world_名字被取了

Java的equals()方法是在Object超类中定义的,其他例如String类调用的equals()方法都是被重写过的:

Object类中的equals()方法:

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

String类中对equals()方法的重写:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
                && (!COMPACT_STRINGS || this.coder == aString.coder)
                && StringLatin1.equals(value, aString.value);
    }

可以看到原本在Object超类中定义的equals()方法是用于判断两个对象是否地址相等,而非数值或内容相等,但在String类中经过重写后的equals()方法(String是Object的子类),可以用于判断String类型如字符串之间的内容比较:

package com.demo.day03;

public class Equals01 {
    public static void main(String[] args) {
        String str1 = new String("1234567");
        String str2 = new String("1234567");
        System.out.println(str1.equals(str2));
        System.out.println(str1 == str2);   //"=="在用于判断引用类型时比较的是两个对象的地址
    }
}

true
false

Process finished with exit code 0

可以看到按照Object超类中的equals()方法用于比较的两个对象得到的结果由false 转变为了 true,这就是方法重写后的结果,对于每一个不同的类来说,可能都需要一个equals()方法,但因为不同的类的不同特性,它们之间需要对比的内容也不尽相同,这时候Java的 "继承" 思想带来的重写方法就有了用武之地


package com.demo.day03;
//超类Object的equals()方法用于判断两个对象的内存地址是否相等
//我们自己写的Person类需要通过equals()方法来对比类中属性是否相等,所以需要手动重写equals()方法
public class EqualsExer_ {
    public static void main(String[] args) {
        Person person1 = new Person("jack", 10, '男');
        Person person2 = new Person("jack", 10, '男');

        System.out.println(person1.equals(person2));
    }
}
//创建Person类,属性为:名字、年龄、性别
//在Person类中重写equals()方法
class Person{
    private String name;
    private int age;
    private char gender;

    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public boolean equals(Object obj){
        if (this == obj){   //判断如果本类和传参的类地址相等,则直接返回为true
            return true;
        }
        //判断其左边对象是否为其右边类的实例
        if (obj instanceof Person){ //比较类型是否与本类是同类,如果不是则直接执行第 34 行的返回为false
            Person p = (Person)obj;            //进行向下转型更改obj实例的编译类型,方便调用obj对象的属性,不然会不过编译而报错
            return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
        }
        return false;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }
}