如果您引用不同类中的实例化对象,请将更改更新为实际对象或仅更新引用。
public class First {
List<String> numbers;
public First(){
this.numbers.add("one");
this.numbers.add("two");
}
}
public class Second{
First InstanceOfFirst;
public Second(First F){
this.InstanceOfFirst = F;
}
public void printList(){
for(String s : this.InstanceOfFirst.numbers){
System.out.print(i+", ");
}
}
}
public class Third {
First Reference;
public Third(First F){
this.Reference = F;
}
public void Update(){
this.Reference.numbers.add("three");
}
}
所以,让我说我的主要看起来像这样:
public static main(String args[]){
First F = new Frist();
Second sec = new Second(F);
Third th = new Third(F);
th.Update();
sec.printList();
}
我会得到one, two
或one, two, three
。
我想我想问的是:Deos Java在这样引用时会制作不同的对象副本,还是指向同一个对象?
如果我的问题看起来含糊不清,请原谅。
答案 0 :(得分:2)
Java始终使用按值传递,无论是对象引用还是原语或文字。
在你的情况下,你传递First
类对象的引用,现在你将它分配给其他人,它也将指向内存(堆)中的同一个对象,如下面的快照和引用所示它也可以更新被调用方法内对象的状态。
答案 1 :(得分:2)
引用指向堆上的对象。
如果对象是可变的,并且您更改了其状态,那么对该对象的每次引用都会看到更改。
Java不会为您克隆或复制任何内容。如果你真的希望你的对象有自己的副本,你必须创建它。
这只是可变类的问题。像String这样不可改变的人不会受此影响。
public class Person {
private String name;
private Date birthDate;
public Person(String name, Date birthDate) {
this.name = name; // no need to clone; String is immutable
this.birthDate = new Date(birthDate.getTime()); // need to clone, since Date is mutable.
}
}
答案 2 :(得分:0)
你有一个指向同一个对象的引用,因此会产生one, two, three
。通过这种方式传递实例,您可以实现一个基本的单例模式(通过让主类保存这些实例)。
Java是按值传递,但是使用对象传递该对象的引用值。