0

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

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

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

我目前关于为什么会发生这种情况的理论是它与 Java 的引用有关,因为正方形是一个自定义对象,但我不确定情况是否如此或导致这种情况的原因。最终,我想知道我做了什么导致这种情况,以及将其保持原样或在此基础上构建是否是好的/好的编程实践(如果我确实以这样的方式构建它,它会破坏的可能性有多大)。

4

1 回答 1

5

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

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);
    }   
}
{test=def}
5

上面编译成类似:

test(0x123456, 5);
于 2012-12-07T21:44:47.103 回答