如果你在Java中显式初始化一个Object数组,那么包含"new Object []"与不包括它有什么不同?

Tay*_*pez 10 java arrays initialization object

前言:这个问题已经被问在这里,但我对作者的具体含义特别想知道.

我正在阅读Thinking in Java,第3版.修订版4.0和Eckel在第4章初始化和清理中显示了这个片段:

public class ArrayInit
{
  public static void main(String[] args)
  {
    Integer[] a =
    {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };

    Integer[] b = new Integer[]
    {
      new Integer(1),
      new Integer(2),
      new Integer(3),
    };
  }
}
Run Code Online (Sandbox Code Playgroud)

并说明以下内容:

第一种形式有时很有用,但由于数组的大小是在编译时确定的,因此它更有限.
第二种形式提供了一种方便的语法来创建和调用方法,这些方法可以产生与C的变量参数列表相同的效果(在C中称为"varargs").这些可能包括未知数量的参数以及未知类型.

我从未知道这些与埃克尔描述的不同.据我了解,它们都是静态大小的数组.我不明白第一个是如何比第二个更"有限".

他在说什么?

5go*_*der 4

我想这可能就是作者所指的。

\n\n

从 Java 5 开始,我们可以声明带有可变参数列表的函数。

\n\n
public static int newStyleSum(final int... numbers) {\n    int sum = 0;\n    for (final int number : numbers) {\n        sum += number;\n    }\n    return sum;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它们可以用于:

\n\n
int s = newStyleSum(1, 2, 3, 4);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这个功能只是语法糖。在内部,一个匿名数组被传递给该函数。

\n\n

在我们使用这个语法之前,上面的例子必须写成:

\n\n
public static int oldStyleSum(final int[] numbers) {\n    int sum = 0;\n    for (int i = 0; i < numbers.length; ++i) {\n        sum += numbers[i];\n    }\n    return sum;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

并称为

\n\n
int s = oldStyleSum(new int[]{1, 2, 3, 4});  // "second" form\n
Run Code Online (Sandbox Code Playgroud)\n\n

但不一样

\n\n
int s = oldStyleSum({1, 2, 3, 4});  // "first" form (syntax error)\n
Run Code Online (Sandbox Code Playgroud)\n\n

即使在今天,这仍然是一个语法错误。

\n\n

这可能确实是他所说的。Java 5 于 2004 年问世,因此对于 2002 年的书来说,这是有道理的。

\n\n

新的语法更加灵活,并且 \xe2\x80\x93 重要的是 \xe2\x80\x93 向后兼容,所以我们仍然可以这样做

\n\n
int s = newStyleSum(new int[]{1, 2, 3, 4});\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,更重要的是,

\n\n
int[] numbers = {1, 2, 3, 4};\nint s = newStyleSum(numbers);\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我们愿意的话。

\n