Java基礎系列-instanceof關鍵字
原創文章,轉載請標註出處: 《Java基礎系列-instanceof關鍵字》
instanceof關鍵字是在Java類中實現equals方法最常使用的關鍵字,表示其左邊的物件是否是右邊型別的例項,這裡右邊的型別可以擴充套件到繼承、實現結構中,可以是其真實型別,或者真實型別的超型別、超介面型別等。
instanceof左邊必須是物件例項或者null型別,否則無法通過編譯。
instanceof右邊必須是左邊物件的可轉換型別(可強轉),否則無法通過編譯。
使用例項:
interface IFather1{} interface ISon1 extends IFather1{} class Father1 implements IFather1{} class Son1 extends Father1 implements ISon1{} public class InstanceofTest { public static void main(String[] args){ Father1 father1 = new Father1(); Son1 son1 = new Son1(); System.out.println(son1 instanceof IFather1);//1-超介面 System.out.println(son1 instanceof Father1);//2-超類 System.out.println(son1 instanceof ISon1);//3-當前類 System.out.println(father1 instanceof IFather1);//4-超介面 System.out.println(father1 instanceof ISon1);//false } }
執行結果為:
true true true true false
如上例項所示:除了最後一個,前四個全部為true,檢視類的繼承關係如下:

可以明顯看到,Son1類是最終的類,其物件son1可以instanceof上面所以的介面和類(IFather1、ISon1、Father1、Son1),而Father1的例項father1上級只有IFather1介面和本類Father1能instanceof,其餘均無法成功。
這樣我們就能理解instanceof的用途了,最後說說其在equals中的作用,我們來看個簡單的equals實現(來自java.lang.String類):
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String) anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
明顯在第5行使用到了instanceof關鍵字,其目的就是為了判斷給定的引數物件是否是String類的例項。區別於getClass()方法,後者得到的是當前物件的實際型別,不帶繼承關係。
System.out.println(son1.getClass()); System.out.println(father1.getClass());
結果為:
class Son1 class Father1
參考: