子類重寫equals
Java的equals()方法是在Object超類中定義的,其他例如String類調(diào)用的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()方法是用于判斷兩個(gè)對象是否地址相等,而非數(shù)值或內(nèi)容相等,但在String類中經(jīng)過重寫后的equals()方法(String是Object的子類),可以用于判斷String類型如字符串之間的內(nèi)容比較:
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); //"=="在用于判斷引用類型時(shí)比較的是兩個(gè)對象的地址
}
}
true
falseProcess finished with exit code 0
可以看到按照Object超類中的equals()方法用于比較的兩個(gè)對象得到的結(jié)果由false 轉(zhuǎn)變?yōu)榱?true,這就是方法重寫后的結(jié)果,對于每一個(gè)不同的類來說,可能都需要一個(gè)equals()方法,但因?yàn)椴煌念惖牟煌匦裕鼈冎g需要對比的內(nèi)容也不盡相同,這時(shí)候Java的 "繼承" 思想帶來的重寫方法就有了用武之地
package com.demo.day03;
//超類Object的equals()方法用于判斷兩個(gè)對象的內(nèi)存地址是否相等
//我們自己寫的Person類需要通過equals()方法來對比類中屬性是否相等,所以需要手動(dòng)重寫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));
}
}
//創(chuàng)建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;
}
//判斷其左邊對象是否為其右邊類的實(shí)例
if (obj instanceof Person){ //比較類型是否與本類是同類,如果不是則直接執(zhí)行第 34 行的返回為false
Person p = (Person)obj; //進(jìn)行向下轉(zhuǎn)型更改obj實(shí)例的編譯類型,方便調(diào)用obj對象的屬性,不然會(huì)不過編譯而報(bào)錯(cuò)
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;
}
}

浙公網(wǎng)安備 33010602011771號