空引用是类的实例吗?

发布于 2024-12-28 02:22:48 字数 456 浏览 0 评论 0原文

这是一个简单的代码

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

This is a simple code

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");
}
}

My question is: How Java knows that the passed null is Bar and not Foo?
I know why the compiler chooses Bar and not Foo (because there is a conversion from foo to bar and from bar to foo and not vice-versa).
But how would the method know this null comes from Bar and not Foo?
does null contain some information about the object which is assigned to?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

撩动你心 2025-01-04 02:22:49

它总是假的。 Javac 知道。

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

It is always false. Javac Knows it.

But you can use f.someStaticFunctionOfTheClassFoo(). So, your question is very interesting, only it needs to be edited.

心是晴朗的。 2025-01-04 02:22:49

你是什​​么意思

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

null 既不是 Bar 也不是 Foo。请参阅带有 null 参数的 Java 方法调度

What do you mean by

How java knows that this null is Bar and not Foo?

null is neither Bar nor Foo. See Java method dispatch with null argument

我三岁 2025-01-04 02:22:49

空引用是类的实例吗?

让我们明确一下这一点。引用不是任何事物的实例。这是一个参考。它引用的对象(如果有的话)是某个类的实例。但空引用不引用任何对象。

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

事实并非如此。你的程序欺骗了你。如果引用引用 Foo 的实例,它会打印“Bar”。您的编码不当。

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

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

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

事实并非如此。它猜到了。它弄错了。

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

它根本不包含任何信息。

Is a null reference an instance of a class?

Let's be clear about this. A reference isn't an instance of anything. It is a reference. The object it refers to, if any, is an instance of some class. But the null reference doesn't refer to any object.

My question is: How Java knows that the passed null is Bar and not Foo?

It doesn't. Your program lied to you. It prints "Bar" if the reference doesn't refer to an instance of Foo. Poor coding on your part.

I know why the compiler chooses Bar and not Foo (because there is a conversion from foo to bar and from bar to foo and not vice-versa).

The compiler didn't mkae any such choice. Your code did a poorly designed test and print.

But how would the method know this null comes from Bar and not Foo?

It doesn't. It guessed. It got it wrong.

does null contain some information about the object which is assigned to?

It contains no information at all.

涫野音 2025-01-04 02:22:49

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

null is a special type and that special type is "NullType".

兲鉂ぱ嘚淚 2025-01-04 02:22:48

你读错了。对于 null 引用,instanceof 始终 计算结果为 false

来自 Java 规范(重点是我的):

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

You're reading it the wrong way. instanceof always evaluates to false for null references.

From the Java specification (emphasis mine):

At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast (§15.16) to the ReferenceType without raising a ClassCastException. Otherwise the result is false.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文