Java對象類型的判斷的幾種方法

instanceof

判斷某個對象是否是某個類的實例或者某個類的子類的實例。它的判斷方式大概是這樣的:

public <T> boolean function(Object obj, Class <T> calzz) {
    if (obj == null) {
        return false;
    }
    try {
        T t = (T) obj;
        return true;
    } catch (ClassCastException e) {
        return false;
    }
}
/** 動物類 **/
class Animal {}
/** 狗 **/
class Dog extends Animal {}
/** 使用instanceof判斷對象類型 **/
public class InstanceofTest {
    public static void main(String[] args) {
        Animal a = new Dog();
        if (a instanceof Dog) {
            // 向下轉型操作
            Dog d = (Dog) a;
            System.out.println("向下轉型操作成功!");
        }
    }
}

Class.equals()

這種方式比較的類型,一定是本身才返回true,子類或者父類都返回false;

public boolean equals(Object obj) 
1.自身和自身應該是equals的.    X.equals(x)  return ture
2.如果A等於B, 那麼B也就等於A . X.equals(y) 那麼  Y.equals(X)
3.傳遞性:  X.equals(Y)  Y.equals(Z) 那麼 X.equals(Z).
4.永恆性. 始終是相等的. 今天是相等的那麼明天也會是相等的.
5.對於任何的non-null數值和null值進行比較得到的結果永遠是false. X.equals(null)   輸出false.\


默認實現:當且僅當X.Y都指向同一個對象時.編譯器才返回ture.
The equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y,
this method returns true if and only if x and y refer to the same object (x == y has the value true).

從上文知:  x = y; 和 x.equals(y);是一樣的意思
class A {}
class B extends A {}
class C extends B {}
// B是A的子類,C是B的子類
public ClassEqualsTest {
    public static void main(String args[]) {
        B b = new B();
        // false
        System.out.println(b.getClass().equals(A.class));
        // true
        System.out.println(b.getClass().equals(B.class));
        // false
        System.out.println(b.getClass().equals(C.class));
    }
}

b.getClass().equals(A.class)等同於b.getClass() == A.class

Class.isInstance()

確定指定的Object是否與此 Class表示的對象分配兼容。此方法是 Java語言 instanceof運算符的動態等效。如果指定的 Object參數爲非 null,則該方法返回 true,並且可以 Class爲此 Class對象表示的引用類型,而不提高 ClassCastException.,否則返回false。

class A {}
class B extends A {}
class C extends B {}
// B是A的子類,C是B的子類
public ClassEqualsTest {
    public static void main(String args[]) {
        B b = new B();
        // true
        System.out.println(A.class.isInstance(b));
        // true
        System.out.println(B.class.isInstance(b));
        // false
        System.out.println(C.class.isInstance(b));
    }
}

Class.isAssignableFrom

判斷某個類是否是另一個類和其子類。確定此Class對象表示的類或接口是否與指定的 Class參數表示的類或接口相同,或者是它們的超類或超接口。如果是這樣,它返回 true;否則返回 false。如果此 Class對象表示基本類型,則如果指定的 Class參數恰好是此 Class對象,則此方法返回 true;否則返回false。

class A {}
class B extends A {}
class C extends B {}
// B是A的子類,C是B的子類
public ClassEqualsTest {
    public static void main(String args[]) {
        // false
        System.out.println(B.class.isAssignableFrom(A.class));
        // true 
        System.out.println(B.class.isAssignableFrom(B.class));
        // true
        System.out.println(B.class.isAssignableFrom(C.class));
    }
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章