Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么类可以在静态类中实例化,比如main?_Java_Swing_Static_Main_Instantiation - Fatal编程技术网

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

Java 为什么类可以在静态类中实例化,比如main?,java,swing,static,main,instantiation,Java,Swing,Static,Main,Instantiation,我最近一直在学习Java,寻找一种编程语言,这种语言对编写GUI代码来说不是一件麻烦事(要求一种创建窗口和添加界面元素的简单方法是不是太过分了?)。Java要求我将我的主类/入口点声明为: public static void main(String[] args)... 在main中,我可以声明具有以下内容的实例: JFrame frame = new JFrame(); 为什么会这样,而不是frame=newjframe()在Java中完全有效 特别是,当我在心里“解析”第一个时,我把它

我最近一直在学习Java,寻找一种编程语言,这种语言对编写GUI代码来说不是一件麻烦事(要求一种创建窗口和添加界面元素的简单方法是不是太过分了?)。Java要求我将我的主类/入口点声明为:

public static void main(String[] args)...
在main中,我可以声明具有以下内容的实例:

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

特别是,当我在心里“解析”第一个时,我把它理解为“frame,JFrame的一个实例,是JFrame的一个新实例”。对我来说,这似乎有些多余。后者,我读作“frame是JFrame的一个新实例”,似乎更合理

接下来,我经常在类的顶部定义它经常使用的变量,特别是常量或持久显示对象,因此当我创建一个简单的类时,我通常会声明类似于
publicjframe
的内容


正确实例化中的冗余,
JFrame=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);
        }
     }
在我从顶部删除该声明的情况下,我是否正确地假设框架成为main方法的子对象?在这种情况下,将其声明为top会使其成为要显示的子对象

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

我也很乐意解释为什么frame=newjframe无效,即使我在顶部声明了
publicjframe


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

以下内容之间存在着非常显著的差异:

JFrame frame = new JFrame();

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

后一个代码段为现有变量指定了一个新值-除非在这种情况下它不起作用,因为您有一个实例变量,但没有
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);
    }
 }
然而:

  • 没有迹象表明您将在
    Display
    中使用实例/静态变量
  • 我强烈鼓励你永远把你的领域保密
是的,因为它是一个未使用的变量

您从未在代码中使用实例字段
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();

它声明了一个新的、完全不相关的、名称和类型相同的局部变量

JFrame=newjframe不是有效的代码。您需要
JFrame=newjframe()为什么我需要声明我在上面已经声明的变量的类型?-你不需要,除非你想要一个局部变量。哦,我也需要。我在我的项目中正确地输入了它,但是当我从内存中输入问题时,我忘记了括号。你可能想通读@MadProgrammer。我以前读过这些文章,但为了更全面,我刚刚通读了。这是一个合理的复习,但实际上并没有讨论我遇到的问题。最接近的说法是“类方法不能直接访问实例方法和变量”。非常感谢!您准确地描述了我的误解,并举例说明了如何纠正问题,以便我使用上述声明。正如您正确假设的那样,在本例中,我将不使用单独的显示实例。至于将它们私有化,我倾向于将我的变量私有化,但出于示例的考虑,将其公开似乎是合理的。在我工作的时候,我会记住你的建议,因为我看不到很多地方需要公开。顺便说一句,我做了更多的编码,多亏了你的建议,我轻松地设置了我的显示类,这样我就可以打开一个新窗口,其中有两行代码,一行运行构造函数
display(int-width,int-height,String-title)
和设置窗口可见的窗口。你为我节省了不少令人沮丧的项目,用20行代码编码每个窗口,而不是专注于内容。
//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();