我试图理解 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
实例,因此我们有一个实例,其data
为0
:
−− 链接−−−−−−−>| 链接 | +−−−−−−−−−−−−+ |数据: 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)
在9
k
时创建的实例)。然后,当该变量!= null
时,我们循环,输出temp.data
。所以第一个循环,它将输出81
(当k == 9
时通过add(k)
创建的实例上的data
)。然后是第 26 行:
temp = temp.next;
。将我们带到链中的下一个条目,即add(k)
在8
k
时创建的实例。我们输出其data
值 (64
)。然后我们继续循环,直到我们到达链的末端,temp == null
.
在第 17 行和第 22 行,"temp.next = this",LinkMeUp temp = this。 您正在对某个已创建的对象调用 print() 和 add()。因此,当您在这些方法中引用"this"时,它只是意味着您指的是该方法的对象(在任何方法中使用时,"this"是指它自己的对象)。