为什么不按照它听起来的方式工作?

时间:2011-11-28 21:07:45

标签: java variables types reference

在Java中,instanceof运算符只有在比较false时才会返回null。如果测试的引用变量不是所需类型,则程序无法编译。 此运算符是否仅有效地测试引用是否为null?或者还有其他一些我没想过的用途吗?

如果没有,为什么不将其称为isNull或更具描述性的内容?

5 个答案:

答案 0 :(得分:5)

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

例如,

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

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

请举例说明instanceof无法编译的操作示例?最有可能的原因是语法错误。

答案 1 :(得分: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

答案 2 :(得分:1)

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

e.g。

public class Sup { }

public class Sub1 extends Sup { }

public class Sub2 extends Sup { }

public void someMethod(Sup sup) {
    if(sup instanceof Sub1) {
        //....
    }
}

答案 3 :(得分: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;

希望这有帮助。

答案 4 :(得分:0)

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

请注意,在大多数情况下,可以通过多态来避免使用instanceof。