Java就像I';我有指示。为什么?

Java就像I';我有指示。为什么?,java,pointers,reference,Java,Pointers,Reference,我正在使用java.swing构建一个应用程序。我有一个主面板、一个网格面板(显示正方形)和一个细节面板(显示每个正方形的细节并让你编辑它们)。正方形也是对象 我让主面板监听鼠标点击,如果你点击网格面板,网格面板将通过它的正方形数组列表,找到你点击的正方形,并返回它。该平方由主面板传递到显示面板,然后显示面板将其局部变量currentSquare设置为与传入的平方相等 我感到困惑的是我可以编辑currentSquare,而ArrayList中对应的square正在被编辑!我可以更改current

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

我让主面板监听鼠标点击,如果你点击网格面板,网格面板将通过它的正方形数组列表,找到你点击的正方形,并返回它。该平方由主面板传递到显示面板,然后显示面板将其局部变量currentSquare设置为与传入的平方相等

我感到困惑的是我可以编辑currentSquare,而ArrayList中对应的square正在被编辑!我可以更改currentSquare的公共变量,也可以使用setter来更改它们,但不管怎样效果都是一样的。虽然这是我想要实现的效果,但我的印象是我必须有某种getter/setter来将编辑好的currentSquare返回到ArrayList并替换旧的square


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

在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(0x123456, 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(0x123456, 5);


因为它有指针;它没有指针算法,java中的每个对象都在堆上。您正在将指向这些对象的指针作为值传递。堆栈上没有对象,或者像C++一样自动调用复制机制。如上所述,您没有访问“原始”指针的权限。。。所以他们称之为“参考”,这导致了无休止的圣战;)@m3th0dman Java也没有函数指针、基元变量指针或对象指针。@Jan Dvorak在版本8中将有函数指针,但它们将被称为lambda表达式;您是对的,它没有基本变量指针,但它有对象指针,只是它们在Java中被称为引用。事实上,您只能通过引用访问对象(就像指针一样,它将对象的内存地址作为值保存)。正如我在上面的评论中所说,您没有指针算术,这意味着您不能更改对象的地址(除非您使用不安全类中的一些技巧);它没有指针算法,java中的每个对象都在堆上。您正在将指向这些对象的指针作为值传递。堆栈上没有对象,或者像C++一样自动调用复制机制。如上所述,您没有访问“原始”指针的权限。。。所以他们称之为“参考”,这导致了无休止的圣战;)@m3th0dman Java也没有函数指针、基元变量指针或对象指针。@Jan Dvorak在版本8中将有函数指针,但它们将被称为lambda表达式;您是对的,它没有基本变量指针,但它有对象指针,只是它们在Java中被称为引用。事实上,您只能通过引用访问对象(就像指针一样,它将对象的内存地址作为值保存)。正如我在上面的评论中所说,您没有指针算术,这意味着您不能更改对象的地址(除非您使用不安全类中的一些技巧)。看,我想这就是我感到困惑的地方。我听过有人把Java描述为一个传递值,在我看来,传递值意味着你复制了一个对象并给出它。通过引用传递对我所看到的更有意义。它是通过值传递的。该值是堆上的内存位置,而不是对象本身。@Dr.cn在
f(变量)
f
不能更改
variable
指向的对象时,它不是通过引用传递的。它也不是传递值,因为不复制对象,只复制引用。还要注意,这里的“引用”是指与“通过引用传递”完全无关的内容。另请参阅:许多问题。@Dr.氰化物,补充澄清。@Dr.氰化物,类似的内容。你没有复制广场,你复制了它的地址。如果要复制正方形本身,则需要显式克隆它,这将导致创建另一个正方形,并且