2017-10-13 42 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