文章目录

背景

  • 在Java面试过程中,关于虚拟机中类的初始化过程及初始化顺序是经常被问到的问题,本文将通过实例代码对类的初始化顺序做出说明。

概念

类的初始化阶段是类加载过程的最后一个步骤,Java虚拟机才真正开始执行类中编写的Java程序代码,初始化阶段就是执行类构造器()方法的过程。

Java高频面试问题:类的初始化顺序_静态代码块

初始化顺序

Java高频面试问题:类的初始化顺序_初始化顺序_02

代码验证

##### 父类 
/**
* 类的初始化过程--父类
*
* @author zhuhuix
* @date 2020-06-16
*/
public class Parent {
// 静态变量
public static int parentCount;
private String name=parentNameAssignment();

Parent(){
parentCount =2;
System.out.println("执行Parent类的默认构造方法");
}

// 静态代码块
static{
parentCount++;
System.out.println("执行Parent类的静态代码块");
}

String parentNameAssignment(){
System.out.println("执行Parent类的成员变量赋值");
return "";
}
}
##### 本体类 
/**
* 类的初始化过程--本体类继承父类
*
* @author zhuhuix
* @date 2020-06-16
*/
public class Myself extends Parent{
public int count;
private String name=myselfNameAssignment();
Myself(){
count= parentCount;
System.out.println("执行Myself类的默认构造方法");
}

// 静态代码块
static{
System.out.println("执行Myself类的静态代码块");
}


String myselfNameAssignment(){
System.out.println("执行Myself类的成员变量赋值");
return "";
}
}
##### 主程序
/**
* 类的初始化过程
*
* @author zhuhuix
* @date 2020-06-16
*/
public class ClInit {
public static void main(String[] args) {
System.out.println("执行main方法");
Myself myself = new Myself();
System.out.println("child对象的childCount为:"+myself.count);
}
}
##### 输出顺序

Java高频面试问题:类的初始化顺序_初始化顺序_03

注意点

  • 在static语句块中使用到静态变量时一定要将该静态变量的声明语句放在static语句块的前面, 否则会发生illegal forward references的编译错误
  • Java高频面试问题:类的初始化顺序_初始化顺序_04