为什么可以在静态类中实例化类,例如main?

时间:2013-09-17 06:10:21

标签: java swing static main instantiation

我最近在学习Java时遇到了一种编程语言,这种语言对于编写GUI代码并不麻烦(要求一个简单的方法来创建一个窗口并添加界面元素?),以及关于动态和静态编程如何在Java中混合,我有点好奇。 Java要求我将我的主类/入口点声明为:

public static void main(String[] args)...

在main中,我可以使用以下内容声明实例:

JFrame frame = new JFrame();

为什么这样,而frame = new JFrame();在Java中完全有效?

特别是,当我精神上“解析”第一个时,我把它读作“框架,JFrame的一个实例,是JFrame的新实例”。对我来说,这似乎有点多余。后者,我读作“框架是JFrame的新实例”似乎更合理。

继续前进,我经常在类的顶部附近定义它经常使用的变量,特别是常量或持久显示对象,所以当我创建一个简单的类时,我通常会声明像public JFrame frame这样的东西

正确实例化中的冗余,JFrame frame = new JFrame()我可以删除这些声明而没有明显问题吗?

    public class Display {
        //The line below can be deleted with no apparent difference
        public JFrame frame; 

        public static void main(String[] args) {
        /* Why do I need to declare the type of a variable I have 
         * already declared above? */
        JFrame frame = new JFrame();

        frame.setSize(800, 600);
        frame.setVisible(true);
        }
     }

在我删除该声明的情况下,我是否正确假设该帧成为主方法的子节点?在这种情况下,将它声明为顶部会使它成为显示的孩子吗?

总的来说,我想通过静态类来解释实例化。我真的希望我不是在问一个愚蠢的问题,但我发现在线“教程”通常采用描述代码功能的演练形式,但不是为什么以这种方式使用它;基本上,我在其他地方找不到答案,我知道你们有很多知识。我真的很感激有一个深思熟虑的回答,如果可能的话,我会在每个例子中解释如何与声明的'框架'互动。

我也很高兴解释为什么frame = new JFrame无效,即使我将public JFrame frame声明为最高。

非常感谢您阅读本文并花时间回复^ _ ^

2 个答案:

答案 0 :(得分:4)

之间存在非常显着的差异:

JFrame frame = new JFrame();

frame = new JFrame();

第一个版本声明了一个新的 local 变量(在您给出的上下文中)并为其赋值。该局部变量与您在Display类中声明的实例变量完全分开。

后一个片段为现有变量分配了一个新值 - 除非在这种情况下它不起作用,因为你有一个实例变量但没有{{{ 1}}。

如果您将Display变量声明为frame而不是实例变量,则可以在static方法中指定该变量:

main

或者您可以创建public class Display { public static JFrame frame; public static void main(String[] args) { frame = new JFrame(); frame.setSize(800, 600); frame.setVisible(true); } } 的新实例,并为其中的实例变量赋值:

Display

然而:

  • 没有迹象表明您将在public class Display { public JFrame frame; public static void main(String[] args) { Display display = new Display(); display.frame = new JFrame(); display.frame.setSize(800, 600); display.frame.setVisible(true); } } 内使用实例/静态变量
  • 强烈鼓励您始终将您的字段设为私人

答案 1 :(得分:1)

//The line below can be deleted with no apparent difference
public JFrame frame; 

是的,因为它是一个未使用的变量。

您永远不会在代码中使用实例字段frame

相反,你有

 public static void main(String[] args) {
    /* Why do I need to declare the type of a variable I have 
     * already declared above? */
    JFrame frame = new JFrame();

声明一个具有相同名称和类型的新的,完全不相关的局部变量。