Java 我可以像初始化成员/字段变量一样在方法外部初始化数组吗

Java 我可以像初始化成员/字段变量一样在方法外部初始化数组吗,java,Java,我想在实例级别初始化数组,但无法初始化。下面是代码 public class Arrays { /** Creates a new instance of Arrays */ int []arr2=new int[2]; arr2[0]=20;//error at compile time arr2[1]=30;//error public Arrays() { } public static voi

我想在实例级别初始化数组,但无法初始化。下面是代码

public class Arrays {

    /** Creates a new instance of Arrays */

        int []arr2=new int[2];
        arr2[0]=20;//error at compile time
        arr2[1]=30;//error 


    public Arrays() {        }
    public static void main(String []args)
    {
        System.out.println("Element at 0th position is "+arr2[0]);
        System.out.println("Element at 1th position is "+arr2[1]);
    }


}

如果您想在将其声明为类成员时初始化,请执行以下操作

class MyClass{
    int []arr2={20,30};
}  
下面是一条语句,您不能在您试图执行的位置编写语句

arr2[0]=20;//error at compile time

这是初始化的方法

int[] arr2 = { 20, 30 };

为了完整性,而不是美观性,以下几点可行:

public class Arrays {

        int []arr2=new int[2];
        // this is a field definition

        { // and this is a dynamic initializer,
          // it runs after the constructor's
          // first line
            arr2[0]=20;
            arr2[1]=30;
        }
}
但当然,按照其他答案初始化数组是更好的做法


要回答这个问题:

在班级级别,只允许以下内容:

  • 构造函数定义
  • 方法定义
  • 内部类定义(包括接口和枚举)
  • 字段定义
  • 初始值设定项块(静态或动态/实例)
不允许使用语句,它们必须嵌套在上述语句之一中


关于Adriaan Koster的评论:


它们称为实例初始值设定项块。“静态”的反面是OO中的“实例”,而不是“动态”

的确,实例是更好的OO术语。但从语言学角度来说,动态是静态的对立面,所以我会坚持使用动态

实例初始值设定项块由编译器复制到每个构造函数中,并在构造函数代码之前而不是之后运行

实际上,它们被复制到构造函数的第一行之后(隐式或显式
this()
super()
调用)。因此,从技术上讲,我们要么是对的,要么是错的(初始值设定项在第一行之后,在其余行之前运行)

澄清(关于第一行):

  • 每个类至少有一个构造函数。如果不添加一个,编译器将添加一个没有参数的公共构造函数
  • 每个构造函数都以调用同一类的另一个构造函数
    this(args)
    或超类的构造函数(
    super(args)
    )开始。如果不编写其中一行,编译器将插入一个不带参数的
    super()
    调用。所以每个构造函数至少有一条语句。初始值设定项在初始语句之后运行
参考资料:


    • 类似于arr2[0]=20的代码不能放在类级别,它必须位于方法或代码块内部。幸运的是Java允许int[]arr={20,10}

      它们称为实例初始值设定项块。“静态”的反面是OO中的“实例”,而不是“动态”。实例初始值设定项块由编译器复制到每个构造函数中,并在构造函数代码之前运行,而不是在构造函数代码之后运行。@SeanPatrickFloyd我明白了要点,但是,到目前为止,还没有人解释为什么在OOPS概念/对象创建概念中不可能,或者我们可以简单地说Java不允许。@ranjan您只能在代码块内执行代码,就这么简单。带有初始化的字段声明是一种特殊情况,它们实际上是在构造函数(代码块)内执行的。对于实例初始值设定项块也是如此。感谢@SeanPatrickFloyd分享了很好的信息“只能在代码块内执行代码”。我知道方法,但问题是我可以在实例级别初始化它吗