Java古怪的数组行为

ava*_*arX 4 java arrays

为什么这有效:

int[] array = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

但这不是:

int[] array;
array = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

如果我有一个数组实例变量,我想在我的构造函数中初始化它肯定我不必去

array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
Run Code Online (Sandbox Code Playgroud)

我觉得我在这里错过了一些东西?

mis*_*tor 13

字面语法即{}只能在声明期间初始化时使用.

在其他地方,您可以执行以下操作:

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


pol*_*nts 5

{...}这里的构造在Java中称为数组初始化器.这是一种特殊的速记,仅适用于某些语法结构:

JLS 10.6阵列初始化器

一个数组初始化可被指定在一声明,或作为部分数组创建表达式,创建一个数组并提供一些初始值.[...]数组初始化写为逗号分隔的表达式列表,括在大括号"{""}".

如指定的那样,您只能在声明或数组创建表达式中使用此简写.

int[] nums = { 1, 2, 3 };       // declaration

nums = new int[] { 4, 5, 6 };   // array creation
Run Code Online (Sandbox Code Playgroud)

这就是以下不编译的原因:

// DOES NOT COMPILE!!!
nums = { 1, 2, 3 };

// neither declaration nor array creation,
// array initializer syntax not available
Run Code Online (Sandbox Code Playgroud)

另请注意:

  • 可能会出现一个尾随的逗号; 它会被忽略
  • 如果要初始化的元素类型本身就是一个数组,则可以嵌套数组初始值设定项

这是一个例子:

    int[][] triangle = {
            { 1, },
            { 2, 3, },
            { 4, 5, 6, },
    };
    for (int[] row : triangle) {
        for (int num : row) {
            System.out.print(num + " ");
        }
        System.out.println();
    }
Run Code Online (Sandbox Code Playgroud)

以上打印:

1 
2 3 
4 5 6 
Run Code Online (Sandbox Code Playgroud)

也可以看看