Java 的表现就像我有指针一样。为什么?

标签 java pointers reference

我正在使用 java.swing 构建一个应用程序。我有一个主面板、一个网格面板(显示方 block )和一个详细信息面板(显示每个方 block 的详细信息并允许您编辑它们)。正方形也是物体。

我让主面板监听鼠标点击,如果您单击网格面板,网格面板将遍历它的方 block 数组列表并找到您单击的方 block ,然后将其返回。该方 block 由主面板传递到显示面板,然后显示面板将其局部变量 currentSquare 设置为等于传入的方 block 。

让我感到困惑的是,我可以编辑 currentSquare,而 ArrayList 中相应的方 block 正在被编辑!我可以更改 currentSquare 的公共(public)变量或使用 setter 来更改它们,但无论如何效果都是相同的。虽然这是我希望发生的效果,但我的印象是我必须有某种 getters/setters 才能将编辑后的 ​​currentSquare 返回到 ArrayList 并替换旧的方 block 。

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

最佳答案

在 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);

关于Java 的表现就像我有指针一样。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771443/

相关文章:

c++ - 将链表复制到对链表的引用

c++ - 如何在递归函数中调用引用数组?

java - 为什么我的 Spring @Autowired 字段返回 null?

java - 如何在 hibernate 中映射 String[]

java - 查询语法异常 : Table is not mapped [Update Table BOMmodel Set PA13 = Materialvalue + ReqQTY ]

java - 我必须使用 java 查询 MS SQL DB

c - 为什么从 strtok() 返回的指针在传递给 printf() 时会导致段错误?

c - 在 C 中分配矩阵

c# - C# 中的结构指针初始化

Excel:间接(地址(...))与偏移(...)