Java主方法的方法签名是:
public static void main(String[] args) {
...
}
为什么这个方法必须是静态的?
Java主方法的方法签名是:
public static void main(String[] args) {
...
}
为什么这个方法必须是静态的?
当前回答
这背后的原因很简单,因为对象不需要调用静态方法,如果它是非静态方法,java虚拟机先创建对象,然后调用main()方法,这将导致额外的内存分配问题。
其他回答
让我们简单地假设,静态不需要作为应用程序入口点。
一个应用程序类看起来是这样的:
class MyApplication {
public MyApplication(){
// Some init code here
}
public void main(String[] args){
// real application code here
}
}
构造函数代码和主方法之间的区别是必要的,因为在OO中,构造函数只应确保实例被正确初始化。初始化后,实例可以用于预期的“服务”。将完整的应用程序代码放到构造函数中会破坏这一点。
因此,这种方法将在应用程序上强制执行三个不同的契约:
必须有一个默认构造函数。否则,JVM将不知道调用哪个构造函数以及应该提供哪些参数。 必须有一个主要的方法。好吧,这并不奇怪。 类不能是抽象的。否则,JVM无法实例化它。
另一方面,静态方法只需要一个契约:
必须有一个主要的方法。
这里抽象构造函数和多重构造函数都不重要。
由于Java被设计为一种简单的语言,所以应用程序入口点被设计为使用一个简单的契约,而不是使用三个独立而脆弱的契约,这并不奇怪。
请注意:这个参数不是关于JVM或JRE内部的简单性。这个参数是关于用户的简单性。
在这里,完整的签名只能算作一份合同。
静态方法不需要任何对象。它直接运行,所以main直接运行。
这只是一种惯例。JVM当然可以处理非静态的主方法,如果这是惯例的话。毕竟,您可以在类上定义静态初始化器,并在到达main()方法之前实例化无数对象。
这只是一个惯例,我们可以在这里看到:
方法必须声明为public和static,它不能返回任何值 值,并且它必须接受String数组作为参数。默认情况下, 第一个非选项参数是要调用的类的名称。 应该使用完全限定的类名。如果-jar选项为 指定后,第一个非选项参数是JAR存档的名称 类包含应用程序的类和资源文件 由Main-Class manifest头指示的启动类。
http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/java.html#description
如果主方法不是静态的,则需要从程序外部创建主类的对象。你想怎么做呢?