在java对象中更改值
我在Java中有两个对象,person1和person2。代码中有一个事件按钮,我说person2=person1,然后我需要在不更改person2的情况下更改person1的年龄在java对象中更改值,java,Java,我在Java中有两个对象,person1和person2。代码中有一个事件按钮,我说person2=person1,然后我需要在不更改person2的情况下更改person1的年龄 Person objperson1 = new Person(); objperson1.setAge(30); Person objperson2 = new Person(); objperson2 = objperson1; objperson1.setAge(40); System.out.println(o
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
objperson1
和objperson2
是指向同一个人对象的两个参考变量
如果您想要一份objperson1
的副本,您可以使用:
Person objperson2 = (Person) objperson1.clone();
我认为这源于对Java中发生的事情的误解。当你说
objperson2=objperson1
,您告诉它指定名称objperson2
以指向objperson1
正在引用的对象。所以这就像给同一个东西取了另一个名字。换句话说,假设你的名字(objperson1
)是帕特里克。如果我说“从现在起我要叫你帕特”(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();
试试这个:
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();
}
}
年份代码:
objperson2 = objperson1;
表示objperson2
变量现在在objperson1
对象上有链接。在本例中,您需要复制objperson1
并将其应用于objperson2
变量。您可以这样做:
objperson2 = objperson1.clone();
Person alan = new Person(30);
Person boris = new Person(30);
boris.setAge(40);
但请记住,您必须为自定义对象实现克隆机制。例如:
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;
}
}
使用:
您也可以使用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());
Person objperson1=newperson();
对象1.设置(30);
Person objperson 2=新的Person();
objperson2.setAge(objperson1.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
实际上克隆了它或其他东西
如前所述,有一种方法可以克隆对象
然而,问题是是否必须克隆两个对象。您可以创建两个如下所示的对象:
objperson2 = objperson1.clone();
Person alan = new Person(30);
Person boris = new Person(30);
boris.setAge(40);
PS:使用clone()
并实现Cloneable
接口是。因为变量类型是一个对象变量,您的目标是仅更改变量的参数,objperson2=objperson1代码>是一个错误的代码。如果这不是您需要解决的必选程序代码,我建议删除这行代码,然后通过
objperson2.setAge(objperson1.getAge());
objperson1.setAge(parameter);
如果objperson2=objperson1
是一个必备行,那么在不更改另一个参数的情况下,无法更改一个参数。在我的代码中,objperson1
和objperson2
实际上是相同的,因为它们的参数相同,但仍然可以更改。否则,应使用克隆。尝试克隆对象objperson2=objperson1代码>-现在您不再有两个对象,而只有一个。实现可克隆接口或一个像样的副本,而不是分配。但第一步:质疑你的逻辑:“我说person2=person1,那么我需要在不改变person2的情况下改变person1的年龄。”这有什么意义呢?@Lokesh可能,但对逻辑有一个良好的掌握和理解是能够开始编程的必要条件,因为他已经在这样做了。。如果我认为问题在于他的OO技能,我会质疑为一个人存储“年龄”的用途