【问题标题】:2 different signatures for main method主要方法的2个不同签名
【发布时间】:2014-05-25 23:47:14
【问题描述】:

我们可以使用这 3 个点在方括号的位置创建一个数组,就像我们上面使用的那样吗? 如果不是,那为什么我们只在 main 中使用这个声明??

public static void main(String[] args)

or

public static void main(String... args)

【问题讨论】:

  • 因为[]... 更常见,而且有时更容易解释......但当然两者都有效
  • Can we use those 3 dots to create an array at the place of square brackets 尝试编码..
  • 您可以互换使用它们。
  • @lakshman 我尝试声明一个整数数组,但 3 点数组声明不起作用。因为它在 (String...args) 中工作。
  • 在下面查看我的答案 Integer[] ,或者任何数组都可以工作

标签: java arrays main


【解决方案1】:

这不是两个不同的签名 - 在引擎盖下,它是相同的签名;不同之处在于编译器使用三个点来允许使用变量参数列表进行调用。

由于您从不直接调用main(好吧,无论如何,您不应该如此)差异对您来说并不重要。签名的第一种形式是您在 Java 基础书籍中看到的第一件事,因此应该坚持使用方括号,以便让您的代码的读者“立即熟悉”。

【讨论】:

    【解决方案2】:

    我知道这已经回答了,但是如果这可以帮助您了解更多..

    针对您的具体问题 -

    我们可以用这 3 个点在正方形的地方创建一个数组吗 括号

    直接的答案是,这里是 java 文档: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs

    (String... args)
    

    这里主线程调用 main 方法并传递一些参数。参数声明的类型是 Array,但在调用方法时,您可以传递一个或多个 String 对象或 String 对象的数组,作为该函数的参数。在这种情况下, main() 没有特殊之处。

    此外,您可以通过以下任何方式调用 myMethod(String.. args):

    myMethod(); // Likely useless, but possible
    myMethod("one", "two", "three");
    myMethod("one");
    myMethod(new String[]{"a", "b", "c"});
    

    重要提示1:以这种方式传递的参数始终是一个数组——即使只有一个。确保在方法体中以这种方式对待它。

    重要说明2:获取...的参数必须是方法签名中的最后一个。所以,myMethod(int i, String... strings) 可以,但是 myMethod(String... strings, int i) 不行。

    您还提到您尝试使用 'Integer[]' 但没有成功, 这是一个例子

    public static void main(String[] args) {
            Integer[] a = new Integer[4];
            a[0] = 10;
            a[1] = 20;
            a[2] = 30;
            a[3] = 40;
            myMethod(a);
        }
    
        public static void myMethod(Integer... args) {
            for (Integer i : args) {
                System.out.println(i);
            }
        }
    

    【讨论】:

      【解决方案3】:

      是的,您在这里重载了 main 方法,并且两者都可以调用执行,因为 main 方法的参数类型是 ArrayString...

      JLS 12.1.4中提到

      方法 main 必须声明为 public、static 和 void。它必须 指定一个声明类型为数组的形式参数 (§8.4.1) 细绳。因此,可以接受以下任一声明:

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

      【讨论】:

        【解决方案4】:

        这样看。如果 java 使用反射来查找 main 方法,它会做这样的事情(第 6 行)

        public class Main {
        
            public static void main(String[] args) throws Exception {
                if (!(args.length == 1 && args[0].equals("Hello World"))) {
                    System.out.println("You did not recurse!");
                    Main.class.getDeclaredMethod("main", String[].class).invoke(null, (Object) new String[]{"Hello World"});
                } else {
                    System.out.println("You recursed!");
                }
            }
        }
        

        它会找到一个用...[] 声明的函数,然后调用该函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-02
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多