[英]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();
}
}
objperson1
和objperson2
是指向同一個 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;
是必備的一行,那么就沒有辦法在不改變另一個參數的情況下改變一個參數。 在我的代碼中, objperson1
和objperson2
實際上是相同的,因為它們的參數是相同的,但仍然是可變的。 否則,您應該使用克隆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.