【问题标题】:How to delete a class object? [duplicate]如何删除类对象? [复制]
【发布时间】:2023-03-24 19:51:01
【问题描述】:

我有一个名为 CounterGUI 的对象。它创建了一个 GUI。我在另一个类中创建它,比如 MyProgram。

MyProgram 创建 CounterGUI 对象后,如何删除该对象?说如果我这样做:

CounterGUI first = new CounterGUI(); //displays the GUI
first = null;

我认为将对象设置为 null 会删除所有内容(包括 GUI),但事实并非如此。如何彻底删除?

我不明白这是一个重复的问题,以前的答案是将其设置为 null 或新对象,但这在这里不起作用。

【问题讨论】:

  • System.gc() 在你的代码之后,据我所知,这将是最好的选择。
  • 如需尽快获得更好的帮助,请发帖SSCCE
  • 你的意思是说 MyProgram 正在显示 GUI,但在稍后阶段你希望它消失并删除对象
  • 您能否详细说明“我认为将对象设置为 null 会删除所有内容(包括 GUI)”,这里的一切和 GUI 是什么?

标签: java user-interface jframe


【解决方案1】:

假设 CounterGUI 是一个java.awt.Window,那么:

  • 使窗口消失的方法是调用setVisible(false)

  • 将其与原生窗口完全断开的方法是调用dispose()

  • 一旦 Window 为 disposed,使其无法访问(例如,通过将 null 分配给引用它的所有变量)将使其符合垃圾回收条件。

Window 可见时简单地分配null 将无效。一个可见的 Window 对象连接到各种阻止它被垃圾收集的东西。

【讨论】:

【解决方案2】:

Java 使用自动垃圾回收。当您将对象设置为 null 并且它是剩余的最后一个引用时,JVM 将回收使用的内存。

但是,在您的情况下,可能是创建了一个线程(使用 GUI,这通常是这种情况)并为其提供了对当前对象的引用。在这种情况下,将引用设置为 null 无效,因为其他东西仍然可以访问该对象。

为了正确关闭您的 GUI,您必须调用 close 方法。对于 JFrame,你可以试试这个:

myGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

当用户单击关闭按钮时将关闭应用程序。如果你想通过程序来控制关闭,那么你可以试试:

private void closeItDown() {
  WindowEvent event = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
  Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
}

...并调用此方法。您不必将任何内容设置为 null,此时 JVM 可能会为您收集垃圾。不能保证,但可能在这一点上,也许以后,或者现在......或者任何时候:)

【讨论】:

    【解决方案3】:
    1. 通过将对象的引用设置为 null 来删除对象,使其符合垃圾收集条件,并且 JVM 将负责删除所有这些对象。如果您想强制垃圾收集器运行,您可以发出System.gc()Runtime.gc (),但仍然不能保证它会被收集回JVM。您可以找到有关垃圾收集器如何工作的更多信息here

    2. 如果您想删除您的 GUI 窗口,您可以使用dispose() 方法。

    【讨论】:

    • 不要打电话给gc()。一般来说这是一个坏主意,在这种情况下它是徒劳的......除非你已经处置了窗口。
    • @StephenC 谢谢你的建议。
    【解决方案4】:

    你想让 GUI 消失然后dispose()

    这个你不用担心,垃圾收集器会自动把它从内存中取出或者

    你可以自己调用它

    System.gc()

    但这是不好的做法,也不能保证一定会被收集。

    【讨论】:

    • System.gc() 不应显式调用 - 它被认为是错误的。当您发现自己在调用它时,您必须知道自己正在抓住稻草,并且必须找到不同的解决方案。
    • 无论如何请详细说明不好,是oracle或Java的创造者不鼓励,请给我链接..??
    • 此外,它在这里无济于事,因为只要窗口处于活动状态,它就会保持可访问性......即使您 null 参考。
    • 这里解释了为什么调用System.gc() 是个坏主意。 stackoverflow.com/questions/2414105/…
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2018-05-27
    • 2016-02-28
    • 2011-03-28
    相关资源
    最近更新 更多