不明白参考文献

时间:2015-05-23 23:29:41

标签: java pointers reference

我只是不明白为什么t.getName()是keen,如果t被分配给你。

public class StringProgram{
  public static void main(String[] args) {


    Person t = new Person("Gene");
    Person u = t;
    u.setName("Keen");

    System.out.println(t.getName());//Keen
    System.out.println(t.equals(u));//true


  }
}

人类

public class Person{
    private String name;

    public Person(String d){
    name=d;
    }
    public void setName(String a){
      name=a;
    }

    public String getName(){
      return name;
    }

     @Override
    public boolean equals(Object o) {
        if (!(o instanceof Person)) {
            return false;
        }

        return ((Person) o).name.equals(this.name);
    }
}

4 个答案:

答案 0 :(得分:2)

我也有点新鲜,但我认为这就是为什么它会打印“Keen”。 这将涉及到java对象的使用

首先,Person t=new Person("Gene")创建一个名为变量“Gene”的人物对象。然后,它使用引用(在您的情况下为t)来引用该对象。所以t将始终引用该Person对象。

然后,使用下一行Person u=t,您将创建一个新引用,该引用实际上引用与“Gene”相同的Person对象作为原始t引用。使用=符号使它们做同样的事情,参考“Gene”,就像Java中的数学运算相等使得左手等于右手。

因此,无论您使用u还是t来引用“基因”对象,您指的是同一件事。因此,在u.setName("Keen")t.setName("Keen")中,您将在内存中的某个位置找到相同的对象并对其执行某些操作,在这种情况下,将name变量更改为“Keen”。

答案 1 :(得分:1)

它与上面评论中提到的user4932934完全一样。 注意这一行:

Person t = new Person("Gene");

使用“new”关键字 - 它告诉您创建了新对象。 行:

Person u = t;

简单地将“t”分配给“u”。现在它们引用内存中的同一个对象,没有创建Person的新实例。

答案 2 :(得分:1)

<Event> <System> <Provider Name="Windows Azure Runtime 2.5.0.0"/> <EventID>1013</EventID> <Level>0</Level> <Task>0</Task> <Keywords>Keywords</Keywords> <TimeCreated SystemTime="2015-05-06T07:07:35Z"/> <EventRecordID>976923406</EventRecordID> <Channel>Application</Channel> <Computer>RD000XXXXXE</Computer> <Security/> </System> <EventData> <Data>4008</Data> <Data>w3wp</Data> <Data>Role environment . INITIALIZING</Data> </EventData> </Event> <Event> <System> <Provider Name="Windows Azure Runtime 2.5.0.0"/> <EventID>1013</EventID> <Level>0</Level> <Task>0</Task> <Keywords>Keywords</Keywords> <TimeCreated SystemTime="2015-05-06T07:07:36Z"/> <EventRecordID>976923937</EventRecordID> <Channel>Application</Channel> <Computer>RD000XXXXXE</Computer> <Security/> </System> <EventData> <Data>4008</Data> <Data>w3wp</Data> <Data>Role environment . INITIALED RETURNED. HResult=-2147024891</Data> </EventData> </Event> <Event> <System> <Provider Name="Windows Azure Runtime 2.5.0.0"/> <EventID>1015</EventID> <Level>3</Level> <Task>0</Task> <Keywords>Keywords</Keywords> <TimeCreated SystemTime="2015-05-06T07:07:36Z"/> <EventRecordID>976924062</EventRecordID> <Channel>Application</Channel> <Computer>RD000XXXXXE</Computer> <Security/> </System> <EventData> <Data>4008</Data> <Data>w3wp</Data> <Data>Role environment . FAILED TO INITIALIZE. hr: -2147024891</Data> </EventData> </Event> 使Person u = t;引用与u完全相同的对象。相同的内存位置,如果有帮助的话。因此,更改t的内容也会更改t的内容。因为它们是同一个对象。

答案 3 :(得分:1)

我将与您分享关于我曾经读过的参考文献的隐喻。

想象一下你的Person对象是气球。您的引用t是附加到气球的字符串(rope,而不是java String)。

因此,当您创建另一个与 t 相同的参考 u 时,您创建了另一个附加到同一个气球(人物)的字符串(绳索)。< / p>

如果您更改了气球的属性,例如颜色,u和t都会看到这种变化,因为你只有一个气球连接到u和t。

因此,当您将引用分配给另一个引用时,您不会创建新对象。