Java更改对象属性值

时间:2013-08-05 23:53:37

标签: java

在此代码中 为什么打印>> 0 8而不是>> 5 8。 方法doIt()更改已分配的Person p的数量,但int x已经分配,​​并且未在doIt()中更改。 谁能给我一个理论上的解释?我试图了解它是如何工作的。 感谢。

class Person{
   int number=0;
}

class Student extends Person
{
    int studentNumber;
}

public class Prog{


    public void doIt(int x, Person p)
    {
        x=5;
        p.number=8;
    }

    public static void main(String[] args) {

       Prog p = new Prog();
       p.test();

    }

    public void test()
    {
        int x=0;
        Person p = new Person();
        doIt(x,p);
        System.out.println(x);
        System.out.println(p.number);
    }
} 

2 个答案:

答案 0 :(得分:3)

Java is always pass by value

int等基元按值传递,因此x中的test永远不会被修改;它始终为0.只有x中的本地副本doIt更改为5,但当方法doIt结束时该值会消失。

程序中有两个x变量:

  • x中的test:已初始化为0且从未更改。
  • x中的doIt:初始化为0,更改为5,从未使用过。

Person对象的引用按值传递,但doIt 修改原始对象中的number,因此它更改为{{1 }}

程序中有两个8变量:

  • p中的p:初始化为新的test对象。 Person初始化为0。
  • number中的p:它与<{1}}中的doIt引用相同的 Person对象。因此,当ptest更改为doIt时,它会修改您拥有的唯一number个对象。

答案 1 :(得分:0)

原始数据类型(如整数)基于值而不是数据引用。通过在方法中设置x=0,不会将测试方法中的x值设置为0,因为当x传递给doIt时,它仅仅是按值。因此,不会记录您在方法中执行的任何操作。您必须传递一个对象,例如Person,以便进行更改。