Java取消引用是如何工作的



我需要弄清楚Java引用(指针)。我读过这篇文章(Scott Stanchfield的《Java is Pass by Value,Dammit!》),这是关于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分配给bFoo引用的对象的a字段。aBar.aFoo也引用了此对象。

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

最新更新