main
方法的方法签名为:public static void main(String[] args) {
...
}
这个方法必须是静态的有什么原因吗?
main
方法的方法签名为:public static void main(String[] args) {
...
}
这个方法必须是静态的有什么原因吗?
java.exe
的部分)。 - Adam Payntermain
方法非静态,仍然符合语言的限制。没有听到设计者的意见,我们只能同意不同意见。 :) - David Harkness这个方法是静态的,否则就会存在歧义:应该调用哪个构造函数?特别是如果你的类长这样:
public class JavaClass{
protected JavaClass(int x){}
public void main(String[] args){
}
}
JVM是否应该调用 new JavaClass(int)
?它应该为x
传递什么?
如果不是,JVM是否应该实例化JavaClass
而不运行任何构造函数方法?我认为不应该这样做,因为这将特殊处理整个类 - 有时您拥有一个未初始化的实例,并且您必须在可能被调用的每个方法中进行检查。
有太多的边缘情况和歧义,以至于JVM在调用入口点之前实例化类没有意义。这就是为什么main
是静态的原因。
不过,我不知道为什么main
总是标记为public
。
public static void main
作为入口点的标志,一个公共的无参构造函数并不像它那样大声喊出“这可能是一个入口点!” - Jacob Krallmain
也存在同样的“问题”。令人惊奇的是(对于您来说),JVM 可以很好地处理这个问题。 - Konrad RudolphC++、C# 和 Java 中的 main
方法都是静态的。
这是因为它们可以被运行时引擎调用,而不需要实例化任何对象,然后在 main
代码块中的代码将执行其余操作。
public static void main...
,为什么约定不能是应用程序入口点类应该有一个公共默认构造函数? - Edwin Dalorzostatic void main
方法?这不是问题。 - Konrad Rudolphmain
这样的static
方法经常使用new
来创建这样的对象。 - Ben Voigt假设我们不需要使用static
作为应用程序的入口点。
那么一个应用程序类将如下所示:
class MyApplication {
public MyApplication(){
// Some init code here
}
public void main(String[] args){
// real application code here
}
}
构造函数和main
方法之间的区别是必要的,因为在面向对象语言中,构造函数只应确保实例被正确地初始化。初始化后,实例可以用于预期的“服务”。将完整的应用程序代码放入构造函数中会破坏这一点。main
方法。这并不令人惊讶。static
方法只需要一个约定:
main
方法。abstract
,也不考虑多个构造函数的情况。main
方法,它是 public
、static
的,并且具有签名为 void main(String[])
。我同意,如果该方法是实例方法,JRE 的工作会稍微增加,但工作的类型将是相同的,复杂性也不会显著提高(请参见先前答案的评论讨论)。我不认为这种差异解释了使入口点静态的决定,特别是因为解析实例方法所需的必需方法已经存在,并且可以轻松使用。 - Konrad Rudolphstatic public main(String[])
方法是一个签名,因此是一个契约。否则,必须遵循三个独立的契约。 - A.H.这是Java语言和Java虚拟机的设计方式。
请查看第12章执行 - 第12.1.4节调用Test.main方法:
最后,在完成Test类的初始化(在此期间可能已发生其他相关的加载、链接和初始化)后,将调用Test的main方法。
main方法必须声明为public、static和void。它必须接受一个字符串数组作为单个参数。该方法可以声明为
或者
public static void main(String[] args)
public static void main(String... args)
Oracle Java虚拟机规范
Java虚拟机通过调用某个指定类的方法main并传递单个参数(即字符串数组)来开始执行。这会导致指定类被加载(§2.17.2),与其使用的其他类型链接(§2.17.3),并进行初始化(§2.17.4)。该方法main必须声明为public、static和void。
Oracle OpenJDK源代码
下载并提取源码jar,查看JVM是如何编写的,请查阅
../launcher/java.c
,其中包含命令java [-options] class [args...]
背后的本地C代码。
/* * Get the application's main class. * ... ... */ if (jarfile != 0) { mainClassName = GetMainClassName(env, jarfile); ... ... mainClass = LoadClass(env, classname); if(mainClass == NULL) { /* exception occured */ ... ... /* Get the application's main method */ mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); ... ... { /* Make sure the main method is public */ jint mods; jmethodID mid; jobject obj = (*env)->ToReflectedMethod(env, mainClass, mainID, JNI_TRUE); ... ... /* Build argument array */ mainArgs = NewPlatformStringArray(env, argv, argc); if (mainArgs == NULL) { ReportExceptionDescription(env); goto leave; } /* Invoke main method. */ (*env)->CallStaticVoidMethod(env, mainClass, mainID, mainArgs); ... ...
public static void main(String arguments[])
- 参考资料:Oak 0.2 规范。 - assyliasRunnable
的实例。以相同的方式表示整个进程(即将 Runnable.Run
作为入口点)在Java中绝对是有意义的。当然,Runnable
本身可以说是一个设计缺陷,这是由于Java没有匿名方法(尚未)。但既然已经存在... - Konrad Rudolph让我以更简单的方式解释这些事情:
public static void main(String args[])
除了小程序之外,所有Java应用程序都从main()
开始执行。
public
关键字是一种访问修饰符,允许从类的外部调用成员。
static
被使用是因为它允许在不实例化该类的特定实例的情况下调用main()
。
void
表示main()
不返回任何值。
public static void main(String args[])
的含义是什么?
public
is an access specifier meaning anyone can access/invoke it such as JVM(Java Virtual Machine.static
allows main()
to be called before an object of the class has been created. This is neccesary because main()
is called by the JVM before any objects are made. Since it is static it can be directly invoked via the class.
class demo {
private int length;
private static int breadth;
void output(){
length=5;
System.out.println(length);
}
static void staticOutput(){
breadth=10;
System.out.println(breadth);
}
public static void main(String args[]){
demo d1=new demo();
d1.output(); // Note here output() function is not static so here
// we need to create object
staticOutput(); // Note here staticOutput() function is static so here
// we needn't to create object Similar is the case with main
/* Although:
demo.staticOutput(); Works fine
d1.staticOutput(); Works fine */
}
}
Similarly, we use static sometime for user defined methods so that we need not to make objects.
void
indicates that the main()
method being declared
does not return a value.
String[] args
specifies the only parameter in the main()
method.
args
- a parameter which contains an array of objects of class type String
.