我试图了解关键字的使用情况"这个"在Java中,这个例子最终无法理解第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)并设置data = 0 * 0 = 0和next = null。
然后它返回main方法进入循环,将第一个k = 1传递给add(int num)方法。在add(int num)方法中,它创建另一个LinkMeUp对象并分配给引用temp。
我不明白temp.next = this;是&#34;这是&#34;是指LinkMeUp类还是LinkMeUp(int num)?我不了解temp.next,因为&#34; next&#34;不是辅助方法,而是对LinkMeUp对象的另一个引用,它在LinkMeUp(int num)构造函数中赋值为null。
我也很难理解第22行和第25行
顺便说一句,这是程序的输出
81
64
49
36
25
16
9
4
1
0
答案 0 :(得分:3)
我不明白temp.next = this; “this”是指LinkMeUp类还是LinkMeUp(int num)?
都不是。该行位于add
方法中,因此this
是对当前LinkMeUp
实例的引用,而不是构造函数。 (即使在构造函数中,因为它不是调用 - 例如,this()
- 它不会调用构造函数。)LinkMeUp.add
创建LinkMeUp
的新实例通过LinkMeUp(num)
,将其next
成员设置为this
,然后将其返回。所以现在当前的实例(调用了add
)是新实例next
创建的add
,返回。
在main
的循环中,我们看到保留了实例add
所创建的内容:
link = link.add(k);
这就是链条的创建方式。
让我们遵循逻辑:
1。 main
使用no-parameters构造函数创建LinkMeUp
的实例,因此我们有一个data
为0
的实例:
+−−−−−−−−−−−−+ link−−−−−−>| LinkMeUp | +−−−−−−−−−−−−+ | data: 0 | | next: null | +−−−−−−−−−−−−+
2。然后我们使用k == 1
进入循环并调用link = link.add(k);
。 add
调用new LinkMeUp(1)
创建新实例并将其data
设置为1
,将新实例的next
设置为当前实例,然后返回该实例; link = link.add(k);
行更新link
,所以我们拥有:
+−−−−−−−−−−−−+ link−−−−−−>| LinkMeUp | +−−−−−−−−−−−−+ | data: 1 | +−−−−−−−−−−−−+ | next |−−−−>| LinkMeUp | +−−−−−−−−−−−−+ +−−−−−−−−−−−−+ | data: 0 | | next: null | +−−−−−−−−−−−−+
请注意第一个实例(data === 0
)现在位于链的末尾,link
指的是add
(data === 1
)返回的新实例。
3。然后循环继续k == 2
并再次调用link = link.add(k);
,这将创建并返回一个data == 4
(2 * 2
)的新实例。之后我们有:
+−−−−−−−−−−−−+ link−−−−−−>| LinkMeUp | +−−−−−−−−−−−−+ | data: 4 | +−−−−−−−−−−−−+ | next |−−−−>| LinkMeUp | +−−−−−−−−−−−−+ +−−−−−−−−−−−−+ | data: 1 | +−−−−−−−−−−−−+ | next |−−−−>| LinkMeUp | +−−−−−−−−−−−−+ +−−−−−−−−−−−−+ | data: 0 | | next: null | +−−−−−−−−−−−−+
......等等k == 9
之后。
我也很难理解第22行和第25行
第22行:
LinkMeUp temp = this;
...将变量temp
设置为当前实例(当add(k)
为k
时由9
创建的实例)。然后,当该变量为!= null
时,我们循环,输出temp.data
。因此,第一个循环将在81
时输出data
(add(k)
通过k == 9
创建的实例。第26行:
temp = temp.next;
...将我们带到链中的下一个条目,即add(k)
k
8
时由data
创建的实例。我们输出64
值(temp == null
)。然后我们继续循环,直到我们到达链的末尾CREATE VIEW ProductAggregated
AS
SELECT 1 AS ProdTypeId, ProdId AS ProductId, Name AS ProductName -- other product columns may come here
UNION ALL
SELECT 2 AS ProdTypeId, Id AS ProductId, ProdName AS ProductName -- different columns names may be harmonized with aliasing
-- other product types table may be entered here
。
答案 1 :(得分:0)
在第17和22行,“temp.next = this”,LinkMeUp temp = this。 您在创建的某个对象上调用print()和add()。所以当你在这些方法中引用“this”时,它只是意味着你指的是方法的对象(当在任何方法中使用时,“this”指的是它自己的Object)。