java中的正向引用类型

java中的正向引用类型,java,compiler-construction,typechecking,Java,Compiler Construction,Typechecking,在java中,您不能这样做 Object x = y; Object y = null; 但是你可以这样做: class A { B bref = null; } class B {} 为什么会这样? 有人能解释一下,在第二种情况下,编译器如何知道B?在第一种情况下,您没有在x之前声明引用y。因此,编译器不知道y代表什么。在第二种情况下,您有一个类型为B的对null的引用,因此它是可以的。如果不将其设置为null,那么它仍然是相同的,因为实例成员对象默认设置为null。这是合成的一个例子。在

在java中,您不能这样做

Object x = y;
Object y = null;
但是你可以这样做:

class A { B bref = null; }
class B {}
为什么会这样?
有人能解释一下,在第二种情况下,编译器如何知道
B

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

在第一块:

Object x = y;
Object y = null;
首先声明
x
等于
y
,只有当且仅当声明了
y
时,才会编译此项。
在第二行中,您将
对象y
声明为
null
,只有在
y
之前未声明的情况下,它才会编译

因此,您的第一条语句永远无法编译,也毫无意义

现在进入第二个街区:

class A { B bref = null; }
class B {}
在这里,您创建了一个包私有类
a
,它有一个类
B
的变量作为包私有成员(无论
B
是什么,只要源文件中存在
B
),即初始化时为
null
。该类还有一个公共构造函数,它不做任何必要的事情。
然后创建一个包私有类
B
,它只有公共构造函数

您在代码中不做任何其他操作,所有内容都是完全有效的Java

您可以做您正在做的事情,因为这都是有效的Java语法。

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

您可以对类似链表的结构
类a{a aref=null;}
问同样的问题。不,这是错误的。当编译器类型检查
A
声明块时,它会将
B
视为一个它不知道的新类型。不管我把它设置成什么,这不可能,这是一个编译好的代码示例:
code
public class TestClass{}class A{B ref=null;}class B{}
code
我没有说代码不会编译。我所说的是你的解释是错误的。我想我理解你所说的。我认为在compile类型中,类路径中包含的所有类都使用完全限定名进行检查,因此不会发生类命名冲突。如果没有导入,并且类位于同一个java文件中,那么应该识别它们,就像内部类一样。