JAVA中 instanceof 和 getClass() 區別小結

在進行對象之間的比較時會須要針對兩個對象的類屬性值進行比較,此時能夠選擇 instanceof 或者 getClass() 進行比較判斷。二者均可以用於比較對象之間的類是否相同,但也存在一些區別。測試

instanceof

使用 instanceof 時會判斷該對象是否屬於指定類或接口,同時也會判斷是否屬於其繼承類或實現類。若是知足其中一個條件則返回值爲 true,不然爲 false。測試代碼以下:code

public class Test {

    public static void main(String[] args) {
        Object a = new SubClassA();

        System.out.println("a instanceof SubClassA is: " + (a instanceof SubClassA));
        System.out.println("a instanceof SuperClass is: " + (a instanceof SuperClass));
        System.out.println("a instanceof SuperInterface is: " + (a instanceof SuperInterface));
        System.out.println("a instanceof SubClassB is: " + (a instanceof SubClassB));
    }
}

class SuperClass {

}

interface SuperInterface {

}

class SubClassA extends SuperClass implements SuperInterface {

}

class SubClassB extends SuperClass {

}

上述代碼輸入以下:對象

a instanceof SubClassA is: true
a instanceof SuperClass is: true
a instanceof SuperInterface is: true
a instanceof SubClassB is: false

因爲 a 對象爲 SubClassA 類的實例,且繼承了 SuperClass 類,並實現了 SuperInterface 接口,故使用 instanceof 進行判斷的時候結果都爲 true,而與 SubClassB 類進行比較時則爲 false。繼承

getClass()

使用 getClass() 方法進行判斷時,因爲 getClass() 方法返回值爲當前實例對象的 Class 對象,同時 Class 類並未重寫 equals() 方法,故進行判斷時不管是使用 == 仍是使用 equals() 方法都是同樣的效果(Object類的 equals() 方法也是使用的 == 進行比較),是比較當前的 Class 對象是否相同。測試代碼以下:接口

public static void main(String[] args) {
        Object a = new SubClassA();

        System.out.println("a.getClass() == SubClassA.class is: " + (a.getClass() == SubClassA.class));
        System.out.println("a.getClass() == SuperClass.class is: " + (a.getClass() == SuperClass.class));
        System.out.println("a.getClass() == SuperInterface.class is: " + (a.getClass() == SuperInterface.class));
        System.out.println("a.getClass() == SubClassB.class is: " + (a.getClass() == SubClassB.class));
    }

上述代碼輸入以下:get

a.getClass() == SubClassA.class is: true
a.getClass() == SuperClass.class is: false
a.getClass() == SuperInterface.class is: false
a.getClass() == SubClassB.class is: false

因爲 a 對象爲 SubClassA 類的實例,經過 getClass() 方法進行判斷時不會對其父類或其接口類進行關聯,故對應判斷結果都爲 false。class

經過上述比較可知,使用 instanceof 進行類的判斷時,只要左邊的對象是右邊的類的子類或實現類時都可成立。而使用 getClass() 方法進行判斷時,須要嚴格判斷是否爲相同類的對象。方法

相關文章
相關標籤/搜索