【问题标题】:Java, reference variables that point to the same object in the memoryJava,指向内存中同一个对象的引用变量
【发布时间】:2013-08-23 18:55:24
【问题描述】:

我正在开发一个 GUI 程序,我在其中创建了类,按功能将 ActionListener 聚集在一起。我的问题是关于 JVM 如何处理 jButtons,它们添加了相同的 ActionListener。

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

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

现在,我的问题是:如果我有 5 个 jButton。所有按钮都添加了相同的 ActionListener。当程序运行时,它们是否会添加 5 个单独的、相同的、相同类的实例?或者JVM会做类似的事情(与上面提到的)?

  • 提前致谢 :)

【问题讨论】:

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

标签: java variables memory user-interface


【解决方案1】:

嗯,这真的取决于您如何创建ActionListeners。如果你这样做了

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

或者

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

在第一种情况下,你确实有 5 个不同的动作监听器。但是在第二个中,您只有一个。什么时候可以只有一个?当它在相同的对象上执行完全相同的操作时。

【讨论】:

  • 第一个是单独的对象,第二个是同一个对象,对吗?
  • 感谢您的回答。我一直在做你在第一个例子中提到的事情——现在你提到了最后一个例子,我很惊讶我没有这样做。但如我的问题示例所示;我的想法主要是JVM是否可以接受,一些jButtons被赋予了相同的对象,因此让它们共享相同的对象。
  • 这是一个非常好的问题。答案并不容易。也许只是不够聪明?留下一些工作让我们去做?
【解决方案2】:

视情况而定。

这将为他们提供相同的实例。

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

虽然这会给他们自己的。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多