为什么Java的主要方法使用String []而不是String dot dot dot

时间:2011-10-23 01:22:19

标签: java

数组参数声明会导致语法错误发生调用。然而,main方法使用String []而不是String ...我如何理解这种不一致?

package domain.test;

import utilities.CConsole;

public class Tester {
    public static void main(String[] args) 
    {
        Test1 t = new Test1();
        t.method1(0); // the array will exist but have a length of zero
        t.method1(0, (Object[])null); // the array will not exist
        t.method1(0, "a");
        t.method1(0, "a", "b");
        CConsole.pw.format("\n");

        t.method2(0); // the array will exist but have a length of zero
        t.method2(0, (String[])null); // the array will not exist
        t.method2(0, "a");
        t.method2(0, "a", "b");
        CConsole.pw.format("\n");
    }
}

class Test1 {
    void method1(int number, Object... args) // Object[] causes syntax errors
    {
        if (args == null)
            CConsole.pw.format("args == null\n");
        else
        {
            CConsole.pw.format("args != null    ");
            CConsole.pw.format("args.length %d\n", args.length);
        }
    }

    void method2(int number, String... args) // String[] causes syntax errors
    {
        if (args == null)
            CConsole.pw.format("args == null\n");
        else
        {
            CConsole.pw.format("args != null    ");
            CConsole.pw.format("args.length %d\n", args.length);
        }
    }
}

如何解释不一致?

对于说它编译的人包括以下内容:要获得此错误,请将method1()更改为使用Object []。

摘要编辑:这一课似乎就是这样。正如@Andrew Barber强调的那样,String ...与String []不同。它们are not通常可以互换,所以不要试图以同样的方式对待它们(尽管我可以说出它们看起来可以互换的原因)。在main()的情况下,它们 可互换。在main()的情况下,有些人可能称之为糖。

5 个答案:

答案 0 :(得分:5)

在该语言的更高版本中添加了Varargs。实际上,如果你想要String ...,你可以在支持varargs的Java版本中使用String[]而不是main

答案 1 :(得分:3)

我认为你对有效的数组参数看起来很困惑。 varargs参数意味着您可以传递0或更多任何类型的定义。如果没有歧义,你可以传递一个数组,数组的内容将扩展到varargs参数。

另一方面,数组参数意味着您必须传递一个数组。使用Object[]String[]替换varargs参数时,示例中的错误来自您调用方法的方式。例如:

t.method1(0, "a", "b");

这适用于varargs调用,但只要将varargs参数切换为Object[],之前的方法调用就需要更改为:

t.method(0, new Object[]{"a", "b"});

t.method(0, new String[]{"a", "b"});

因为数组允许多态性。相反,如果你的方法使用varargs,传递数组就可以了。所以你看,main方法没有不一致。 String[]String...都有效,因为您遇到的问题涉及方法的方式,而不是如何定义

更新:由于您似乎在寻找细节,5.2 Virtual Machine Start-Up上的JVMS说

  

Java虚拟机通过调用方法main来开始执行   一些指定的类,传递一个参数,这是一个数组   字符串。

并在8.4.1 Formal Parameters,它说

  

如果最后一个形式参数是类型为T的变量arity参数,   它被认为是定义T []类型的形式参数。方法   然后是一个可变的arity方法。否则,它是一个固定的arity   方法。变量arity方法的调用可能包含更多实际值   参数表达式比形式参数。所有的实际论点   表达式与前面的形式参数不对应   将评估变量arity参数并存储结果   到将传递给方法调用的数组。

因此,在应用程序启动时调用main方法总是传递String[],并且相应的方法总是将varargs参数作为数组接收,因此在任何地方都没有任何不一致。

答案 2 :(得分:2)

通常,您可以使用varargs指定方法将可变数量的参数作为输入这一事实。因此,集合,数组和简单的单个对象可以在java中互换发送。这简化了方法,但有一些问题。

如果

,Varargs会自然地工作

1)它们位于方法签名的END处 2)您定义为var arg的数据类型是线性的(即数组或集合)。

正如您所知,main(String [] args)因此非常适合使用var args(也就是说,args位于方法的末尾,它是最后一个参数,因此它实际上与将“String ... args”声明为最后一个参数)。为了更好地理解它们,我建议编写这两种方法并观察编译器的作用:

所以回答你的问题:你很幸运:)你的方法是向main方法发送可变数量的参数,新版本的java允许你将var args作为main的输入。

答案 3 :(得分:0)

简短且唯一正确的答案是您可以使用其中一种。

答案 4 :(得分:-4)

String []表示字符串数组。拥有单个字符串是不够的,因为您可能希望使用更多参数运行程序。所谓的“不一致”对于面向对象技术来说是正常的。来自不同类的两个对象可能表现不同。只有初学者称之为“不一致”。阅读面向对象的范例,您将能够自己找到答案。