用值初始化数组 - 我是否需要明确实例化类?

20

我经常看到数组被这样初始化:

String[] array = new String[] { "foo", "bar", "baz" };

但是阅读语言基础-数组可以发现,短语法不需要显式实例化构造函数:

Alternatively, you can use the shortcut syntax to create and initialize an array:

 int[] anArray = { 
     100, 200, 300,
     400, 500, 600, 
     700, 800, 900, 1000
 };

因此,假设有这两种初始化方法:

String[] array = new String[] { "foo", "bar", "baz" };
String[] array2 = { "foo", "bar", "baz" };

这两者之间有什么区别吗?它们似乎都能正常工作,那么我应该假设第二个隐式调用了new String[],第一个只是更冗长的方式,还是背后有更多的东西? 从Java开始,如果这个问题太蠢,请原谅,但我在网上找不到任何关于这个问题的信息。
3个回答

21
这两种方法是等价的。但需要注意的是,简洁语法只能用于变量声明中。在变量声明之外,您必须使用冗长的语法。
    String[] array;
    array = new String[] { "foo", "bar", "baz" }; // OK

    String[] array2;
    array2 = { "foo", "bar", "baz" };             // ERROR

有关讨论,请参见此答案


7

这两者有什么区别吗?

最终结果没有区别。然而,根据JLS § 10.6,你不能在每个上下文中使用数组初始化器语法。

在声明(§8.3, §9.3, §14.4)中可以指定数组初始化程序,或作为数组创建表达式的一部分(§15.10),以创建数组并提供一些初始值。

1
我确实喜欢规范链接,非常感谢。但是我认为NPE的答案对于未来可能会阅读问题的Java初学者来说更清晰/更简单。无论如何,两者都加一分。=] - Fabrício Matté

0

由于数组被设计为可变的,因此每个数组都是一个新实例是有意义的。

String[] array1 = { "foo", "bar", "baz" };
String[] array2 = { "foo", "bar", "baz" };

即修改array1不会影响array2


1
我有一个不错的面向对象基础,并且知道每个数组都是一个新实例,问题特别在于new String[]是否会对数组的初始化产生任何影响。 - Fabrício Matté

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接