如視頻教程,若我用父類animal創(chuàng)建一個(gè)對(duì)象dog,,用子類dog創(chuàng)建一個(gè)dog2,并對(duì)兩個(gè)對(duì)象的name和age賦相同的值,用equal方法對(duì)比時(shí)為什么顯示不相同?
如視頻教程,若我用父類animal創(chuàng)建一個(gè)對(duì)象dog,,用子類dog創(chuàng)建一個(gè)dog2,并對(duì)兩個(gè)對(duì)象的name和age賦相同的值,用源碼改過(guò)equal方法,對(duì)比時(shí)為什么顯示不相同?核心代碼如下:
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()方法比較的是同一個(gè)類中的多個(gè)對(duì)象,你創(chuàng)建了兩個(gè)類,兩個(gè)類中的對(duì)象引用地址肯定不相同啊,代碼?if?(this?==?obj),return?true;就是判斷引用地址是否相同,這一步得到的是false,后面就不再執(zhí)行了,直接到最后運(yùn)行結(jié)果“不相同”、我把視頻里的代碼在eclipse敲出來(lái)了,有注釋,你可以看下。
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("兩個(gè)對(duì)象相同");
??}else{
???System.out.println("兩個(gè)對(duì)象不相同");
??}
?}
}
class Phone{
?String a;
?int b;
?float c;
//比較兩個(gè)對(duì)象中的每一個(gè)值
?public boolean equals(Object obj) {
??if (this == obj)//判斷兩個(gè)引用的值是否相等,即引用的地址是否相同,若引用地址相同,則是同一個(gè)值返回true
???return true;
??if (obj == null)//若一個(gè)對(duì)象的值為空值,則無(wú)意義,返回false
???return false;
??if (getClass() != obj.getClass())//getClass得到的是類對(duì)象,new一個(gè)對(duì)象時(shí),得到的是類的對(duì)象,obj.getClass得到的是類的對(duì)象,此行代碼通過(guò)類對(duì)象判斷兩個(gè)對(duì)象的類型是否相同
???return false;//若兩個(gè)對(duì)象的類型都不相同則肯定不相同,返回false
??Phone other = (Phone) obj;//執(zhí)行到這里則兩個(gè)對(duì)象的類型肯定相同,則可以將傳進(jìn)來(lái)的對(duì)象轉(zhuǎn)換為Phone類型
??if (a == null) {//轉(zhuǎn)換為相同的類型后才可以進(jìn)行屬性比較,若兩個(gè)對(duì)象的屬性值相同,則兩個(gè)對(duì)象相同
???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比較的是兩個(gè)對(duì)象的內(nèi)存地址。因?yàn)閷?shí)例化的兩個(gè)對(duì)象雖然對(duì)象屬性是相同的,但是他們的地址不同,所以equal比較也會(huì)不同