为什么Java';s main方法使用字符串[]而不是字符串点

为什么Java';s main方法使用字符串[]而不是字符串点,java,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

数组参数声明在调用发生时会导致语法错误。但是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所强调的,字符串。。。与字符串[]不同。它们通常是不可互换的,所以不要试图以同样的方式对待它们(即使我可以说出它们看起来可互换的原因)。它们在main()的情况下可以互换。在
main()
的情况下,有些人可能会称之为sugar。

在该语言的更高版本中添加了Varargs。事实上,如果希望
main

在该语言的更高版本中添加了varargs,则可以在支持varargs的Java版本中使用
String…
而不是
String[]
。实际上,如果希望
main

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

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

一般来说,您可以使用varargs指定一个方法以可变数量的参数作为输入的事实。因此,集合、数组和单个对象可以在java中交换发送。这简化了方法,但也存在一些缺陷

如果条件允许,Varargs自然工作

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

可以看出,main(String[]args)自然适合使用var args(也就是说,args位于方法的末尾,它是最后一个参数,因此它实际上与声明“String…args”为最后一个参数相同)。为了更好地理解它们,我建议编写这两种方法并观察编译器的工作:


因此,为了回答您的问题:您很幸运:)您的方法正在向main方法发送数量可变的参数,java的新版本允许您将var args作为main的输入

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

如果条件允许,Varargs自然工作

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

可以看出,main(String[]args)自然适合使用var args(也就是说,args位于方法的末尾,它是最后一个参数,因此它实际上与声明“String…args”为最后一个参数相同)。为了更好地理解它们,我建议编写这两种方法并观察编译器的工作:


因此,为了回答您的问题:您很幸运:)您的方法正在向main方法发送数量可变的参数,java的新版本允许您将var args作为main的输入

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

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

t.method1(0, "a", "b");
这对于varargs调用很好,但只要将varargs参数切换到
对象[]
,前面的方法调用就需要更改为:

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

因为数组允许多态性。相反,如果您的方法使用varargs,那么传递一个数组就可以了。因此您可以看到,
main
方法没有不一致之处。
String[]
String…
都可以工作,因为您看到的问题是如何调用方法,而不是如何定义方法

更新:因为您似乎在寻找细节,上的JVM说

Java虚拟机通过调用main方法开始执行 某个指定的类,向其传递单个参数,即数组 弦乐

它说,等等

如果最后一个形式参数是T类型的变量arity参数, 可以考虑定义T[]类型的形式参数。方法 然后是一个变量算术方法。否则,它是一个固定数 方法变量arity方法的调用可能包含更实际的 参数表达式优于形式参数。所有的实际论点 与前面的形式参数不对应的表达式 将计算变量arity参数,并
t.method(0, new String[]{"a", "b"});