如視頻教程,若我用父類animal創建一個對象dog,,用子類dog創建一個dog2,并對兩個對象的name和age賦相同的值,用equal方法對比時為什么顯示不相同?
如視頻教程,若我用父類animal創建一個對象dog,,用子類dog創建一個dog2,并對兩個對象的name和age賦相同的值,用源碼改過equal方法,對比時為什么顯示不相同?核心代碼如下:
package?com.imooc; public?class?Pig?{ public?int?age=20; public?String?name="pig"; @Override public?boolean?equals(Object?obj)?{ if?(this?==?obj) return?true; if?(obj?==?null) return?false; if?(getClass()?!=?obj.getClass()) return?false; Pig?other?=?(Pig)?obj; if?(age?!=?other.age) return?false; if?(name?==?null)?{ if?(other.name?!=?null) return?false; }?else?if?(!name.equals(other.name)) return?false; return?true; } } public?class?Pig2{ public?int?age=20; public?String?name="pig"; } public?class?Initial?{ public?static?void?main(String[]?args)?{ Pig?pig=new?Pig(); Pig2?pig2=new?Pig2(); if(pig.equals(pig2)){ System.out.println("相同"); }else?{ System.out.println("不相同"); } } }
2016-07-24
2016-08-04
if?(getClass()?!=?obj.getClass())
????????????return?false;
理解這一句的含義。
2016-07-24
equals()方法比較的是同一個類中的多個對象,你創建了兩個類,兩個類中的對象引用地址肯定不相同啊,代碼?if?(this?==?obj),return?true;就是判斷引用地址是否相同,這一步得到的是false,后面就不再執行了,直接到最后運行結果“不相同”、我把視頻里的代碼在eclipse敲出來了,有注釋,你可以看下。
public class Mk0_4 {
?public static void main(String[] args) {
??Phone p1 = new Phone();
??p1.a = "imooc";
??p1.b = 20;
??p1.c = 3.14f;
??Phone p2 = new Phone();
??p2.a = "imooc";
??p2.b = 20;
??p2.c = 3.14f;
??if(p1.equals(p2)){
???System.out.println("兩個對象相同");
??}else{
???System.out.println("兩個對象不相同");
??}
?}
}
class Phone{
?String a;
?int b;
?float c;
//比較兩個對象中的每一個值
?public boolean equals(Object obj) {
??if (this == obj)//判斷兩個引用的值是否相等,即引用的地址是否相同,若引用地址相同,則是同一個值返回true
???return true;
??if (obj == null)//若一個對象的值為空值,則無意義,返回false
???return false;
??if (getClass() != obj.getClass())//getClass得到的是類對象,new一個對象時,得到的是類的對象,obj.getClass得到的是類的對象,此行代碼通過類對象判斷兩個對象的類型是否相同
???return false;//若兩個對象的類型都不相同則肯定不相同,返回false
??Phone other = (Phone) obj;//執行到這里則兩個對象的類型肯定相同,則可以將傳進來的對象轉換為Phone類型
??if (a == null) {//轉換為相同的類型后才可以進行屬性比較,若兩個對象的屬性值相同,則兩個對象相同
???if (other.a != null)
????return false;
??} else if (!a.equals(other.a))
???return false;
??if (b != other.b)
???return false;
??if (Float.floatToIntBits(c) != Float.floatToIntBits(other.c))
???return false;
??return true;
?}
}
2016-07-22
equal比較的是兩個對象的內存地址。因為實例化的兩個對象雖然對象屬性是相同的,但是他們的地址不同,所以equal比較也會不同