java中的public static void main(String arg )是固定的吗?

我最近在考试中被问到main方法的public static void main(String arg[])格式是否已修复? 我们可以改变它吗? 我们可以使用main而不使用publicstaticvoid吗? 如果没有,为什么public static void main(String arg[])总是代表public static void main(String arg[])硬编码?

main方法的签名在Java语言规范部分12.1.4中指定,并明确指出:

方法main必须声明为public,static和void。 它必须指定一个forms参数(第8.4.1节),其声明的类型是String数组。

  • 它必须是public否则就无法调用它
  • 它必须是static因为在调用之前无法实例化对象
  • String参数列表允许在从命令行执行Java程序时传递参数。 可以在没有参数的情况下定义它,但是更加实用(和其他语言类似)
  • 返回类型是void因为没有其他任何东西是没有意义的:Java程序可以在到达main方法结束之前终止(例如,通过调用System.exit()

因此,方法签名可以是:

 public static void main( String[] args ) public static void main( String... args ) 

请注意, varargs版本( ... )仅在Java 5中有效

由于Java语言允许括号[]位于类型或变量之后(第一个通常是首选),

 public static void main( String args[] ) // valid but usually non recommended 

也有效

如果你看一下JDK源代码(jdk-src \ j2se \ src \ share \ bin \ java.c):

 /* Get the application's main method */ mainID = (*env)->GetStaticMethodID(env, mainClass, "main", "([Ljava/lang/String;)V"); ... { /* Make sure the main method is public */ ... mods = (*env)->CallIntMethod(env, obj, mid); if ((mods & 1) == 0) { /* if (!Modifier.isPublic(mods)) ... */ message = "Main method not public."; messageDest = JNI_TRUE; goto leave; ... 

很明显它必须只有这个签名。

Public是一种访问说明符,因此我们可以从类外部访问它。 由于main是充当执行点的函数。 主函数由类外部的JVM调用,因此必须将其声明为public。

Static是java中使用的一种关键字,用于指定不需要创建任何实例。 我们知道main方法也驻留在一个类中,并且从类外部访问类的特定函数(在本例中来自JVM),需要该特定类的一个实例,所以为了避免这些,我们只需要将static设置为make访问类外的main方法。

Void是返回类型,因为main方法中的其他返回类型没有意义。

String是java中预定义的类名。 而args []是数组类型的变量。 它是String类型对象的变量名。 所以我们也可以改变args []的名称。 String类及其对象可以作为参数在正在运行的程序中传递,以便从命令行将信息传递给main方法。

main方法必须是public因此在加载类时JVM可以找到它。 类似地,它必须是static以便在加载类之后可以调用它,而不必创建它的实例。 所有方法都必须具有返回类型,在这种情况下是void.

我无法回答方法的参数,但它必须是公共的,因为jvm必须能够访问该函数,并且它必须是静态的,因为jvm不知道如何创建类的实例。

这篇文章提供了关于静态推理的详细解答: 为什么Java main方法是静态的?

这篇文章为main 为什么无效提供了一个很好的答案: 为什么java中的main()是无效的?

如果没有,为什么main(String arg [])总是代表public static void main(String arg [])的硬编码?

您可以拥有名为“main”的方法,您可以使用任何签名和访问权限。 特殊规则仅适用于您希望JVM调用以启动程序的方法。

 public class Test { public static void main(String[] args) { StrangeMain m = new StrangeMain(); System.out.println(m.main()); System.out.println(m.main(new String[]{"aaa","bbb"})); } } class StrangeMain{ protected String main(){ return "xyzzy"; } protected String main(String[] arg){ return arg[0]; } } 

编译,运行和输出:

 xyzzy aaa 
  Public static void main(String [] ar) 

要理解这一点,我们需要知道方法和数组的语法。

方法的语法是:

返回类型methodName

所以main方法与void一起写,返回类型。

数组语法:

datatype [] arrayName

方括号表示它是否是维数组。由于我们有一对方括号,它是一维数组。

主要方法中词语的含义:

Public:Public是访问说明符,用于JVM从任何位置执行main方法。

静态:静态是一个修饰符。必须将main方法声明为static,以便JVM可以使用类名直接访问main方法。

当我们执行java程序时,我们使用类名,所以当我们编写静态时,它将帮助JVM访问main方法。

如果我们删除静态然后它变成实例方法,访问我们应该创建和对象的实例方法,然后使用对象引用调用该方法。

void:Void是main方法的返回类型。 main方法的调用者是JVM,JVM不期望main方法有任何值,因此main方法不应该返回任何值。这就是指定Void的原因。

main:Main是方法名称,它根据Java编码约定进行修复

String []:用于存储命令行参数。数组的名称可以是任何有效的Java标识符。

因此,在String []之后,我们可以将name命名为任何有效的java标识符,它可以是’ar’,也可以是’args’。

如果为应用程序创建新的加载程序,则可以更改它。 public static void main(String args [])格式只是人们在JVM上调用Java程序时的默认解决方案,因此有一种明确的方法可以实现。

我们今天真正的实现只是使用JNI接口通过使用此函数调用public static void main(String args [])方法,因此如果您想使用JNI并且使用不同的方法,则可以轻松编写完全相同的代码。加载你的应用程序

以下是从此页面获取的代码示例 。

这是当前的linux启动程序, 方法查找从这里开始 。

  • public-main()方法必须由类外部的任何一个以及类内部使用,以便公开

  • 静态静态是必要的bcoz在java中如果我们定义类而不是我们为该类定义对象而且只有我们可以使用那个类…而不是我们直接使用通过写单词static

  • void-for main()cant返回任何值,如int或char main() – main是我们可以用来访问java的未来的函数或方法String-in java我们所写的全部考虑为字符串args-arguments