“加载类时初始化静态变量”究竟是什么意思?我在网上阅读了很多讨论,但我仍感到困惑。第2步是初始化步骤,对吧?然后在第1步“加载类时”会发生什么?
public class NewClass {
static int[] arr; //Step 1
NewClass(){
arr = new int[10]; //Step 2
for(int i= 0;i<10;i++){
arr[i] = i;
}
}
}
答案 0 :(得分:6)
如果要在加载类时初始化它,则应使用static
初始值设定项:
public class NewClass {
static int[] arr; //Step 1
static {
arr = new int[10]; //Step 2
for(int i= 0;i<10;i++){
arr[i] = i;
}
}
}
答案 1 :(得分:4)
在构造函数中初始化静态成员会破坏静态成员的用途,因为它们不属于任何实例,并且您将创建的每个新实例都将覆盖静态数组的值。
您应该在声明静态变量时或在静态初始化块中初始化静态变量。
static int[] arr = new int[10];
或
static {
arr = new int[10];
}
当加载类时,将发生初始化(即执行静态声明和静态初始化块),这在您的应用程序首次访问类的任何成员(构造函数,静态方法,静态变量)时发生。
答案 2 :(得分:1)
步骤2是初始化步骤,对吧?
不,它被称为阵列构造。数组的初始化意味着在第2步之后将其放入其中。
然后在步骤1和#34中发生了什么;当班级被加载&#34;?
加载类时,所有静态变量都使用其默认值进行初始化。如果Object
它的默认值为null
,或者您可以说一个指向任何内容的引用。此时没有为阵列分配内存。
在第2步之前会发生什么?
当使用关键字NewClass
创建类型new
的对象时,将调用构造函数并构造数组并为堆中的10个int值分配内存,并将所有零作为默认值(直到第2步)
第2步后会发生什么?
在第2步之后,您实际上正在初始化数组,即将值放入其中。
static int[] arr; // declaration
arr = new int[10]; // construction
arr[i] = i; // initialization
如果您想了解更多相关信息,请阅读第SCJP Sun Certified Programmer for Java 6页
答案 3 :(得分:0)
当类加载器加载类时,链接器的作业将启动。链接器验证Java代码,它是否按照Java Language&amp; A中给出的规范编写。 JVM。如果找到有效的Java代码,则它开始为字段,方法,接口等分配内存。创建对该内存位置的引用。将引用分配给内存位置后,如果未明确指定,则将所有字段变量,方法,接口等初始化为默认值。否则,它会将设置的任何值指定为其初始值。