我不明白这个 Java 示例中的代码行"temp.next = this;"

  • 本文关键字:代码 temp next this 明白 Java java
  • 更新时间 :
  • 英文 :


我试图理解 Java 中关键字"this"的使用,最终在理解第 17、18、22 和 25 行时遇到了麻烦:

1.public class LinkMeUp
2.{
3.    private int data;
4.    private LinkMeUp next;
5.    
6.    LinkMeUp(int num)
7.    {
8.         data = num * num; next = null;
9.    }
10.    LinkMeUp()
11.    {
12.        this(0);
13.    }
14.    LinkMeUp add(int num)
15.    {
16.        LinkMeUp temp = new LinkMeUp(num);
17.        temp.next = this;
18.        return(temp);
19.    }
20.    void print()
21.    {
22.        LinkMeUp temp = this;
23.        while(temp != null)
24.        {
25.             System.out.println(temp.data);
26.             temp = temp.next;
27.        }
28.    }
29.    public static void main(String[] args)
30.    {
31.        LinkMeUp link = new LinkMeUp();
32.        for(int k =1; k < 10; k++)
33.             link = link.add(k);
34.        link.print();
35.    }
36.}

我了解在main方法中,创建了LinkMeUp对象并分配了要链接的内存地址。然后它将转到默认构造函数 LinkMeUp()。

默认构造函数中的代码行 this(0) 将调用另一个构造函数 LinkMeUp(int num) 并设置数据 = 0 * 0 = 0 和 next = null。

然后它回到 main 方法进入循环,将第一个 k = 1 传递给 add(int num) 方法。在 add(int num) 方法中,它创建另一个 LinkMeUp 对象并分配给引用 temp。

我不明白 temp.next = 这个;"this"是指LinkMeUp类还是LinkMeUp(int num)?我不明白 temp.next,因为"next"不是一个辅助方法,而是对 LinkMeUp 对象的另一个引用,它在 LinkMeUp(int num) 构造函数中被分配给 null。

我也难以理解第 22 行和第 25 行

顺便说一下,这是程序的输出

81
64
49
36
25
16
9
4
1
0

我不明白 temp.next = 这个;"this"是指LinkMeUp类还是LinkMeUp(int num)?

也不。该行位于add方法中,因此this是对当前LinkMeUp实例的引用,而不是构造函数。(即使在构造函数中,因为它没有被调用 - 例如,this() - 它也不会调用构造函数。LinkMeUp.add通过LinkMeUp(num)创建一个新的LinkMeUp实例,将其next成员设置为this,并返回它。因此,现在当前实例(在其上调用add)是add创建的新实例上的next,该实例被返回。

main的循环中,我们看到add创建的实例被保留了:

link = link.add(k);

这就是链的创建方式。

让我们遵循逻辑:

1.main使用 no-parameters 构造函数创建一个LinkMeUp实例,因此我们有一个实例,其data0

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− 链接−−−−−−−>| 链接 |  +−−−−−−−−−−−−+  |数据: 0 |  |下一篇: 空 |  +−−

−−−−−−−−−−−−−−−−+2.然后我们带着k == 1进入循环并调用link = link.add(k);.add调用new LinkMeUp(1),创建一个新实例并将其data设置为1,将该新实例的next设置为当前实例,并返回它;link = link.add(k);行更新link,因此毕竟我们拥有:

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−− 链接−−−−−−−>| 链接 |  +−−−−−−−−−−−−+  |数据: 1 |    +−−−−−−−−−−−−+  |下一页 |−−−−>| 链接 |  +−−−−−−−−−−−−+     +−−−−−−−−−−−−+ |数据: 0 | |下一篇: 空 | +−−−−

−−−−−−−−−−−−+注意第一个实例(data === 0)现在位于链的末尾,link指的是add返回的新实例(data === 1)。

3. 然后循环继续k == 2并再次调用link = link.add(k);,这将创建并返回一个带有data == 4(2 * 2) 的新实例。之后,我们有:

+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
−−          链接−−−−−−−>| 链接 |           +−−−−−−−−−−−−+           |数据: 4 |    +−−−−−−−−−−−−+                         |下一页 |−−−−>| 链接 |                         +−−−−−−−−−−−−+     +−−−−−−−−−−−−+                        |数据: 1 |    +−−−−−−−−−−−−+     |下一页 |−−−−>| 链接 |     +−−−−−−−−−−−−+     +−−−−−−−−−−−−+      |数据: 0 |  |下一篇: 空 |  +

−−−−−−−−−−−−−+...依此类推,直到k == 9之后.

我也难以理解第 22 行和第 25 行

第 22 行:

LinkMeUp temp = this;

。将变量temp设置为当前实例(add(k)9k时创建的实例)。然后,当该变量!= null时,我们循环,输出temp.data。所以第一个循环,它将输出81(当k == 9时通过add(k)创建的实例上的data)。然后是第 26 行:

temp = temp.next;

。将我们带到链中的下一个条目,即add(k)8k时创建的实例。我们输出其data值 (64)。然后我们继续循环,直到我们到达链的末端,temp == null.

在第 17 行和第 22 行,"temp.next = this",LinkMeUp temp = this。 您正在对某个已创建的对象调用 print() 和 add()。因此,当您在这些方法中引用"this"时,它只是意味着您指的是该方法的对象(在任何方法中使用时,"this"是指它自己的对象)。

相关内容

最新更新