null引用是一个类的实例吗?

时间:2012-01-19 21:28:25

标签: java reference null instance

这是一个简单的代码

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是否包含有关分配给的对象的一些信息?

5 个答案:

答案 0 :(得分:23)

你读错了。对于instanceof引用,false 总是评估为null

来自Java specification(强调我的):

  

在运行时,如果RelationalExpression的值不为null ,则instanceof运算符的结果为true ,并且可以在不引发ClassCastException的情况下将引用强制转换(第15.16节)到ReferenceType。否则结果是错误的。

答案 1 :(得分:1)

总是假的。 Javac知道它。

但是你可以使用f.someStaticFunctionOfTheClassFoo()。所以,你的问题非常有趣,只需要进行编辑。

答案 2 :(得分:1)

你是什么意思

  

java如何知道这个null是Bar而不是Foo?

null既不是Bar也不是Foo。见Java method dispatch with null argument

答案 3 :(得分:1)

  

null引用是类的实例吗?

让我们清楚这一点。引用不是任何事物的实例。这是一个参考。它引用的对象,如果有的话,是某个类的实例。但空引用并不引用任何对象。

  

我的问题是:Java如何知道传递的null是Bar而不是Foo?

它没有。你的节目骗了你。它打印" Bar"如果引用没有&#t; 引用Foo的实例。您的编码很差。

  

我知道为什么编译器会选择Bar而不是Foo(因为有从foo到bar和bar到foo的转换,反之亦然)。

编译器没有做出任何此类选择。您的代码执行了一个设计不佳的测试和打印。

  

但该方法如何知道这个null来自Bar而不是Foo?

它没有。它猜到了。它弄错了。

  

null是否包含有关分配给对象的对象的一些信息?

根本不包含任何信息。

答案 4 :(得分:0)

null是一种特殊类型,特殊类型是" NullType"。