类初始化过程
- 一个类要创建实例需要先加载并初始化该类
- main方法所在的类需要先加载和初始化
- 一个子类要初始化需要先初始化父类
- 一个类初始化就是执行<clinit>()方法
- <clinit>()`方法由静态类变量显式赋值代码和静态代码块组成
- 类变量显式赋值代码和静态代码块代码从上到下顺序执行
- <clinit>()方法只执行一次
实例初始化过程
- 实例初始化就是执行<init>()方法
- <init>()方法由非静态实例变量显式赋值代码和非静态代码块、对应构造器代码组成
- 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
- 每次创建实例对象,调用对应构造器,执行的就是对应的<init>方法<init>方法的首行是super()或super(实参列表),即对应父类的<init>方法,也就是调用<init>方法的时候先调用父类的<init>方法。
- <init>()方法可能重载有多个,有几个构造器就有几个<init>方法
实例
Father.java
public class Father {
private Integer i = initI();
private static Integer j = initJ();
static {
System.out.print("1");
}
Father(){
System.out.print("2");
}
{
System.out.print("3");
}
public int initI() {
System.out.print("4");
return 1;
}
public static int initJ() {
System.out.print("5");
return 1;
}
}
Son.java
public class Son extends Father {
static {
System.out.print("6");
}
{
System.out.print("8");
}
private Integer i = initI();
private static Integer j = initJ();
Son() {
System.out.print("7");
}
public int initI() {
System.out.print("9");
return 1;
}
public static int initJ() {
System.out.print("10");
return 1;
}
public static void main(String[] args) {
Son son = new Son();
System.out.println();
Son son2 = new Son();
}
}
程序结果
51610932897
932897
注:执行父类private Integer i = initI();时,该方法已经被子类重写,所以调用的是子类的initI()方法。
– END –
如有收获请划至底部,点赞支持,谢谢!
关注 日常生活Blog
每天分享技术干货