我需要对Java引用(指针)进行一些说明。
我已经阅读了(Java is Pass-by-Value, Dammit! by Scott Stanchfield)关于Java传递变量的出色方法的文章。据我了解,一切都是作为内存指针传递的。

public class foo{
    int a;
    int b;

    public foo(a, b){
       this.a = a;
       this.b = b;
    }
}


所以在这样的一些代码中:

foo aFoo = new foo(1,2); //new foo created at adress 0x40 for instance
someFunc(aFoo);


someFunc的参数实际上是数字0x40(尽管这可能是一种简化,但要了解模式)。

现在,假设我创建了另一个类

public class bar{
    foo aFoo;

    public bar(){
       this.aFoo = new foo(1,2);
    }
}


并实例化以下变量

bar aBar = new bar();
foo bFoo = new foo(3,4);


现在假设我想将aBar.aFoo的值复制到bFoo

bFoo = aBar.aFoo;


如果我现在做

bFoo.a = 1234;


我是否也只是将aBar.aFoo.a更改为1234还是该变量仍保留值1

按照我自己的逻辑,bFoo.a只是一个指针,因此分配新变量应该同时更改两个位置,但这似乎是不正确的。因此,我想我还没有完全理解Java的“引用实际上是一个指针”概念。或者更确切地说,我可能了解它的指针部分,但不了解指针的取消引用,因为与您一直知道的C语言相比,它是隐式完成的。

最佳答案

bFoo = aBar.aFoo;


->您已将aBar.aFoo引用分配给bFoo局部变量。之所以称为别名,是因为现在您有两种引用同一对象的方式:bFooaBar.aFoo

bFoo.a = 1234;


->您已将1234分配给a引用的对象的bFoo字段。该对象也由aBar.aFoo引用。

结果:您已更改aBar.aFoo.a的值。

10-06 12:42
查看更多