Java就像我有指针一样.为什么?

Dr.*_*ide 0 java pointers reference

我正在使用java.swing构建一个应用程序.我有一个主面板,一个网格面板(显示正方形)和一个细节面板(它会显示每个正方形的细节并允许您编辑它们).正方形也是对象.

我让主面板监听鼠标点击,如果你点击网格面板,网格面板将通过它的正方形ArrayList找到你点击的哪个方格,然后返回它.该正方形由主面板传递到显示面板,然后将其局部变量currentSquare设置为等于传入的正方形.

我感到困惑的是我可以编辑currentSquare,并且正在编辑ArrayList中的相应方块!我可以更改currentSquare的公共变量或使用setter来更改它们,但效果是相同的.虽然这是我想要发生的效果,但我的印象是我必须有某种getter/setter来将编辑的currentSquare带回ArrayList并替换旧的square.

我目前关于为什么会这样做的理论是它与Java的引用有关,因为square是一个自定义Object,但我不确定是这种情况还是导致这种情况的原因.最终我想知道我做了什么导致这种情况,如果它是好的/好的编程实践,保持原样或建立在此基础上(如果我建立它像这样工作,它有多大可能会破坏它).

rid*_*rid 5

在Java中,当您使用对象调用方法时,您不是要发送对象的副本,而是发送对象的副本.调用者和calleee都将引用同一个对象,并且一旦对它的所有引用都消失,该对象就有资格进行垃圾回收.

Java被称为"按值传递",因为引用本身就是值,就像基元是值一样.当您使用对象调用方法时,您将对象的地址作为参数发送,而不是对象的副本.您无权访问该地址的值,您只能访问它所引用的对象.例:

import java.util.*;

class Test { 
    private static void test(Map<String, String> a, int b) {
        a.put("test", "def");
        b = 10; 
    }

    public static void main(String[] args) {
        Map<String, String> a = new HashMap<String, String>();
        a.put("test", "abc");

        int b = 5;

        test(a, b); 

        System.out.println(a);
        System.out.println(b);
    }   
}
Run Code Online (Sandbox Code Playgroud)
{test=def}
5
Run Code Online (Sandbox Code Playgroud)

以上编译成如下:

test(0x123456, 5);
Run Code Online (Sandbox Code Playgroud)

  • @Cyanide博士,补充说明. (2认同)