0

在这段代码中
为什么打印 >> 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);
    }
} 
4

2 回答 2

3

Java 总是按值传递

诸如int通过值传递的原语,因此您的xintest永远不会被修改;它始终为 0。只有本地副本更改为,但该值x在方法结束时消失。doIt5doIt

您的程序中有两个x变量:

  • xin :test初始化为 0 并且从未改变。
  • xin :doIt初始化为 0,更改为 5,从未使用过。

对您的Person对象的引用是按值传递的,但doIt number在原始对象中进行修改,因此它会更改为8.

您的程序中有两个p变量:

  • pin test: 初始化为一个新对象Personnumber初始化为 0。
  • pin doIt:它指的是与in相同 Person的对象。因此,当更改为时,它会修改您拥有的唯一一个对象。ptestdoItnumber5Person
于 2013-08-05T23:55:49.500 回答
0

原始数据类型(如整数)基于值而不是数据引用。通过x=0在方法中设置,不会将测试方法中的 x 的值设置为 0,因为当 x 传递给 时doIt,它只是按值。因此,您在该方法中所做的任何事情都不会被记录下来。您必须传递一个对象,例如Person发生更改。

于 2013-08-05T23:56:02.613 回答