Java 为什么类可以在静态类中实例化,比如main?
我最近一直在学习Java,寻找一种编程语言,这种语言对编写GUI代码来说不是一件麻烦事(要求一种创建窗口和添加界面元素的简单方法是不是太过分了?)。Java要求我将我的主类/入口点声明为: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中完全有效 特别是,当我在心里“解析”第一个时,我把它
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();