在Java中,instanceof
运算符只有在比较false
时才会返回null
。如果测试的引用变量不是所需类型,则程序无法编译。
此运算符是否仅有效地测试引用是否为null
?或者还有其他一些我没想过的用途吗?
如果没有,为什么不将其称为isNull
或更具描述性的内容?
答案 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)
请注意,在大多数情况下,可以通过多态来避免使用instanceof。