OOP/JAVA:将一个对象分配给另一个对象是否也会更改其属性(类变量)?
所以我的问题是,如果一个对象OOP/JAVA:将一个对象分配给另一个对象是否也会更改其属性(类变量)?,java,oop,object,pass-by-reference,Java,Oop,Object,Pass By Reference,所以我的问题是,如果一个对象A有一个属性,比如intvar和objectB都有一个属性int var2这两个对象都是使用相同的构造函数从同一个类实例化的。为了便于说明,假设var=3和var2=0分配对象A=B使A.var==0?请帮我找出你的答案 以下是更多代码,以备您需要: public class CarSize{ public CarSize(int x) { this.var=x; } public void call() {
A
有一个属性,比如intvar
和objectB
都有一个属性int var2
这两个对象都是使用相同的构造函数从同一个类实例化的。为了便于说明,假设var=3
和var2=0
分配对象A=B
使A.var==0
?请帮我找出你的答案
以下是更多代码,以备您需要:
public class CarSize{
public CarSize(int x)
{
this.var=x;
}
public void call()
{
doubleVar(this);
}
private void doubleVar(CarSize cz)
{
int vara= cz.getVar()*2;
CarSize c= new CarSize(vara);
cz=c;
}
public int getVar(){return this.var;}
private int var;
public static void main(String args[])
{
CarSize cz = new CarSize(3);
cz.call();
System.out.println(cz.getVar());
}
}
公告
请大家在尝试向我解释我已经知道的内容之前检查代码,非常感谢您的理解。您可以将一个对象的引用分配给另一个对象,而不能将一个对象分配给另一个对象。在您的情况下,A和B都将引用以前仅由B引用的同一对象。以前由A引用的对象将被垃圾回收器接收并不再存在。您可以将一个对象的引用分配给另一个对象,但不能将一个对象分配给另一个对象。在您的情况下,A和B都将引用以前仅由B引用的同一对象。以前由A引用的对象将被垃圾收集器接收并不再存在。在Java中,对非原语使用
=
操作符会导致别名。如果同一类中有两个不同的对象,a
和b
,表示a=b
使a
成为与b
相同的对象,垃圾收集将最终销毁a
中曾经存在的内容
因此,是的,字段将是相同的,但是更改字段的
a
值也将更改字段的b
,因为a
和b
现在是相同的。在Java中,将=
操作符与非原语一起使用会导致别名。如果同一类中有两个不同的对象,a
和b
,表示a=b
使a
成为与b
相同的对象,垃圾收集将最终销毁a
中曾经存在的内容
因此,是的,字段将是相同的,但是更改字段的
a
值也将更改b
字段的值,因为a
和b
现在是相同的。您的代码不能按预期工作的问题在于这一短代码:
cz=c;
由于CarSize
是一种引用类型,CarSize
的变量存储指向CarSize
对象的“指针”,而不是CarSize
对象本身
当您传递汽车尺寸作为参数时,您传递的是一个“指针”cz=c
使存储在cz
中的指针指向与存储在c
中的指针相同的对象
现在让我们看看如何调用此方法:
doubleVar(this);
此
引用在main方法中声明的cz
。同样,此
指向一个汽车大小的对象。在doubleVar
方法中,您使参数指向另一个对象,但仅使参数指向其他对象<代码>此从未更改,其字段也从未更改
这就是为什么你看不到值加倍的原因
要解决此问题,请不要为参数指定新值。相反,直接更改此。删除该参数,因为它不是必需的
private void doubleVar()
{
this.var *= 2; // you can actually omit "this.", I put it there just to make it clear for you
}
您的代码无法按预期工作的问题在于以下代码的简短部分:
cz=c;
由于CarSize
是一种引用类型,CarSize
的变量存储指向CarSize
对象的“指针”,而不是CarSize
对象本身
当您传递汽车尺寸作为参数时,您传递的是一个“指针”cz=c
使存储在cz
中的指针指向与存储在c
中的指针相同的对象
现在让我们看看如何调用此方法:
doubleVar(this);
此
引用在main方法中声明的cz
。同样,此
指向一个汽车大小的对象。在doubleVar
方法中,您使参数指向另一个对象,但仅使参数指向其他对象<代码>此
从未更改,其字段也从未更改
这就是为什么你看不到值加倍的原因
要解决此问题,请不要为参数指定新值。相反,直接更改此。删除该参数,因为它不是必需的
private void doubleVar()
{
this.var *= 2; // you can actually omit "this.", I put it there just to make it clear for you
}
这是您准确描述的情况代码。这里的输出将是“0”,因为当程序员定义的对象被设置为相同类型的另一个对象时,它会将引用从原始值3覆盖为新值0
这是您准确描述的情况代码。这里的输出是“0”,因为当一个程序员定义的对象被设置为同一类型的另一个对象时,它会覆盖从原始值3到新值0的引用,这个字段将与BB中的字段相同,但它不是,至少我展示的代码是相反的,我的意思是它让我震惊,你期待什么?你的代码将返回6?无法完全理解逻辑。我还建议cz=新的汽车尺寸(vara);没有临时的object@Semant1ka是的,我期待6,感谢上帝,有人在输入注释之前阅读了我的代码。我的逻辑有什么问题,我的意思是,如果A.var=1
和B.var=2
我说A=B
不应该A.var
be=2,因为A
现在指向与B
相同的地址,A
的旧值将被垃圾收集?看来@Sweeper给了你一个很好的观点,说明了它为什么不能正常工作,这是正确的