我目前正在攻读我的Java副学士证书,我有正式的学习课本。在教科书中是以下示例代码。
public class Island {
Island i;
public static void main(String[] args) {
Island i2 = new Island();
Island i3 = new Island();
Island i4 = new Island();
i2.i = i3;
i3.i = i4;
i4.i = i2;
我在这里理解我已经使用引用变量i2,i3和i4初始化了3个Island对象,每个对象指向它们自己的对象。 i2然后被重定向到指向i3和i3指向i4等。我不明白的是需要" i2.i"点运营商,这到底在做什么?是i2 = i3不是同样有效吗?
如果有人有任何好的资源,我可以深入阅读java中点运算符的所有应用程序,这也很有用,谢谢。
答案 0 :(得分:0)
您正在使用与类本身相同类型的实例变量(请参阅第Island i
行)。这意味着,类Island
包含相同类型i
的属性Island
。因此,每个岛屿都与另一个岛屿相连。您对i2.i = i3;
的分配将i2
的实例变量定义为i3
。换句话说:i2
有一个指向i3
的链接。如果您有i3
,则可以获得i2
。
如果您使用了作业i2 = i3
,i2
的引用将覆盖i3
的值。这意味着i2
不再使用,i3
后面的对象也将是i2
后面的同一个对象(相同的对象,2个不同的变量名)。
答案 1 :(得分:0)
请务必注意这里的细节。
您确实创建了三个对象,但这些对象与变量不同。
让我们简单一点:考虑Island x = new Island();
和Island y;
您有两个变量,x
和y
,但只有一个对象。该对象没有名称,但它绑定到变量x
,因此当您说x
时,您将获得该对象。当你说y
时,你什么也得不到(y
为空)。
点访问由其前面的表达式表示的对象。因此x.i
访问绑定到i
的对象的x
成员变量,同样地,y.i
试图访问根本没有对象的成员变量,这会导致抛出异常。
现在很明显,您可以说x.i = x;
将绑定到Island.i
的对象的成员变量x
设置为恰好是同一个对象的值。或者您可以将其设置为其他内容,例如x.i = new Island();
或x.i = y;
。
点不必以变量开头,任何表达式都可以。例如,您可以说(new Island()).i = x;
创建一个新对象(它也没有名称;对象永远不会有名称)并将该对象的i
成员绑定到绑定到{{ 1}}。由于此对象永远不会绑定到任何变量,因此它立即有资格进行收集。
代码示例的要点是所有对象都绑定到超出x
,i1
和i2
范围的变量(即三个成员变量)对象),因此它们形成参考周期。关于垃圾收集主题的一个有趣问题是这三个对象是否有资格收集。