【问题标题】:Initializing array with values - should I explicitly instance the class or not?用值初始化数组 - 我是否应该显式地实例化该类?
【发布时间】:2013-03-03 01:57:56
【问题描述】:

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

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

但阅读Language Basics - Arrays 表明短语法不需要显式实例化构造函数:

或者,您可以使用快捷语法来创建和 初始化一个数组:

 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 开始,如果这个问题太愚蠢了,很抱歉,但我在网络上找不到任何相关信息。

【问题讨论】:

    标签: java


    【解决方案1】:

    这两种方法是等价的。但是请注意,简洁的语法只能用于变量声明。外部变量声明你必须使用详细的语法:

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

    如需进一步讨论,请参阅this answer

    【讨论】:

      【解决方案2】:

      这些有什么区别吗?

      最终结果没有区别。但是,根据the JLS § 10.6, you cannot use the array initializer synax in every context.

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

      【讨论】:

      • 我很喜欢规范链接,非常感谢。但我相信 NPE 的答案对于未来可能会阅读该问题的 Java 初学者来说更清晰/更简单。无论如何+1。 =]
      【解决方案3】:

      由于数组旨在是可变的,因此每个数组都是一个新实例是有意义的

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

      即修改array1 不会影响array2

      【讨论】:

      • 我有一个不错的 OO 基础,并且了解每个数组都是一个新实例,问题具体是 new String[] 是否对数组的初始化有任何影响。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2011-07-17
      • 2017-11-09
      相关资源
      最近更新 更多