一文搞定Java.lang.Class.IsInstance和Instanceof的區(qū)別
Java.lang.Class.isInstance和instanceof關(guān)鍵字都是用來(lái)判斷對(duì)象類型的,但是當(dāng)程序在運(yùn)行時(shí)動(dòng)態(tài)地判斷對(duì)象的類型時(shí)instanceof就無(wú)能為力了。話不多說(shuō),直接上代碼!
- 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沒(méi)有關(guān)系,直接編譯提示錯(cuò)誤:Incompatible conditional operand types Benz and Train
運(yùn)行代碼,輸出:
true
true
A instanceof B 用來(lái)判斷實(shí)例A 是否是類B的實(shí)例。 因?yàn)閎1 是Benz的實(shí)例,所以第一個(gè)輸出結(jié)果是true。
而Benz是Car的子類,所以第二個(gè)輸出結(jié)果也是true。
接下來(lái)我們看一下動(dòng)態(tài)地判斷對(duì)象類型的例子:
- 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);
- }
運(yùn)行代碼,輸出:
true
true
上述代碼中,isInstance()是Class類的一個(gè)方法public boolean isInstance(Object obj),該方法的作用是在運(yùn)行時(shí)判斷指定的obj對(duì)象是否是當(dāng)前Class實(shí)例所代表的類的實(shí)例。在這里我要提及一下Class這個(gè)類。在Java中每個(gè)類都有一個(gè)相對(duì)應(yīng)的Class類的對(duì)象,換句話說(shuō):Java程序在啟動(dòng)運(yùn)行時(shí) 一個(gè)XXX.java類經(jīng)過(guò)編譯生成XXX.class文件后,就會(huì)在JVM虛擬機(jī)中產(chǎn)生一個(gè)XXX類對(duì)應(yīng)的Class類的對(duì)象,用于表示這個(gè)XXX類的類型信息,其核心作用可以總結(jié)為如下4點(diǎn):
1.java.lang.Class類是Java中的反射中心,在運(yùn)行時(shí)提供或獲得某個(gè)對(duì)象的類型信息。
2.java是大小寫敏感的,因此Class和關(guān)鍵字class并不沖突。
3.當(dāng)我們創(chuàng)建一個(gè)類Car時(shí),Java會(huì)自動(dòng)生成一個(gè)內(nèi)容是Car的Class類的對(duì)象, Car.class。
4.Class類的對(duì)象只能由JVM創(chuàng)建,無(wú)法通過(guò)new來(lái)創(chuàng)建。



























