2017-10-13 123 views
-2

我在Java,person1和person2中有2个对象。通过代码中的事件按钮,我说person2 = person1,那么我需要在不更改person2的情况下更改person 1的年龄。更改对象java中的值

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 
+2

尝试克隆对象 –

+1

'objperson2 = objperson1;' - 现在你不再有两个对象,但只有一个。 –

+0

实现可复制的界面 – Lokesh

回答

1

试试这个:

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

objperson1和objperson2是指向同一个Person对象的两个引用变量。

如果你想的objperson1你可以使用一个副本:

Person objperson2 = (Person) objperson1.clone(); 
1

我想从刚刚发生在Java中的误解源于此。当您说objperson2 = objperson1;时,您告诉它将名称objperson2指向objperson1所引用的对象。所以就像给另一个名字分配同一个东西一样。换句话说,假设你的名字(objperson1)是Patrick。如果我说:“我打算从现在开始给你打个电话”(objperson2=objperson1),然后我说“帕特,把盐递给我”,我希望你能把盐递给我,因为这两个名字都指向你。所以你需要用两个不同的名字创建两个不同的对象(比如有两个不同的人)。

要做这样一个副本,你会看到预先形成一个“深层复制”。问题应该是:“这对你来说真的有必要吗?”需要这样做的情况相对较少,因此我会质疑您的实施情况,并重新考虑您如何编码问题。

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(); 
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()); 
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()); 

在这种情况下,你只得到了价值和保存两个对象的独立性。

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); 

这里的误解是什么propably你认为var1 = var2实际上克隆是什么。

有一种方法克隆你的对象,如this answer所述。

但问题是你是否需要克隆两个对象。你可以创建两个对象是这样的:

Person alan = new Person(30); 
Person boris = new Person(30); 

boris.setAge(40); 

PS:使用clone()和实施Cloneable接口为discouraged in Effective Java