0

解释:

public class SomeClass {
  int aNumber = 0;

  public void changeNumber(int number){
    aNumber = number;
  }

  public int getNumber(){
    return aNumber;
  }
} 


public class Testapp {

  public static void main(String[] args) {
    NewClass object1 = new NewClass();
    NewClass object2 = object1;

    object1.changeNumber(5);
    object2.changeNumber(2);
    System.out.println("object1: "+object1.getNumber());
    System.out.println("object2: "+object2.getNumber());
  }
}

这将输出:object1:2 object2:2

我如何让它输出:object1:5 object2:2

4

6 回答 6

5

你有两个选择:

1)实现一个复制构造函数:

public SomeClass(SomeClass c) {
  this.aNumber = c.aNumber;
}

然后创建一个副本:

SomeClass object2 = new SomeClass(object1);

2)实现Cloneable接口并覆盖Object.clone():

public class SomeClass implements Cloneable {
  public SomeClass clone() {
    super.clone();
  }
}

然后创建一个副本:

SomeClass object2 = object1.clone();

注意:我省略了任何不变的代码。

于 2012-07-26T18:28:08.707 回答
1

您不是在复制对象,而是在复制引用。这意味着两个变量都引用同一个对象。

要创建对象,您必须使用new或调用使用它的方法。

既然你想要一个副本,你应该让你的对象实现Cloneable(如果需要,实现clone())。

于 2012-07-26T18:25:39.157 回答
1

你现在的设置方式是两者object1object2指向内存中的同一个位置。你必须这样做:

NewClass object1 = new NewClass();
NewClass object2 = new NewClass();
object1.changeNumber(5);
object2.changeNumber(2);
System.out.println("object1: "+object1.getNumber());
System.out.println("object2: "+object2.getNumber());

这样,object1object2是完全独立的对象。

于 2012-07-26T18:26:32.447 回答
0
 public class Testapp {
public static void main(String[] args) {
 NewClass object1 = new NewClass();
 NewClass object2 = new NewClass();
  object1.changeNumber(5);
 object2.changeNumber(2);
 System.out.println("object1: "+object1.getNumber());
 System.out.println("object2: "+object2.getNumber());   } } 

您应该调用对象的新实例化,否则它们会引用内存中的相同位置。

于 2012-07-26T18:26:03.960 回答
0

1.复制了引用而不是对象。

2.由于两个对象引用变量都指向堆上的同一个对象,所以你得到 2 作为它们的答案。

3.使用new 运算符创建另一个对象并将其分配给 object2 引用。

还有一件事......它不是NewClass,而是您的代码中提到的SomeClass

SomeClass object1 = new SomeClass();
SomeClass object2 = new SomeClass();
object1.changeNumber(5);
object2.changeNumber(2);
System.out.println("object1: "+object1.getNumber());
System.out.println("object2: "+object2.getNumber());
于 2012-07-26T18:31:07.460 回答
0

对象是类的一个实例并且能够保持状态。对象是使用new运算符创建的 - 在您的情况下,对象是在new NewClass()

NewClass object1并且NewClass object2是对象引用变量 - 这些就像 C/C++ 中的指针。引用变量不保存状态——它们只是指向对象状态所在的内存位置。

当您说NewClass object1 = new NewClass()-new运算符创建 NewClass 的实例并返回存储在object1引用变量中的内存位置。当你说NewClass object2 = object1- 保存的内存位置详细信息object1被复制到object2- 这里要注意的重要一点是没有创建新对象。只有一个对象,因此只有一个状态 - 这就是为什么当您使用object1object2引用变量更改状态时,先前的值会被覆盖。

如果你想要两个对象,那么你需要调用new两次——这将为每个对象分配单独的内存位置。如果您有一个对象并且想要对象的类似副本 - 将其状态复制到新的内存位置 - 那么您需要使用类的clone()方法Object。克隆创建一个新对象并将对象的当前状态复制到新对象 - 因此,如果您调用NewClass object2 = object1.clone()它将创建新对象并将 object1 的状态复制到该对象,则返回对的引用object2- 这里object2也称为本地副本。您需要遵循 java 规范进行克隆 - 即您需要实现Cloneable接口以支持对象克隆 - 请参考此链接以http://en.wikipedia.org/wiki/Clone_(Java_method )开头

于 2012-07-26T18:42:18.663 回答