我不理解代码行" temp.next = this;"在这个Java示例中

时间:2017-01-02 07:02:17

标签: java

我试图了解关键字的使用情况"这个"在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

2 个答案:

答案 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的实例,因此我们有一个data0的实例:

           +−−−−−−−−−−−−+
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指的是adddata === 1)返回的新实例。

3。然后循环继续k == 2并再次调用link = link.add(k);,这将创建并返回一个data == 42 * 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时输出dataadd(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)。