在此代码中
为什么打印>> 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);
}
}
答案 0 :(得分:3)
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
对象。因此,当p
将test
更改为doIt
时,它会修改您拥有的唯一number
个对象。答案 1 :(得分:0)
原始数据类型(如整数)基于值而不是数据引用。通过在方法中设置x=0
,不会将测试方法中的x值设置为0,因为当x传递给doIt
时,它仅仅是按值。因此,不会记录您在方法中执行的任何操作。您必须传递一个对象,例如Person
,以便进行更改。