这段代码如何修改传入的对象?

时间:2014-11-17 17:30:05

标签: java

我正在进行Java测验并遇到了这个问题:

class Person {
    static int pid;
    int age;
    String name;

    Person(String s, int i) {
        ++pid;
        name = s;
        age = i;
    }
}

class Test {
    public static void main(String args[]) {
        Person p1 = new Person("John", 22);
        Test te = new Test();
        Person p2 = te.change(p1);
        System.out.println(p2.pid + " " + p2.name + " " + p2.age);
        System.out.print(p1.pid + " " + p1.name + " " + p1.age);
    }

    private Person change(Object o) {
        Person p2 = (Person) o;
        p2.age = 25;
        return p2;
    }
}

答案结果是1 John 25打印了两次,但我对这是怎么回事感到困惑。对象p1的引用值被发送到方法change,但内容似乎被复制到名为p2的新对象中。那么p1实际修改在哪里?

1 个答案:

答案 0 :(得分:2)

Person p1 = new Person("John", 22);
Person p2 = te.change(p1);

现在p1有自己的字段:

p1.age为22,p1.nameJohn

* static变量pid在所有对象之间共享,在此示例中我们并不关心它

现在您在change上致电p2,让我们看看发生了什么:

您按值传递对象p1,它是引用。您将age更改为25,因此原始对象将被更改。现在p1age属性设置为25.

最后是return p2;,它将被分配到p2中的main