子类重写equals
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
falseProcess 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;
}
}