Java,指向内存中同一对象的引用变量

5

我正在开发一个GUI程序,其中我创建了类,通过功能将ActionListeners进行集群。我的问题是关于JVM如何处理具有相同ActionListener的jButton。

首先,我知道JVM可以通过让两个指向相同字符串的引用变量(例如)指向内存中的同一字符串对象来节省内存。

public class Example {
    String str1 = "SomeString";
    String str2 = "SomeString";  
}

现在,我的问题是:如果我有5个jButton,所有按钮都添加了相同的ActionListener。当程序运行时,它们会有5个单独的、相同的类实例添加到它们中吗?还是JVM会做类似于上面提到的事情呢?
谢谢!

如果你向我们展示你正在做什么,我们可以告诉你会发生什么。或者你可以自己测试一下。你的问题很困惑 - 如果你将相同的ActionListener对象传递给五个不同的按钮,为什么你会认为它会分裂成五个对象呢? - Eric Stein
感谢您的回复。在我的例子中,我的意思是:如果我将五个不同的对象显式地添加到五个不同的按钮上,JVM是否会优化内存空间,并让它们共享同一个对象。 - Daniel Mac
在这种情况下,不行。JVM不会合并那样的对象。字符串是一个特殊情况。但是,您可以为多个按钮使用相同的ActionListener。 - Eric Stein
非常感谢!那完美地回答了我的问题! - Daniel Mac
3个回答

4

这主要取决于您如何创建ActionListeners。如果您是这样做的:

button1.addActionListener(new ActionListener() {
    ....
});
....
button5.addActionListener(new ActionListener() {
    ....
});

或者

ActionListener al= new ActionListener() {
    ....
};
button1.addActionListener(al);
....
button5.addActionListener(al);

在第一种情况下,您确实有5个不同的操作监听器。但在第二种情况下,您只有一个。什么时候可以只有一个?当它完全相同并且作用于相同的对象时。

第一个是单独的对象,第二个是同一个对象,对吗? - shieldgenerator7
感谢您的回答。我一直在做你在第一个例子中提到的事情,现在你提到了最后一个例子,我很惊讶我没有这样做。但正如我在问题示例中所展示的那样,我的想法主要是JVM是否能够识别出一些jButton已经被赋予了相同的对象,并因此让它们共享相同的对象。 - Daniel Mac
这是一个非常好的问题。答案并不容易。也许只是我们不够聪明?留下了一些工作需要我们去做? - Mario Rossi

3

这要看情况。

这将使它们具有相同的实例。

ActionListener al = new ActionListener() { ... };
button.addActionListener(al);
button2.addActionListener(al);
...

虽然这将使他们拥有自己的。

button.addActionListener(new ActionListener() { ... });
button2.addActionListener(new ActionListener() { ... });

1
我认为它会将相同的ActionListener对象传递给所有5个按钮。如果你想知道真相,我建议你自己测试一下。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接