Java古怪的数组行为

时间:2010-08-17 16:43:20

标签: java arrays

为什么这样做有效:

int[] array = {1, 2, 3};

但这不是:

int[] array;
array = {1, 2, 3};

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

array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;

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

6 个答案:

答案 0 :(得分:13)

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

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

int[] array;
array = new int[] {1, 2, 3};

答案 1 :(得分:5)

此处的{...}构造在Java中称为数组初始值设定项。这是一种特殊的速记,仅适用于某些语法结构:

  

JLS 10.6 Array Initializers

     

数组初始值设定项可以在声明中指定,也可以作为数组创建表达式的一部分指定,创建数组并提供一些初始值值。 [...]数组初始化程序编写为逗号分隔的表达式列表,用大括号"{""}"括起来。

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

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

nums = new int[] { 4, 5, 6 };   // array creation

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

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

// neither declaration nor array creation,
// array initializer syntax not available

另请注意:

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

以下是一个例子:

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

以上版画:

1 
2 3 
4 5 6 

另见

答案 2 :(得分:4)

{}是语法糖,允许您在初始化时使用值填充数组。

答案 3 :(得分:4)

你也可以这样做:

array = new int[]{1, 2, 3};

我不确定为什么有必要在一个版本的右侧指定类型,而不是在另一个版本中指定类型。

答案 4 :(得分:2)

用于初始化的curly braces {}只能在数组声明语句中使用。 您可以使用:

int[] array = new int[] {1,2,3};  // legal

但不是:

array = {1, 2, 3}; //illegal

http://www.janeg.ca/scjp/lang/arrays.html

答案 5 :(得分:0)

数组是一个参考。这意味着当你写array int[];时,数组将等于null。 如果你想使用它,你需要先按array = new int[3]分配数组,现在你可以填充它。

array[0] = 1;
array[1] = 2;

现在,java有两个语法糖用于填充数组。你可以写 arr int[] = {1,2,3}arr int[] = new int[]{1,2,3}

Java将在场景后面分配并填充它,但这只有在减速时才可能。