在运行时识别一个对象的类型:instanceof,其返回一个boolean值,表示对象是不是某个特定类型的实例。
用法:a instanceof B
表示:对象实例a是否属于类B,或者是否是B的派生类
instanceof的使用有严格的限制,只可将其与命名类型【即class类】进行比较,而不能与Class对象【即class类的对象】作比较。
package 类型信息.类的加载; public class Fruit{ } public class Apple extends Fruit{ }
package 类型信息.类的加载; /** * a instanceof B 表示:对象x是不是某个特定类型B的实例[a是否从属于B] * * a.getClass().isinstance(b) * * @author admin * */ public class InstanceTest { public static void main(String[] args) { Apple a = new Apple(); Fruit f = new Fruit(); Fruit fru = new Apple(); System.out.println(a instanceof Object); System.out.println(a instanceof Apple); System.out.println(a instanceof Fruit); System.out.println(f instanceof Apple); } }
控制台:
true true true false
class.isInstance(Object obj)相对于instanceof要灵活一些,至少你可以传递参数去判断某class是否属于参数指定的对象实例或类字面常量。
用法:A.class.isInstance(b) 或 a.getClass().isInstance(b),其中参数如果是类字面量或obj.getClass()这种用法没有任何意义。
1 package 类型信息.类的加载; 2 3 /** 4 * a instanceof B 表示:对象x是不是某个特定类型B的实例[a是否从属于B] 5 * 6 * a.getClass().isInstance(b) 或 A.Class.isInstance(b) 7 * 8 * @author admin 9 * 10 */ 11 public class InstanceTest { 12 13 public static void main(String[] args) { 14 15 System.out.println("==========1=========="); 16 17 Apple a = new Apple(); 18 Fruit f = new Fruit(); 19 Fruit fru = new Apple(); 20 21 System.out.println(a instanceof Object); 22 System.out.println(a instanceof Apple); 23 System.out.println(a instanceof Fruit); 24 System.out.println(f instanceof Apple); 25 26 System.out.println("==========2=========="); 27 28 System.out.println(Apple.class.isInstance(a)); 29 System.out.println(Apple.class.isInstance(f)); 30 System.out.println(Apple.class.isInstance(fru)); 31 32 System.out.println("==========3=========="); 33 System.out.println(a.getClass().isInstance(a)); 34 System.out.println(a.getClass().isInstance(f)); 35 System.out.println(a.getClass().isInstance(fru)); 36 37 } 38 39 }
==========1========== true true true false ==========2========== true false true ==========3========== true false true
从结果可以看出:使用isInstance(obj)方法其实比较的是对象引用是否从属于某个类,而不是比较对象是否从属于某类。