Java类初始化过程
我们使用Java编程离不开的必然是类,所以我们今天来了解一下类的初始化过程。
首先创建两个类分别为“Demo”和“SuperDemo”
然后我们在SuperDemo.java文件中写入一些代码
public class SuperDemo {
public static String a = "父类静态变量";
protected String b = "父类的成员变量";
static {
System.out.println("父类的静态初始块");
}
{
System.out.println("父类的初始块");
}
public SuperDemo() {
System.out.println("父类的构造方法");
}
}
在Demo.java文件中写
public class Demo extends SuperDemo{
public static String c = "当前类静态变量";
protected String d = "当前类的成员变量";
static {
System.out.println("当前类的静态初始块");
}
{
System.out.println("当前类的初始块");
}
public Demo() {
System.out.println("当前类的构造方法");
}
public static void main(String[] args) {
new Demo();
new Demo();
}
}
看到这些输出可以思考一下Java在加载类时的顺序为。
首先加载父类静态初始化块,然后加载当前类的初始化块,可以看到我们创建了两次Demo对象,但是父类的静态初始块和当前类的静态初始块之加载了一次,所以说静态初始化块只会在第一次加载类的时候运行。
然后才开始创建对象,创建对象时会先去初始化父类的实例也就是为什么第三次输出是父类的初始化块的原因,初始化块结束后在执行构造方法,然后才会进行子类的初始化。
总结一下初始化的顺序。
父类的静态初始化块 > 当前类的静态初始化块 > 父类的初始块 > 父类构造方法 > 当前类的初始化块 > 当前类的构造方法。
JVM运行时有以下几个区域!
运行时每个区域的作用在Github上有非常详细的讲解。