一文搞定Java.lang.Class.IsInstance和Instanceof的區(qū)別
Java.lang.Class.isInstance和instanceof關(guān)鍵字都是用來判斷對象類型的,但是當(dāng)程序在運行時動態(tài)地判斷對象的類型時instanceof就無能為力了。話不多說,直接上代碼!
- public class Car {
- }
- public class Train{
- }
- public class Benz extends Car {
- public void printBenz() {
- System.out.println("printBenz");
- }
- }
- Car c1=new Car();
- Benz b1=new Benz();
- System.out.println(b1 instanceof Benz);
- System.out.println(b1 instanceof Car);
- System.out.println(b1 instanceof Train); //b1與Train沒有關(guān)系,直接編譯提示錯誤:Incompatible conditional operand types Benz and Train
運行代碼,輸出:
true
true
A instanceof B 用來判斷實例A 是否是類B的實例。 因為b1 是Benz的實例,所以第一個輸出結(jié)果是true。
而Benz是Car的子類,所以第二個輸出結(jié)果也是true。
接下來我們看一下動態(tài)地判斷對象類型的例子:
- public static void main(String[] args)throws ClassNotFoundException {
- System.out.println(checkType(newBenz(), "com.my.demo.Car"));
- System.out.println(checkType(newBenz(), "com.my.demo.Benz"));
- }
- public static boolean checkType(Object obj,String className) throws ClassNotFoundException {
- return Class.forName(className).isInstance(obj);
- }
運行代碼,輸出:
true
true
上述代碼中,isInstance()是Class類的一個方法public boolean isInstance(Object obj),該方法的作用是在運行時判斷指定的obj對象是否是當(dāng)前Class實例所代表的類的實例。在這里我要提及一下Class這個類。在Java中每個類都有一個相對應(yīng)的Class類的對象,換句話說:Java程序在啟動運行時 一個XXX.java類經(jīng)過編譯生成XXX.class文件后,就會在JVM虛擬機中產(chǎn)生一個XXX類對應(yīng)的Class類的對象,用于表示這個XXX類的類型信息,其核心作用可以總結(jié)為如下4點:
1.java.lang.Class類是Java中的反射中心,在運行時提供或獲得某個對象的類型信息。
2.java是大小寫敏感的,因此Class和關(guān)鍵字class并不沖突。
3.當(dāng)我們創(chuàng)建一個類Car時,Java會自動生成一個內(nèi)容是Car的Class類的對象, Car.class。
4.Class類的對象只能由JVM創(chuàng)建,無法通過new來創(chuàng)建。