我可以初始化方法之外的数组,就像我们初始化成员/字段变量一样

时间:2010-12-31 07:20:42

标签: 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 void main(String []args)
    {
        System.out.println("Element at 0th position is "+arr2[0]);
        System.out.println("Element at 1th position is "+arr2[1]);
    }


}

4 个答案:

答案 0 :(得分:6)

如果要在将其声明为类成员时进行初始化,请执行此操作

class MyClass{
    int []arr2={20,30};
}  

以下是一个声明,你不能在你想要的地方写声明

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

答案 1 :(得分:5)

这是初始化的方法

int[] arr2 = { 20, 30 };

答案 2 :(得分:3)

为了完整,不漂亮,以下方法将起作用:

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()调用。所以每个构造函数至少有一个语句。初始化程序在初始语句之后运行。

<强>参考:

答案 3 :(得分:0)

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