原創做品,能夠轉載,可是請標註出處地址:http://www.cnblogs.com/V1haoge/p/8492158.htmlhtml
instanceof關鍵字是在Java類中實現equals方法最常使用的關鍵字,表示其左邊的對象是不是右邊類型的實例,這裏右邊的類型能夠擴展到繼承、實現結構中,能夠是其真實類型,或者真實類型的超類型、超接口類型等。java
instanceof左邊必須是對象實例或者null類型,不然沒法經過編譯。ide
instanceof右邊必須是左邊對象的可轉換類型(可強轉),不然沒法經過編譯。this
使用實例:spa
1 interface IFather1{} 2 interface ISon1 extends IFather1{} 3 class Father1 implements IFather1{} 4 class Son1 extends Father1 implements ISon1{} 5 public class InstanceofTest { 6 public static void main(String[] args){ 7 Father1 father1 = new Father1(); 8 Son1 son1 = new Son1(); 9 System.out.println(son1 instanceof IFather1);//1-超接口 10 System.out.println(son1 instanceof Father1);//2-超類 11 System.out.println(son1 instanceof ISon1);//3-當前類 12 System.out.println(father1 instanceof IFather1);//4-超接口 13 System.out.println(father1 instanceof ISon1);//false 14 } 15 }
執行結果爲:code
true true true true false
如上實例所示:除了最後一個,前四個所有爲true,查看類的繼承關係以下:htm
能夠明顯看到,Son1類是最終的類,其對象son1能夠instanceof上面全部的接口和類(IFather一、ISon一、Father一、Son1),而Father1的實例father1上級只有IFather1接口和本類Father1能instanceof,其他均沒法成功。對象
這樣咱們就能理解instanceof的用途了,最後說說其在equals中的做用,咱們來看個簡單的equals實現(來自java.lang.String類):blog
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String) anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = 0; 12 while (n-- != 0) { 13 if (v1[i] != v2[i]) 14 return false; 15 i++; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
明顯在第5行使用到了instanceof關鍵字,其目的就是爲了判斷給定的參數對象是不是String類的實例。區別於getClass()方法,後者獲得的是當前對象的實際類型,不帶繼承關係。繼承
1 System.out.println(son1.getClass()); 2 System.out.println(father1.getClass());
結果爲:
class Son1 class Father1