Java解除引用如何工作?

时间:2014-10-21 13:51:21

标签: java pointers pass-by-reference pass-by-value

我需要对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" s"引用实际上是一个指针"概念。或者更确切地说,我可能理解它的指针部分,但不能解释指针的解除引用,因为与你总是知道的C相比,它是隐式完成的。

1 个答案:

答案 0 :(得分:4)

bFoo = aBar.aFoo;

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

bFoo.a = 1234;

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

结果:您更改了aBar.aFoo.a

的值