有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么instanceof听上去不工作?

在Java中,instanceof运算符仅在比较null时返回false。如果测试的引用变量不是所需类型,则程序无法编译。 这个操作符是否只有效地测试引用是否为null?还是我没想到还有别的用途

如果不是,为什么不称之为isNull或更具描述性的东西呢


共 (5) 个答案

  1. # 1 楼答案

    instanceof在对其右侧的类的实例或任何派生类使用时返回true。否则将返回false

    class A { /*...*/ }
    class B extends A { /*...*/ }
    
    A objA = new A();
    B objB = new B();
    
    boolean test = objA instanceof A;   // test is true
    test = objA instanceof B;   // test is false
    test = objB instanceof A;   // test is true
    test = objB instanceof B;   // test is true
    

    上述代码不会引发任何异常。不过,以下几点可以:

    objB = (B) objA;
    

    希望这有帮助

  2. # 2 楼答案

    if(MyObj instanceof SomeClass)
    
    • 如果左侧对象为null=返回false
    • 如果左侧不是rigth side类的实例,则返回false
    • 如果左侧为实例,如果右侧为实例,则返回true

    请注意,在大多数情况下,多态性可以避免使用实例

  3. # 3 楼答案

    当您有一个超类类型引用,并且希望检查该对象是否是某个子类的实例时,它很有用:

    例如

    public class Sup { }
    
    public class Sub1 extends Sup { }
    
    public class Sub2 extends Sup { }
    
    public void someMethod(Sup sup) {
        if(sup instanceof Sub1) {
            //....
        }
    }
    
  4. # 4 楼答案

    如果比较永远不可能是真的,那么它就无法编译。例如:

    "string" instanceof Number
    

    这不会编译,因为编译器知道字符串永远不能是数字。运算符的作用与预期完全相同:它测试操作数是否为指定类型的实例

    测试空引用时返回false是为了使代码更简单、更可读。它可以防止您需要这样做:

    if (obj != null && obj instanceof Number) {
        ...
    }
    

    阅读本文了解操作符:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2

  5. # 5 楼答案

    我不确定您是如何得出结论的,但当第一个操作数的运行时类型与第二个操作数指定的类型不匹配时,instanceof操作将导致false

    比如

    Object t1 = "Hello, World!";
    System.out.println(t1 instanceof Number);
    

    …打印“false”,因为t1是String,而不是Number或其子类之一

    你能举一个编译失败的instanceof操作的例子吗?这很可能是由于语法错误造成的