8
class NewClass{
public static void main(String a){
    System.out.print("Hello");
}
}

当我尝试执行上面的代码时,它会显示一个错误,找不到主要方法。但是当我更改public static void main(String a)public static void main(String... a)or时public static void main(String a[])。然后,它工作..!!

所以,我的问题是我们可以用多少种不同的方式编写合法的主方法签名以及这个签名public static void main(String... a)意味着什么?

4

8 回答 8

14

仅仅因为这是Java的要求。

程序的主方法/入口点必须是声明为public static void main(String[] args). 您使用参数声明的方法String相似但不兼容。

数组与单个字符串不同 - 如果有人使用三个命令行参数调用 Java,JVM 将创建一个三元素字符串数组,然后它将如何将其传递给只接受单个字符串的方法?

因此,在这种情况下,您试图基于一个没有 main 方法作为入口点的类来启动 Java 程序。

(之所以String...有效,是因为这是数组参数的语法糖,并编译为具有相同签名的方法。)

于 2012-11-28T11:00:56.577 回答
4

最后,我在Sun Certified Programmer for Java 6一书中找到了我的问题的答案。

第一个问题是,使用 main 方法有多少种不同的合法方式?

合法的主要方法签名是

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

是什么(String... a)意思??

要使用var-args参数声明方法,我们需要跟上一个ellipsis(...)then use 空格,然后是保存接收到的参数的数组的名称。因此,上述术语称为变量参数,这意味着0 到 many

并且,使用可变参数参数的规则是,必须是方法签名中的最后一个参数,并且方法中只能有一个 var-args

例如:

void myfunc(String... a)              //legal
void myfunc(String a...)              //illegal
void myfunc(String a,int... b)         //legal
void myfunc(String... a,int b)        //illegal 
于 2012-12-13T08:54:26.167 回答
3

它在java中的默认值。java 编译器需要一个命令行参数数组。这就是为什么您需要指定字符串 args[] 或 String...

于 2012-11-28T11:00:47.967 回答
2

public static void main(String... a) --> 是一个带有变量参数列表的方法,它在内部(在方法中)被视为一个数组。

合法的主要方法签名:

public static void main(String a[])

static public void main(String a[])

public static void main(String[] a)

static public void main(String[] a)

public static void main(String... a)

static public void main(String... a)

于 2015-02-06T19:39:33.713 回答
2

所有这些都是 Java 中 main 函数的有效/合法声明。

public static void main(String[] args) {
    // code
}

static public void main(String[] args) {
    // code
}

static public void main(String args[]) {
    // code
}

public static void main(String[] MarkElliotZuckerberg) {
    // code
}

public static void main(String... NewYork) {
    // code
}

要记住的要点是——

  • 关键字 public 和 static 是可以互换的,但是是必须的。
  • main 方法的参数可以采用 var-args 语法。
  • 这个名字可以是任何东西..!

只是为了练习.. :P ...这些是无效的主要方法声明的例子 -

static void main(String[] args) {
    // public is missing
}

public void main(String args[]) {
    // static is missing
}

public static int main(String... Java) {
    // return type not void

    return 0;
}

public void Main(String args[]) {
    // "main" not "Main"
}

public void main(string args[]) {
    // "String" not "string"
}

public void main(String.. SayHi) {
    // Ellipses is 3 dots !
}

有些给出错误,而另一些只是重载主要方法......希望这会有所帮助......!如果是这样,请通过评论告诉我..!

来源 - Java 编程理论教程

于 2015-06-03T19:12:14.767 回答
1

public static void main(String a[])是典型 Java 程序的主要入口点签名。所以你应该继续使用这个方法签名。

于 2012-11-28T11:00:13.833 回答
1

Java 运行时尝试查找名称为“main”且参数类型为“String[]”的方法。这就像使用反射来查找类型参数为 String[] 的方法。

还使用 String[] 以便运行时可以传递提供的程序参数或命令行参数。这就像运行时用空格字符标记参数,然后调用这个名为“main”的方法。

方法 main 必须声明为 public、static 和 void。它必须接受一个作为字符串数组的参数。此方法可以声明为

public static void main(String[] args)
or

public static void main(String... args)

也可以参考 Oracle Java 规范文档了解更多

第 12 章执行 - 第 12.1.4 节调用 Test.main

于 2012-11-28T11:21:47.403 回答
0

您需要确切的String[] args参数(它是一个数组)。

原因是您需要使用指定的签名main()声明方法(并且方法签名包含其名称、参数数量和参数类型)。

因此,如果您创建的函数具有不同的参数类型(字符串与字符串数组),则无法识别。

于 2012-11-28T10:59:18.510 回答