直接上例子
父类:
/**
* DESC: 父类
* USER: haiboz
* DATE: 2018/1/29 17:01
*/
public class Parent {
private static String strParSta = "父类静态成员变量";
private String strParIns = "父类成员变量";
static{
System.out.println("进入父类静态块");
System.out.println("strPar:"+strParSta);
}
public Parent(){
System.out.println("进入父类构造函数");
System.out.println("父类构造函数 strPar:"+strParSta);
System.out.println("父类构造函数 strParIns:"+strParIns);
}
{
System.out.println("进入父类代码块");
System.out.println("父类代码块 strParIns:"+strParIns);
}
public void sout(){
System.out.println("输出");
}
}
子类:
/**
* DESC: 子类
* USER: haiboz
* DATE: 2018/1/29 17:09
*/
public class Son extends Parent {
static String strSon = "子类静态成员变量";
String strSonIns = "子类成员变量";
public Son() {
System.out.println("进入子类构造函数");
System.out.println("子类构造函数 strSon:"+strSon);
System.out.println("子类构造函数 strSonIns:"+strSonIns);
}
static {
System.out.println("进入子类静态代码块");
System.out.println("子类静态代码块 strSon:"+strSon);
}
{
System.out.println("进入子类代码块");
System.out.println("子类代码块 strSonIns:"+strSonIns);
}
public static void main(String[] args) {
Parent son = new Son();
son.sout();
}
}
运行输出结果:
进入父类静态块
strPar:父类静态成员变量
进入子类静态代码块
子类静态代码块 strSon:子类静态成员变量
进入父类代码块
父类代码块 strParIns:父类成员变量
进入父类构造函数
父类构造函数 strPar:父类静态成员变量
父类构造函数 strParIns:父类成员变量
进入子类代码块
子类代码块 strSonIns:子类成员变量
进入子类构造函数
子类构造函数 strSon:子类静态成员变量
子类构造函数 strSonIns:子类成员变量
输出
总结加载顺序如下:
1.进入父类静态代码块
2.进入子类静态代码块
3.进入父类代码块
4.进入父类构造函数
5.进入子类代码块
6.进入子类构造函数
7.进入普通函数
其中步骤1-2为类加载过程,步骤3-6为对象实例化的过程。
注:如果类已经被加载:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。