为什么JVM在变量超出范围之后不会销毁JFrame对象?

ani*_*mwr 3 java concurrency swing garbage-collection event-dispatch-thread

我正处于学习Java的初级阶段.在我读过的所有文档中,它都提到Java使用安全引用来访问对象而不是内存指针.而且当方法返回时,其本地范围的变量符合垃圾收集的条件.

那么为什么在下面的代码中,在createFrame方法返回后,JFrame对象不会随窗口一起被销毁?

import javax.swing.*;

public class HelloJava {
    public static void main( String[] args ) {
        createFrame();
    }

    private static void createFrame() {
        JFrame frame = new JFrame( "Hello, Java!" );
        JLabel label = new JLabel( "Hello, Java!", JLabel.CENTER );
        frame.getContentPane().add( label );
        frame.setSize( 300, 300 );
        frame.setVisible( true );
    }
}
Run Code Online (Sandbox Code Playgroud)

不仅窗口是可见的,我可以在该窗口上执行所有操作,如拖动,最大化,最小化等.

And*_*son 6

因为EDT现在正在运行.

有关更多详细信息,请参阅Swing中的并发性,特别是:

  • 初始线程.

    在标准程序中,只有一个这样的线程:调用main程序类方法的线程.

  • 事件派遣线程.

    Swing事件处理代码在称为事件派发线程的特殊线程上运行.大多数调用Swing方法的代码也在这个线程上运行.


Rei*_*eus 6

JFrame对象不会被销毁,因为UI线程或所谓的事件调度线程具有对它的引用并且正在使用它.