今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想。大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别。
本来想快点搜一下看个结论,不料还是被迫自己研究了一下。
先说结论,很简单:
instanceof 是静态比较。instanceof 后面的类名在编译时就已知且固定了,即 obj instanceof ClassA,ClassA 必须是已经存在的类名,不然编译都过不了。
isInstance() 是动态比较。isInstance() 的左边可以在运行时决定,即可以这样 objA.getClass().isInstance(objB),objA 可以作为某个方法的参数被传进来,这样可以动态的看两个对象是否类型兼容。
这是主要区别,如果硬要扯其它区别还有 instanceof 是 Java 内置的比较运算符,isInstance() 是个方法。
最后附一段测试代码(只示例用法,体现不了区别。注意子类和null):
class A {}
class B extends A {}
class C extends A {}
public class InstanceofDemo
{
public static void main(String args[])
{
A a = new A();
B b = new B();
C c = new C();
System.out.println("a instanceof A: " + (a instanceof A)); //true
System.out.println("b instanceof A: " + (b instanceof A)); //true
System.out.println("c instanceof A: " + (c instanceof A)); //true
System.out.println("a instanceof B: " + (a instanceof B)); //false
System.out.println("null instanceof A: " + (null instanceof A)); //false
System.out.println("a.getClass().isInstance(a): " + a.getClass().isInstance(a)); //true
System.out.println("a.getClass().isInstance(b): " + a.getClass().isInstance(b)); //true
System.out.println("b.getClass().isInstance(c): " + b.getClass().isInstance(c)); //false
System.out.println("b.getClass().isInstance(null): " + b.getClass().isInstance(null)); //false
}
}