`
JohnShen0708
  • 浏览: 59109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 中 instanceof 和 isInstance 的区别

 
阅读更多

今天百度了一下 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
  }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics