我需要对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
局部变量。之所以称为别名,是因为现在您有两种引用同一对象的方式:bFoo
和aBar.aFoo
。bFoo.a = 1234;
->您已将1234分配给
a
引用的对象的bFoo
字段。该对象也由aBar.aFoo
引用。结果:您已更改
aBar.aFoo.a
的值。