java 中的前向引用类型

问题描述 投票:0回答:2

在java中,你不能这样做

Object x = y;
Object y = null;

但是你可以这样做:

class A { B bref = null; }
class B {}

为什么会这样? 谁能解释一下,在第二种情况下,编译器如何知道

B

java typechecking
2个回答
1
投票

在第一个区块:

Object x = y;
Object y = null;

您首先声明

x
等于
y
,只有当且仅当
y
已声明时才会编译。
在第二行中,您将
Object y
声明为
null
,只有在之前未声明
y
时才会编译。

因此,你的第一个语句永远无法编译并且没有任何意义。

现在进入第二个区块:

class A { B bref = null; }
class B {}

在这里,您创建一个包私有类

A
,它具有类
B
的变量作为包私有成员(无论
B
是什么,只要
B
存在于源文件中),即初始化时
null
。该类还有一个公共构造函数,它不执行任何重要操作。
然后你创建一个包私有类
B
,它只有公共构造函数。

您在代码中无需执行任何其他操作,所有内容都是完全有效的 Java。

您可以做您正在做的事情,因为它都是有效的 Java 语法。
此外,编译器知道

B
,因为它首先编译你的文件,因此所有类都存在并且已知。


-1
投票

在第一种情况下,您没有在 x 之前声明引用 y。因此,编译器不知道 y 代表什么。在第二种情况下,您有一个类型 B 的引用为 null,所以没问题。如果您不设置 null,它仍然会是相同的,因为实例成员对象默认设置为 null。这是一个构图示例。

© www.soinside.com 2019 - 2024. All rights reserved.