为什么以下代码的输出没有区别?

时间:2018-07-14 14:20:06

标签: java this

我对Java很陌生,并且与以下代码混淆:

[tableView setContentOffset:CGPointMake(240, 0) animated:FALSE];
[tableView reloadData];

,即使更改了public class NewNode { NewNode next = null; int data; public NewNode(int data) { this.data = data; } public void addToNode(int data){ NewNode n = this; System.out.println(n); NewNode newlyCreated = new NewNode(data); } } 方法如下:

addToNode

n的输出不变。如果 public void addToNode(int data){ NewNode newlyCreated = new NewNode(data); NewNode n = this; System.out.println(n); } 关键字指向对象的当前实例,则在第二种情况下不应将this用作输出。请帮助...。

3 个答案:

答案 0 :(得分:4)

根据doc tutorials

  

在实例方法或构造函数中,this是对当前对象的引用,该对象是正在调用其方法或构造函数的对象。

因此,在两个示例中,this都指向您在{em>上调用addToNode()对象。您在方法内创建对象的事实是无关紧要的。所以:

public void addToNode(int data){
    NewNode n = this;  //Refers to the object this method is called on
    System.out.println(n);
    NewNode newlyCreated = new NewNode(data);  //Creates a random object
}

public void addToNode(int data){
      NewNode newlyCreated = new NewNode(data);  //Creates a random object
      NewNode n = this;   //Refers to the object this method is called on
      System.out.println(n);
}

答案 1 :(得分:3)

this是当前实例,即调用addNode方法的实例。 因此,当您通过NewNode newlyCreated = new NewNode(data);创建新节点时,它只是在本地创建一个新节点。当前实例(即this)保持不变。

如果您执行this.data = data,即更改当前实例的data字段,您的输出将会更改

编辑: 另外,您还需要覆盖toString方法以打印NewNode,否则它将打印默认Object的{​​{1 }}方法

答案 2 :(得分:2)

好的,看一下这段代码。让我尝试给你一个简单的例子。

假设我们有一个这样的类:

class A {
    int data;

    void printData() {
        System.out.println(this.data);
    }
}

然后您创建两个这样的A实例:

A a1 = new A(); a1.data = 10;
A a2 = new A(); a2.data = 12;

因此,现在有两个a1类型的对象a2A

现在让我们在它们上调用printData()方法。你会怎么做?

a1.printData();
a2.printData();

现在看第一个打印调用,它发生在a1对象上。因此,现在控制权进入printData方法,其中this将解析为a1,因此this.data从外部将与a1.data相同。

现在在第二个通话中,是的,您说对了。它是在a2对象上调用的,因此在方法printData中,a2将分配给this

这就是当他们说 this解析为当前对象时的意思。

现在知道了吗?