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));
}
}