标题可能太长了,但我会解释自己。
通常,当我创建一个主要的mathod时,我把它放在我开始的类中。 最近我见过其他人的代码,看到他们把主程序放在一个新的类中。
我想到了,这个问题出现在我的脑海里。
当我启动程序时,是否创建了包含主mathod的类的实例? 因此,当我在主mathod中创建同一个类的新实例时,它是否会创建2个实例,或者main与类本身无关,并且该类首先没有实例,就像静态不能使用非静态变量?
答案 0 :(得分:4)
当我启动程序时,是否包含该类的实例 主要的mathod是创建的吗?
没有。 main()
方法有public
和static
的原因。您不必创建定义它的类的实例。因此,当您执行程序时,将加载,初始化包含main()
的类,然后执行main()
而不创建封闭类的实例。这就是为什么您无法从this
main()
的原因
答案 1 :(得分:3)
当我启动程序时,是否创建了包含
main
方法的类的实例?
没有。因为main
方法是static
。不会自动创建封闭类的实例。 JLS-12.1 Java Virtual Machine Startup说(部分)
Java虚拟机通过调用某个指定类的方法
main
开始执行,并传递一个参数,这是一个字符串数组。
答案 2 :(得分:1)
主方法签名:public static void(String args [])
<强>静态:强> 由于main方法是静态的,因此Java虚拟机可以调用它而无需创建包含main方法的任何类实例。如果main方法没有声明为静态,那么JVM必须创建主类的实例,并且因为构造函数可以重载并且可以有参数,所以JVM在Java中找不到主方法也没有任何确定和一致的方法。
公开:强> Java中的public可以从该类外部访问。由于main方法在Java中是公共的,因此JVM可以轻松访问和执行它。
void:它的虚空意味着main不会返回任何内容。
这里有一个技巧:直到并包括Java 6,可以使用静态初始化块执行此操作,如在控制台上打印消息而不使用main()中指出的那样方法。例如,使用以下代码:
class A3{
static{
System.out.println("static block is invoked");
System.exit(0);
}
}
System.exit(0)
允许程序在JVM查找main方法之前退出,否则将引发以下错误:
线程中的异常&#34; main&#34; java.lang.NoSuchMethodError:main
然而,在 Java 7 中,这不再起作用,即使它编译,当您尝试执行它时会出现以下错误:
程序编译成功,但未找到主类。主要 class应该包含方法:public static void main(String [] args)。