Java更改对象属性值
在此代码中Java更改对象属性值,java,Java,在此代码中 为什么打印>>0 8而不是>>5 8。 方法doIt()更改已分配的人数p,但int x已分配且在doIt()中未更改。 有人能给我一个理论上的解释吗?我正在努力理解它是如何工作的。 谢谢 诸如int之类的原语是通过值传递的,因此您在test中的x永远不会被修改;总是0。只有doIt中的本地副本x更改为5,但当方法doIt结束时,该值消失 程序中有两个x变量: 测试中的x:初始化为0且从未更改 doIt中的x:初始化为0,更改为5,从未使用过 对Person对象的引用是通过值传
为什么打印>>0 8而不是>>5 8。 方法
doIt()
更改已分配的人数p,但int x已分配且在doIt()
中未更改。
有人能给我一个理论上的解释吗?我正在努力理解它是如何工作的。
谢谢
诸如int
之类的原语是通过值传递的,因此您在test
中的x
永远不会被修改;总是0。只有doIt
中的本地副本x
更改为5
,但当方法doIt
结束时,该值消失
程序中有两个x
变量:
测试中的
:初始化为0且从未更改x
中的doIt
:初始化为0,更改为5,从未使用过x
Person
对象的引用是通过值传递的,但是doIt
会修改原始对象中的number
,因此它会更改为8
程序中有两个p
变量:
中的test
:初始化为新的p
对象<代码>编号初始化为0Person
中的doIt
:它指的是与p
中的test
相同的p
对象。因此,当Person
将doIt
更改为number
时,它会修改您拥有的唯一的5
对象Person
int
之类的原语是通过值传递的,因此您在test
中的x
永远不会被修改;总是0。只有doIt
中的本地副本x
更改为5
,但当方法doIt
结束时,该值消失
程序中有两个x
变量:
测试中的
:初始化为0且从未更改x
中的doIt
:初始化为0,更改为5,从未使用过x
Person
对象的引用是通过值传递的,但是doIt
会修改原始对象中的number
,因此它会更改为8
程序中有两个p
变量:
中的test
:初始化为新的p
对象<代码>编号初始化为0Person
中的doIt
:它指的是与p
中的test
相同的p
对象。因此,当Person
将doIt
更改为number
时,它会修改您拥有的唯一的5
对象Person
x=0
,这不会将测试方法中的x值设置为0,因为当x传递给doIt
时,它只是通过值。因此,在方法中执行的任何操作都不会被记录。您必须传递一个对象,如Person
,才能发生更改。基本数据类型,如整数,是基于值而不是数据引用的。通过在方法中设置x=0
,这不会将测试方法中的x值设置为0,因为当x传递给doIt
时,它只是通过值。因此,在方法中执行的任何操作都不会被记录。您必须传递一个对象,如Person
,才能发生更改。因此在doIt中,x是一个副本,p是真实对象,因为x是基本体,而Person p不是?Close。在doIt
中,x
是test
中x
的副本<代码>p也是一个副本。但它是对对象引用的副本。所以p
变量,在doIt
和test
中,都引用了唯一的Person
对象。太棒了!谢谢!我更习惯C++,在这里我可以指定DePopIs,引用…所以doIx是一个拷贝,P是真实对象,因为X是原始的,P是不是?在doIt
中,x
是test
中x
的副本<代码>p也是一个副本。但它是对对象引用的副本。所以p
变量,在doIt
和test
中,都引用了唯一的Person
对象。太棒了!谢谢!我更习惯C++,在那里我可以指定DopCopy,引用…
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);
}
}