我想在实例级别初始化数组,但我无法在这里初始化代码
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]);
}
}
答案 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};