这是一个简单的代码
class Foo {
}
class Bar extends Foo {
}
public class Main {
public static void main(String[] args) throws Exception {
fn(null);
}
static void fn(Foo f) {
System.out.println(f instanceof Foo ? "Foo" : "Bar");
}
}
我的问题是:Java如何知道传递的空为Bar
而不是Foo
?
我知道为什么编译器选择Bar而不是Foo(因为有从foo到bar和bar到foo的转换,反之亦然)。
但是这个方法怎么会知道这个null来自Bar而不是Foo?
null是否包含有关分配给的对象的一些信息?
答案 0 :(得分:23)
你读错了。对于instanceof
引用,false
总是评估为null
。
来自Java specification(强调我的):
在运行时,如果RelationalExpression的值不为null ,则instanceof运算符的结果为true ,并且可以在不引发ClassCastException的情况下将引用强制转换(第15.16节)到ReferenceType。否则结果是错误的。
答案 1 :(得分:1)
总是假的。 Javac知道它。
但是你可以使用f.someStaticFunctionOfTheClassFoo()。所以,你的问题非常有趣,只需要进行编辑。
答案 2 :(得分:1)
答案 3 :(得分:1)
null引用是类的实例吗?
让我们清楚这一点。引用不是任何事物的实例。这是一个参考。它引用的对象,如果有的话,是某个类的实例。但空引用并不引用任何对象。
我的问题是:Java如何知道传递的null是Bar而不是Foo?
它没有。你的节目骗了你。它打印" Bar"如果引用没有&#t; 引用Foo的实例。您的编码很差。
我知道为什么编译器会选择Bar而不是Foo(因为有从foo到bar和bar到foo的转换,反之亦然)。
编译器没有做出任何此类选择。您的代码执行了一个设计不佳的测试和打印。
但该方法如何知道这个null来自Bar而不是Foo?
它没有。它猜到了。它弄错了。
null是否包含有关分配给对象的对象的一些信息?
根本不包含任何信息。
答案 4 :(得分:0)
null是一种特殊类型,特殊类型是" NullType"。