Java 解引用如何工作?

mic*_*key 1 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

foo aFoo = new foo(1,2); //new foo created at adress 0x40 for instance
someFunc(aFoo);
Run Code Online (Sandbox Code Playgroud)

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

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

public class bar{
    foo aFoo;

    public bar(){
       this.aFoo = new foo(1,2);
    }
}
Run Code Online (Sandbox Code Playgroud)

并实例化以下变量

bar aBar = new bar();
foo bFoo = new foo(3,4);
Run Code Online (Sandbox Code Playgroud)

现在假设我想将 的值复制aBar.aFoobFoolike

bFoo = aBar.aFoo;
Run Code Online (Sandbox Code Playgroud)

如果我现在做

bFoo.a = 1234;
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*nik 5

bFoo = aBar.aFoo;
Run Code Online (Sandbox Code Playgroud)

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

bFoo.a = 1234;
Run Code Online (Sandbox Code Playgroud)

-> 您已将 1234 分配abFoo. 这个对象也被引用aBar.aFoo

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

  • 您遇到了众所周知的对象复制(克隆)难题。它没有通用的解决方案。 (2认同)
  • 你仍然需要覆盖`clone()`---并且这样做时不要弄乱任何东西:) `@Override public foo clone() { return (foo) super.clone(); }` (2认同)