在java对象中更改值

在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

我在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(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技能,我会质疑为一个人存储“年龄”的用途