为什么数组类型的类变量可以';不能在声明后初始化,但可以在Java中的方法内初始化?

为什么数组类型的类变量可以';不能在声明后初始化,但可以在Java中的方法内初始化?,java,Java,对于以下代码,它给出了一个编译错误: public class Main { int[] array = new int[10]; array[5] = 10; public static void main(String[] args) { } } 虽然下面的代码没有给出编译错误,但两者的区别是什么 public class Main { public static void main(String[] args) { int[]

对于以下代码,它给出了一个编译错误:

public class Main {

    int[] array = new int[10];
    array[5] = 10;
    public static void main(String[] args) {
    }
}
虽然下面的代码没有给出编译错误,但两者的区别是什么

public class Main {


    public static void main(String[] args) {
        int[] array = new int[10];
        array[5] = 10;
    }

}

对于要执行的代码,它必须位于变量声明处或方法内部。在第一个示例中,
newint[5]
位于实例变量的声明处,但是
array[5]=10既不在声明中,也不在方法中。在第二个示例中,两者都在一个方法中

注意:数组是基于零的,
数组[5]
将抛出
索引自动边界异常
。最小索引为0,最大索引为4,共有5个条目。

您可以这样做:

public class Main {

    int[] array = new int[10];
    {
        array[5] = 10;
    }

    public static void main(String[] args) {
    }
}

至于“为什么”这个问题,答案是-因为Java语言规范不允许在类体中直接使用任意语句。

以下不是声明,而是声明:

array[5] = 10;
Java不知道何时执行它,因为它不属于定义良好的控制流

如果要一次声明并初始化数组,可以执行以下操作:

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

这将初始化数组中的每个元素。

不要忘记初始化块。代码也可以存在于那里。是的,static{}是一个特殊的命名(或实际上未命名)方法,但它仍然是一个方法。并非所有初始化块都是静态的。感谢Rutte,我已经将索引更新为10个值。