2

在使用 NetBeans 制作新的 JFrame 项目时,我一直在浏览自动生成的代码,并在我的main方法中遇到了这个问题:

java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new TestClass().setVisible(true);
        }
    });

经过一番阅读,我开始了解 invokeLater 的必要性,以便在 EDT 中处理 GUI 组件。也就是说,在new TestClass().setVisible(true);这里实现的 line 对我来说有点令人难以置信。我在创建一个新实例的上下文中得到它......

TestClass tclass = new TestClass();
tclass.setVisible(true);

...但我不太了解上述run()方法中发生的事情。该代码是否创建了一个匿名类?我遇到过这个术语,但还没有完全理解。我假设它不是以我上面列出的“教科书”方式创建实例,因为没有变量(我无论如何都能看到)来引用该实例。

顺便说一句,在我看来,将您的main方法放在 JFrame 类(或任何 GUI 类,就此而言)并不理想,所以我可能会移动它。

4

1 回答 1

1

new TestClass().setVisible(true)只是创建一个新实例,调用setVisible(true)它,然后通过不保存对它的引用来“忘记”该实例。它实际上相当于

TestClass tclass = new TestClass();
tclass.setVisible(true);

因为该变量tClass在 run 方法之外是不可访问的,而 run 方法除了调用setVisible它之外什么也不做。

如果必须调用实例上的两个或多个(void)方法,您将需要使用一个变量来保存对实例的引用,并且您无法执行让您感到困惑的“单行”技巧:

TestClass tclass = new TestClass();
tclass.setVisible(true);
tclass.methodX();

它不是一个匿名类(请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html),它类似于“匿名实例”,尽管我认为该术语不存在。

main根据您的项目布局,将方法移动到单独的类可能是有意义的。

于 2015-08-02T07:20:01.240 回答