我只是不明白为什么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);
}
}
答案 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。
因此,当您将引用分配给另一个引用时,您不会创建新对象。