我有两个Java对象,person1和person2。使用代码中的事件按钮我说person2 = person1,然后我需要更改person 1的年龄而不更改person2。
Person objperson1 = new Person();
objperson1.setAge(30);
Person objperson2 = new Person();
objperson2 = objperson1;
objperson1.setAge(40);
System.out.println(objperson2.getAge()); //console print 40. I need it print 30
答案 0 :(得分:3)
试试这个:
public class Demo {
public static void main(String args[]) throws CloneNotSupportedException{
Person p1=new Person();
p1.setAge(30);
Person p2 = (Person) p1.clone();
p1.setAge(40);
System.out.println(p2.getAge());//30
}
}
class Person implements Cloneable{
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return (Person)super.clone();
}
}
答案 1 :(得分:1)
objperson1和objperson2是指向同一Person对象的两个引用变量。
如果您需要objperson1的副本,可以使用:
Person objperson2 = (Person) objperson1.clone();
答案 2 :(得分:1)
我认为这源于对Java中发生的事情的误解。当您说objperson2 = objperson1;
时,您告诉它指定名称objperson2
以指向objperson1
引用的对象。所以它就像给同一个东西分配另一个名字一样。换句话说,让我们说你的名字(objperson1
)是帕特里克。如果我说"我将从现在起打电话给你Pat" (objperson2=objperson1
),然后我说" Pat,把盐传给我#34;我希望你把盐递给我,因为两个名字都指向你。所以你需要创建两个不同的对象(比如有两个不同的人),它们有两个不同的名字。
要做这样的副本,你一直在寻找一个"深拷贝"。问题应该是,"这对你来说真的有必要吗?"这样做比较少见,因此我会质疑您的实施并重新考虑您是如何编码问题的。
答案 3 :(得分:0)
实现克隆到您的对象
public class Person implements Cloneable{
private String age;
public Person(){
}
public void setStr(String age){
this.age = age;
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
克隆对象
Person per = new Person();
Person delTemp = (Person ) per.clone();
答案 4 :(得分:0)
年份代码:
objperson2 = objperson1;
表示objperson2
变量现在在objperson1
对象上有链接。在您的情况下,您需要复制objperson1
并将其应用于objperson2
变量。你可以这样做:
objperson2 = objperson1.clone();
但请记住,您必须为自定义对象实现克隆机制。例如:
public class Person implements Cloneable {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public Person clone() throws CloneNotSupportedException {
Person copy = new Person();
copy.age = this.age; // (example deep clone for custom properties) or just use Person copy = super.clone();
return copy;
}
}
使用:
Person objperson1 = new Person();
objperson1.setAge(30);
Person objperson2 = objperson1.clone();
objperson1.setAge(40);
System.out.println(objperson2.getAge());
答案 5 :(得分:0)
您可以使用bean方法:
Person objperson1 = new Person();
objperson1.setAge(30);
Person objperson2 = new Person();
objperson2.setAge(objperson1.getAge()); // <= With the getter and setter method
objperson1.setAge(40);
System.out.println(objperson2.getAge());
在这种情况下,您只能获得值并保存两个对象的独立性。
答案 6 :(得分:0)
让我们看看Java中会发生什么。
// Create a new Person object
// and let the variable objperson1 refer to it
Person objperson1 = new Person();
// Call the method setAge(int) on the object previously created
objperson1.setAge(30);
// Create another Person object
// and let the variable objperson2 refer to it
Person objperson2 = new Person();
// Let the variable objperson2 refer to the object objperson1
// is referring to.
// The reference to the Person objperson2 was referring to
// HAS NO LONGER A REFERENCE TO IT. You can never reach that object again.
objperson2 = objperson1;
// Setting the age on objperson1 reflects a change in objperson2, because
// they refer to the very same object
objperson1.setAge(40);
这里的误解可能是你认为var1 = var2
实际克隆它或什么的。
有一种克隆对象的方法,如this answer所述。
然而,问题是你是否必须克隆两个对象。您可以像这样创建两个对象:
Person alan = new Person(30);
Person boris = new Person(30);
boris.setAge(40);
PS:使用clone()
并实施Cloneable
界面为discouraged in Effective Java。
答案 7 :(得分:0)
由于你的变量类型是一个对象变量,你的目标是改变变量&#39;仅参数,objperson2 = objperson1;
是一个错误的代码。如果它不是您需要解决的必须程序代码,我建议删除该行代码,然后通过
objperson2.setAge(objperson1.getAge());
objperson1.setAge(parameter);
如果objperson2= objperson1;
是必备行,则无法在不更改其他参数的情况下更改一个参数。在我的代码中,objperson1和objectperson2实际上是相同的,因为它们的参数是相同的,但仍然是可变的。否则,您应该使用克隆。