17

Java初始化静态变量的时间顺序

 3 years ago
source link: https://segmentfault.com/a/1190000038219072
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1. 开始吧!

今天,我们来探讨交流下静态变量初始化过程。Java虚拟机在类加载期间也同样遵循这个过程。

2. 初始化过程

在较高的层次上,JVM执行以下步骤:

A3aUJrU.jpg!mobile

首先,加载并链接类。然后,这个过程的“初始化”阶段处理静态变量初始化。最后,调用与类关联的 main 方法。

在接下来的讨论中,我们来探索下类变量初始化。

3. 类变量

在Java中,静态变量也称为类变量。也就是说,它们属于一个类,而不是一个特定的实例。因此, 类初始化的时候也将初始化静态变量

相反, 类的实例 初始化的时候也将初始化 实例变量(非静态变量) 。类的所有实例共享该类的静态变量。

StaticVariableDemo 类为例:

public class StaticVariableDemo {  
    public static int i;
    public static int j = 20;
 
    public StaticVariableDemo() {}
}

First, the JVM creates a Class object for the class StaticVariableDemo . Next, the static field initializers assign a meaningful default value to the static fields. In our example above, the class variable i is first initialized with an int default value of zero .

首先,JVM为 StaticVariableDemo 类创建一个 Class 对象。接下来, static 修饰的字段将会被赋予一个有意义的默认值。在上面的例子中,类变量 i 首先使用用 int 的默认值0 来初始化

代码的书写顺序适用于静态字段初始化顺序。首先, i 将初始化,然后 j 将被初始化。完成初始化 之后, 类及其静态成员将对其他类可见。

4. 静态块中的变量

再举一个例子:

public class StaticVariableDemo {  
    public static int z;
 
    static {
        z = 30;
    }
    public StaticVariableDemo() {}
}

在这种情况下,变量初始化将按顺序进行。首先,JVM最初将默认的 int 值0赋给变量 z 。然后,在 static 块中,它被更改为30。

5. 静态嵌套类中的变量

最后,让我们以外部 StaticVariableDemo 类中的嵌套类为例:

public class StaticVariableDemo {  
    public StaticVariableDemo() {}
    
    static class Nested {
        public static String nestedClassStaticVariable = "test";
    }
}

在本例中, StaticVariableDemo 类加载 Nested 类。它将初始化静态变量 nestedClassStaticVariable

6. 最后

在这篇短文中,我们简要地解释了静态变量初始化。有关详细信息,请查看 Java语言规范 .

如果你觉得文章还不错,记得关注公众号: 锅外的大佬

刘一手的博客

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK