在java中初始化静态变量

时间:2014-08-20 18:19:18

标签: java static initialization

“加载类时初始化静态变量”究竟是什么意思?我在网上阅读了很多讨论,但我仍感到困惑。第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;
        }
    }
}

4 个答案:

答案 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代码,则它开始为字段,方法,接口等分配内存。创建对该内存位置的引用。将引用分配给内存位置后,如果未明确指定,则将所有字段变量,方法,接口等初始化为默认值。否则,它会将设置的任何值指定为其初始值。