如果你';在Java中重新显式初始化对象数组,包括;“新对象[]”;不同于不包括它?

如果你';在Java中重新显式初始化对象数组,包括;“新对象[]”;不同于不包括它?,java,arrays,object,initialization,Java,Arrays,Object,Initialization,前言:有人问过这个问题,但我想知道作者的具体意思 我正在通读《Java思考》,第三版,修订版4.0,Eckel在第4章“初始化和清理”中展示了这段代码: 并声明如下: 第一种形式有时很有用,但由于数组的大小是在编译时确定的,因此它的限制更大。 第二种形式提供了一种方便的语法来创建和调用方法,这些方法可以产生与C的变量参数列表(在C中称为“varargs”)相同的效果。这些参数可以包括未知数量的参数以及未知类型 我从来没有像埃克尔描述的那样知道这些是不同的。据我所知,它们都是静态大小的数组。我不明

前言:有人问过这个问题,但我想知道作者的具体意思

我正在通读《Java思考》,第三版,修订版4.0,Eckel在第4章“初始化和清理”中展示了这段代码:

并声明如下:

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

我从来没有像埃克尔描述的那样知道这些是不同的。据我所知,它们都是静态大小的数组。我不明白为什么第一个比第二个更“有限”


他在说什么?

他似乎指的是数组初始值设定项,特别是
新整数[]
。给出了使用显式初始值设定项的步骤

Other.main(new String[]{ "fiddle", "de", "dum" }); 

要显示将数组传递给方法的有用性,如果没有数组初始值设定项表达式是不可能的,这是没有任何意义的

这是:

这有时很有用,但由于数组的大小是在编译时确定的,所以它的限制更大。初始值设定项列表中的最后一个逗号是可选的。(此功能便于维护长列表。)

这里的“This”指的是“使用大括号括起来的列表初始化对象数组”,这是真的。看起来好像有人做了一个糟糕的编辑,认为“这个”指的是“第一种形式”

它接着说,第二种形式是模拟varargs的一种有用的方式,这在当时是正确的,但Java已经得到了应用。(第一种形式只能在数组声明中使用,不能在方法调用中使用,因此对varargs不有用)。

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

自Java5以来,我们可以使用变量参数列表声明函数

它们可以按如下方式使用:

int s = newStyleSum(1, 2, 3, 4);
这个特征仅仅是语法上的糖分。在内部,一个匿名数组被传递给函数

在使用此语法之前,上面的示例必须编写为:

public static int oldStyleSum(final int[] numbers) {
    int sum = 0;
    for (int i = 0; i < numbers.length; ++i) {
        sum += numbers[i];
    }
    return sum;
}
但并非如此

int s = oldStyleSum({1, 2, 3, 4});  // "first" form (syntax error)
即使在今天,这仍然是一个语法错误

这可能就是他所说的。Java5于2004年问世,因此对于2002年的一本书来说,它是有意义的

新语法更灵活,更重要的是向后兼容,因此我们仍然可以这样做

int s = newStyleSum(new int[]{1, 2, 3, 4});
或者更重要的是,

int[] numbers = {1, 2, 3, 4};
int s = newStyleSum(numbers);

如果我们愿意的话。

我不知道他在说什么;这些都是完全相同的。要么你断章取义地引用,要么他不知道自己在说什么。(我认为可能性是50:50。)我认为这是他的书中的一个错误。有可能吗,他所说的“第二种形式”实际上是指像
Integer[]nums=newinteger[n]这样的表达式
其中
n
是运行时表达式?我无法理解“C的变量参数列表”的含义,因为Java也支持这一点,只是它更方便、更安全(与此无关)。我刚刚查看了第4rth版-现在在上面引用的示例之后,文本说-
,尽管第一种形式很有用,它的局限性更大,因为它只能在定义数组的位置使用。您可以在任何地方使用第二个和第三个表单,甚至在方法调用内部。例如,您可以创建一个字符串对象数组以传递给另一个方法的main(),为该main()提供备用命令行参数:
。我正在阅读版本4.0,我在问题中输入的文本是从该版本复制的。“不过,你说的有道理。@iammartos啊,我没注意到。”。是的,只是一个很糟糕的编辑。
int s = oldStyleSum({1, 2, 3, 4});  // "first" form (syntax error)
int s = newStyleSum(new int[]{1, 2, 3, 4});
int[] numbers = {1, 2, 3, 4};
int s = newStyleSum(numbers);