- 如果要使用Class的應用來構造一個對象的示例, 那麼這麼對象對應的類必須有一個無參數的構造函數,例如:
Class ref=XXX.class;
XXX xxxref=ref.newInstance();
//那麼在XXX類裏面應該有一個無參數的構造函數
(還要注意這裏的ref應該採用泛型來定義,因爲newInstance()返回的的是Object類型, 上面的例子需要手動進行類型轉換)
- instanceof 關鍵字後面應緊跟 類型的名稱 而不是類型的class應用 例如
String t="aaa";
if(t instanceof String )//正確
//if(t instanceof String.class)//錯誤
- 判斷類型還可以用class的isInstance()方法 ,例如:
String t="ddd";
Class classRef=String.class;
if(classRef.isInstance(t))...
- 我們比較對象的類型的時候一般有四種方法
- 用instanceof操作符
- 使用Class的inInstance()方法
- 使用“==”運算符來判斷對象的Class
- 使用equals()方法來判斷對象的Class
但是要主要他們的區別,如下面的代碼所示
package come.afeiluo;
class A {
}
class B extends A {
}
public class TestClass2 {
static void compareType(Object o) {
Class oc = o.getClass();
System.out.println("identify " + oc);
System.out.println("object instanceof A "
+ (o instanceof A));
System.out.println("object instanceof B "
+ (o instanceof B));
System.out.println("A isInstance object " + A.class.isInstance(o));
System.out.println("B isInstance object " + B.class.isInstance(o));
System.out.println("A==object " + (A.class == oc));
System.out.println("B==object " + (B.class == oc));
System.out.println("A equals object " + (A.class.equals(oc)));
System.out.println("B equals object " + (B.class.equals(oc)));
}
public static void main(String[] args) {
compareType(new A());
System.out.println("=======================================");
compareType(new B());
}
}
再看一下輸出的結果:
identify class come.afeiluo.A
object instanceof A true
object instanceof B false
A isInstance object true
B isInstance object false
A==object true
B==object false
A equals object true
B equals object false
=======================================
identify class come.afeiluo.B
object instanceof A true
object instanceof B true
A isInstance object true
B isInstance object true
A==object false
B==object true
A equals object false
B equals object true
我們可以看到在對類型B進行判斷的時候 用instanceof 和isInstance()進行判斷的結果是一樣的,而 用“==”和equals()方法判斷的結果是一樣的,這是由於應instanceof 和inInstance()判斷的是這個類是某一種類型,或者是這種類型的子類型,而用“==”和equals()方法判斷的時候則是比較的是這個類是不是某種確切的類型