在java中,你不能这样做
Object x = y;
Object y = null;
但你可以这样做:
class A { B bref = null; }
class B {}
为什么会这样?
在第二种情况下,任何人都可以解释编译器如何了解B
?
答案 0 :(得分: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 :(得分:-1)
在第一种情况下,您没有在x之前声明引用y。因此,编译器不知道y代表什么。在第二种情况下,你有一个类型B的引用为null,所以它没问题。如果你没有放置null,它仍然是相同的,因为实例成员对象默认设置为null。这是一个组合的例子。