isAssignableFrom
‘Class.isAssignableFrom’方法是用來判斷一個類Class1和另外一個類Class2是否相同或Class1是Class2的超類或接口。
一般調用格式是:
Class1.isAssignableFrom (Class2)
調用者和參數都是java.lang.Class類型。java
instanceof
而 instanceof 運算符是用來判斷一個對象實例是不是一個類或接口的實例。
格式是:obj instanceof TypeName
第一個參數是對象實例名,第二個參數是具體的類名或接口名。
Class.isInstance(Object obj) 與 instanceof等價。ide
Java裏,引用的類型是靜態肯定的——源碼裏聲明是什麼類型就是什麼類型;而對象的實際類型是動態肯定的。
instanceof 運算符它的運行時語義並不關心它的左操做數的引用的靜態類型,而只關心它所引用的對象的實際類型是否跟右操做數所指定的類型相匹配。this
instanceof 是如何進行判斷的?.net
At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.對象
也就是說,對於 obj instanceof TypeName
若是 obj 能夠轉換爲 TypeName 類型(沒有拋出ClassCastException異常)則返回 true,不然返回 false。接口
區別
instanceof是Java語言的語法結構,而該語法要求 instanceof 運算符的右操做數是一個引用類型名,也就意味着右操做數必須是一個編譯時的常量
isInstance是 Java 標準庫裏的一個方法,其被調用對象(receiver object,也就是「this」)等價於 instanceof 運算符的右操做數的意義,但能夠是運行時決定的任意 java.lang.Class 對象,而不要求是編譯時常量。這就比 instanceof 運算符要靈活一些。
import org.junit.Test;get
class Person {
private String name;
private int age;源碼
public Person() {
name = "lgh";
age = 25;
}it
public Person(String name, int age) {
this.name = name;
this.age = age;
}io
public Person(int age, String name) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class T {
@Test
public void test() {
Person person1 = new Person("111", 24);
Person person2 = new Person("222", 25);
System.out.println(person1.getClass().isAssignableFrom(person2.getClass()));//true
System.out.println(Object.class.isAssignableFrom(person1.getClass()));//true
System.out.println(person1.getClass().isAssignableFrom(Object.class));//false
System.out.println(person1 instanceof Person);//true System.out.println(person1 instanceof Object);//true } }