【问题标题】:Initializing static variables in java在java中初始化静态变量
【发布时间】:2014-08-20 18:19:18
【问题描述】:

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

【问题讨论】:

  • 类加载时!=类实例化时。

标签: java static initialization


【解决方案1】:

如果你想在类加载时初始化它,那么你应该使用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;
        }
    }
}

【讨论】:

    【解决方案2】:

    在构造函数中初始化静态成员违背了静态成员的目的,因为它们不属于任何实例,并且您将创建的每个新实例都将覆盖静态数组的值。

    您应该在声明静态变量时或在静态初始化块中对其进行初始化。

    static int[] arr = new int[10];
    

    static {
        arr = new int[10];
    }
    

    初始化(即静态声明和静态初始化块的执行)将在加载类时发生,这发生在您的应用程序首次访问类的任何成员(构造函数、静态方法、静态变量)时。

    【讨论】:

    • 那么“加载”是什么意思。 arr = new int[10]; 进行初始化
    • @Bishal "loaded" 意思是我在最后一句中写的。
    • @Eran 我只是检查了一下,一切都和你写的一样,但有一件事 - “当你的应用程序第一次访问任何成员(构造函数、静态方法、静态变量)时会发生这种情况”。我的班级中有一个final static 变量,当我访问它时,我的静态块没有运行(我里面有System.out.println)。当我删除 final 关键字时,static 块确实按预期运行 - 你有什么解释吗?
    • @Eran - 谢谢,这是有道理的,但这也意味着如果我在一个我从不使用的类中有一个健壮的(一些大数据数组)最终静态字段,它将存储在从申请流程开始到结束的记忆——这有点吓人;)
    【解决方案3】:

    第二步是初始化步骤,对吧?

    不,这叫构造数组。数组的初始化意味着将你在第 2 步之后所做的事情放入其中。

    那么第 1 步“加载类时”会发生什么?

    当类被加载时,所有的静态变量都被初始化为它们的默认值。如果是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

    【讨论】:

      【解决方案4】:

      当类加载器加载类时,链接器的工作就开始了。链接器验证 Java 代码,是否按照 Java 语言和 JVM 中给出的规范编写。如果它找到有效的 Java 代码,那么它开始为字段、方法、接口等分配内存。创建对该内存位置的引用。一旦将引用分配给内存位置,如果没有明确指定,所有字段变量、方法、接口等都将初始化为默认值。否则,它会将设置的任何值分配为其初始值。

      【讨论】:

        猜你喜欢
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 2011-08-22
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多