16

我最近在考试中被问到方法的public static void main(String arg[])格式main是否固定?我们可以改变它吗?我们可以main在没有任何public,static或的情况下使用void吗?如果不是,为什么不硬编码main(String arg[])代表public static void main(String arg[])永远?

4

9 回答 9

26

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

方法 main 必须声明为 public、static 和 void。它必须指定一个声明类型为字符串数组的形式参数(第 8.4.1 节)。

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

因此,方法签名可以是:

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

请注意,可变参数版本 ( ...) 仅在 Java 5 中有效

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

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

也是有效的

于 2012-04-05T12:42:56.673 回答
2

如果您查看 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;
...

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

于 2012-04-05T12:47:37.383 回答
2

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

static 是 java 中使用的一种关键字,用于指定不需要创建它的任何实例。我们知道 main 方法也驻留在类内部,并且要从类外部访问类的特定功能(在这种情况下来自 JVM),需要该特定类的实例,因此为了避免这些,我们只需放置 static访问类外的主要方法。

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

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

于 2017-03-04T18:35:16.553 回答
0

main 方法必须是public这样才能在加载类时被 JVM 找到。同样,它必须是static在加载类后可以调用它,而不必创建它的实例。所有方法都必须有一个返回类型,在这种情况下是void.

于 2012-04-05T12:33:26.667 回答
0

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

这篇文章对静态的推理提供了一个很好的详细答案:为什么 Java 主方法是静态的?

这篇文章为 main 为什么是 void 提供了一个很好的答案:Why is main() in java void?

于 2012-04-05T12:34:03.633 回答
0

如果不是,为什么不硬编码 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
于 2015-10-18T18:06:59.240 回答
0
             Public static void main(String [] ar)

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

方法的语法是:

返回类型方法名

因此 main 方法与返回类型的 void 一起编写。

数组语法:

数据类型 [] 数组名

方括号表示它是否是维度数组。因为我们有一对方括号,所以它是一维数组。

main方法中单词的含义:

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

static:static是修饰符。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'。

于 2017-03-24T18:16:32.697 回答
-2

如果你为你的应用创建一个新的加载器,你可以改变它。public static void main( String args[] )格式只是在 JVM 上工作的人们发现调用您的 Java 程序的默认解决方案,因此有一个明确方法可以做到这一点。

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

这是取自此页面的代码示例

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

于 2012-04-05T12:37:05.640 回答
-2
  • public-main() 方法必须由类外部和类内部的任何一个使用,因此它的公共

  • 如果我们定义类而不是为该类定义对象,那么静态静态在java中是必需的bcoz,并且仅比我们可以使用该类..但是我们直接使用这个词而不是这个词静态

  • void-for main() 不能返回任何值,如 int 或 char main()-main 是我们可以用来访问 java 未来的函数或方法 String-在 java 中,我们编写的所有内容都视为字符串 args-arguments

于 2012-09-04T17:39:07.817 回答