Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OOP/JAVA:将一个对象分配给另一个对象是否也会更改其属性(类变量)?_Java_Oop_Object_Pass By Reference - Fatal编程技术网

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
和object
B
都有一个属性
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给了你一个很好的观点,说明了它为什么不能正常工作,这是正确的