簡體   English   中英

更改對象 java 中的值

[英]Change values in object java

我在 Java 中有 2 個對象,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

試試這個:

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

objperson1objperson2是指向同一個 Person 對象的兩個引用變量。

如果您想要objperson1的副本,您可以使用:

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

我認為這源於對 Java 中發生的事情的誤解。 當你說objperson2 = objperson1; ,您告訴它分配名稱objperson2以指向objperson1所引用的對象。 因此,這就像為同一事物分配另一個名稱。 換句話說,假設您的名字 ( objperson1 ) 是 Patrick。 如果我說“從現在開始我要叫你帕特”( objperson2=objperson1 ),然后我說“帕特,把鹽遞給我”,我希望你把鹽遞給我,因為這兩個名字都指向你。 所以你需要用兩個不同的名字創建兩個不同的對象(比如有兩個不同的人)。

要進行這樣的復制,您需要考慮執行“深度復制”。 問題應該是,“你真的有必要這樣做嗎?” 需要這樣做的情況相對較少,因此我會質疑您的實現並重新考慮您如何編碼問題。

實現克隆到您的對象

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

年份代碼:

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

您也可以使用您的 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());

在這種情況下,您只能獲得兩個對象的值並保存獨立性。

讓我們看看在 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:在 Effective Java 中不鼓勵使用clone()和實現Cloneable接口。

由於你的變量類型是一個對象變量,你的目標只是改變變量的參數, objperson2 = objperson1; 是一個糟糕的代碼。 如果它不是您需要解決的必須程序代碼,我建議刪除該行代碼,然后通過

    objperson2.setAge(objperson1.getAge());
    objperson1.setAge(parameter);

如果objperson2 = objperson1; 是必備的一行,那么就沒有辦法在不改變另一個參數的情況下改變一個參數。 在我的代碼中, objperson1objperson2實際上是相同的,因為它們的參數是相同的,但仍然是可變的。 否則,您應該使用克隆。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM