【问题标题】:Is a null reference an instance of a class?空引用是类的实例吗?
【发布时间】:2012-01-19 21:28:25
【问题描述】:

这是一个简单的代码

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 如何知道传递的 null 是 Bar 而不是 Foo? 我知道为什么编译器选择 Bar 而不是 Foo(因为从 foo 到 bar 以及从 bar 到 foo 的转换,反之亦然)。 但是该方法如何知道这个 null 来自 Bar 而不是 Foo? null 是否包含有关分配给的对象的一些信息?

【问题讨论】:

  • Null 不能是 Bar 或 Foo。它是空的。

标签: java reference null instance


【解决方案1】:

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

来自Java specification(强调我的):

在运行时,instanceof 运算符的结果为真如果 RelationalExpression 的值不为 null,并且可以将引用强制转换(第 15.16 节)到 ReferenceType 而不会引发 ClassCastException。否则结果为假。

【讨论】:

  • 可能更多,因为null 不是实例。但是 null 可以分配给每个类。
【解决方案2】:

它总是错误的。 Javac 知道。

但是你可以使用 f.someStaticFunctionOfTheClassFoo()。所以,你的问题很有趣,只是需要编辑一下。

【讨论】:

  • 我看不出在这里提及静态方法有什么用处。
【解决方案3】:

什么意思

java 怎么知道这个 null 是 Bar 而不是 Foo?

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

【讨论】:

    【解决方案4】:

    空引用是类的实例吗?

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

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

    它没有。你的程序骗了你。如果引用 引用 Foo 的实例,它会打印“Bar”。你的编码很糟糕。

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

    编译器没有做出任何这样的选择。您的代码进行了设计不佳的测试和打印。

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

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

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

    它根本不包含任何信息。

    【讨论】:

    • 原来我问这个问题的时候是个白痴:)
    • @SleimanJneidi 我不会这么粗鲁地同意,但能够承认自己的错误总是好的。
    【解决方案5】:

    null 是一种特殊类型,该特殊类型是“NullType”。

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多