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分享了很好的信息“只能在代码块内执行代码”。我知道方法,但问题是我可以在实例级别初始化它吗