【问题标题】:legal main method signature in javajava中的合法主方法签名
【发布时间】:2012-11-28 10:58:21
【问题描述】:
class NewClass{
public static void main(String a){
    System.out.print("Hello");
}
}

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

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

【问题讨论】:

  • 这是预期的行为。真正的main数学签名必须public static void main(String... a)或等效的public static void main(String[] a)。你可以有任意数量的函数称为main——只要它们的签名不同. 但是即便如此,只有具有正确签名的那个会被视为 Java 应用程序的入口点。
  • 也相当于public static void main(String[] a)
  • 基本的基础。请谷歌 java 'Hello world' 示例
  • 因为 main 方法的参数是字符串数组而不是字符串变量。对于两个有效选项,您需要阅读以下链接。 stackoverflow.com/questions/4089572/…
  • main() 方法接受一个参数:字符串数组。此参数是运行时系统将命令行参数传递给您的应用程序的机制。

标签: java main signature main-method


【解决方案1】:

只是因为这是 Java 的要求。

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

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

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

String... 起作用的原因是因为这是数组参数的语法糖,并编译为具有相同签名的方法。)

【讨论】:

    【解决方案2】:

    最后,我在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(...),然后使用空格,然后使用将保存接收到的参数的数组的名称。因此,上述术语称为 变量参数,表示 0 到许多

    并且,使用可变参数参数的规则是,必须是方法签名中的最后一个参数,并且方法中只能有一个 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 
    

    【讨论】:

    • kathy sierra 书中的哪一页
    • 好久没有更新了!但是您在第三条语句中有错字void myfunc(String a,int.. b) 它应该是int... b 而不是int.. b ^^!
    【解决方案3】:

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

    【讨论】:

    • 这意味着......我们也可以使用 ... 声明数组。是吗??
    • 它实际上可变数量的参数。您可以使用 this 将值传递给函数。但不能在函数内声明普通数组。
    【解决方案4】:

    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)

    【讨论】:

      【解决方案5】:

      所有这些都是 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 !
      }
      

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

      来源 - Java Tutorials on Theory of Programming

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          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 规范文档了解更多

          Chapter 12 Execution - Section 12.1.4 Invoke Test.main

          【讨论】:

          • 顺便说一句,使用名称“main”作为执行的开始只是一个约定。
          【解决方案8】:

          您完全需要String[] args 参数(它是一个数组)。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多