为什么我需要`{...}`来填充类范围中的数组?

时间:2015-04-29 07:46:03

标签: java

以下程序有什么问题?

package test;

public class Test {

    byte[] array = new byte[2];
    array[0] = 'A';
    array[1] = 'B';
}

看,IDE指出了一些问题(点击放大):

enter image description here

换句话说,为什么我应该将填充线移动到另一个内部范围,如下所示:

package test;

public class Test {

    byte[] array = new byte[2];
    {
        array[0] = 'A';
        array[1] = 'B';
    }
}

IDE对上述程序没有任何问题。

3 个答案:

答案 0 :(得分:6)

在此代码段中,您尝试在任何方法之外对数组进行一些分配(例如array[0] = 'A'

public class Test {
    byte[] array = new byte[2];
    array[0] = 'A';
    array[1] = 'B';
}

而在此片段中,您可以在实例初始化程序块

中进行分配
public class Test {
    byte[] array = new byte[2];
    {
        array[0] = 'A';
        array[1] = 'B';
    }
}

如果您想在代码中执行此操作,则可以在init方法中执行此操作

public class Test {
    byte[] array = new byte[2];

    void initArray() {
        array[0] = 'A';
        array[1] = 'B';
    }
}

答案 1 :(得分:1)

示例中的{....}称为initialization blocks。它们用于设置“final”静态变量的值,而构造函数则不能。在你的情况下你不需要它们,你可以在你的构造函数中初始化你的数组。

如果没有初始化器,它首先没有工作的原因是因为它只是无效的java语法。

另请参阅thisthis了解详情

答案 2 :(得分:1)

与使用实例初始化程序块相比,您可以在一个简洁的单行中执行您想要的操作,如下所示:

// much better, and much smaller
public class Test {
    byte[] array = {'A', 'B'};
}