Java高频面试问题:类的初始化顺序
原创
©著作权归作者所有:来自51CTO博客作者zhuhuix的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
背景
- 在Java面试过程中,关于虚拟机中类的初始化过程及初始化顺序是经常被问到的问题,本文将通过实例代码对类的初始化顺序做出说明。
概念
类的初始化阶段是类加载过程的最后一个步骤,Java虚拟机才真正开始执行类中编写的Java程序代码,初始化阶段就是执行类构造器()方法的过程。
初始化顺序
代码验证
/**
* 类的初始化过程--父类
*
* @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);
}
}
注意点
- 在static语句块中使用到静态变量时一定要将该静态变量的声明语句放在static语句块的前面, 否则会发生illegal forward references的编译错误