示例代码
public class HelloA {
private static String staticStr = getStaticStr();
private String str = getStr();
//父类构造方法
public HelloA(){
System.out.println("父类构造方法");
}
//父类代码块
{
System.out.println("父类代码块");
}
//静态代码块
static{
System.out.println("父类静态代码块");
}
//父类静态属性初始化
private static String getStaticStr() {
System.out.println("父类静态属性初始化");
return null;
}
private String getStr() {
System.out.println("父类实例属性初始化");
return null;
}
}
class HelloB extends HelloA {
private static String staticStr = getStaticStr();
private String str = getStr();
//构造方法
public HelloB(){
System.out.println("子类构造方法");
}
//子类代码块
{
System.out.println("子类代码块");
}
//子类静态代码块
static{
System.out.println("子类静态代码块");
}
//子类静态属性
private static String getStaticStr() {
System.out.println("子类静态属性初始化");
return null;
}
//子类实例属性初始化
private String getStr() {
System.out.println("子类实例属性初始化");
return null;
}
}
执行一次 new HelloB();
执行顺序:加载父类类对象:父类静态属性 > 父类静态块>
加载子类类对象:子类静态属性>子类静态块 >
父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >
子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>
执行多次 new HelloB(); new HelloB() (此类被加载过,不再加载父类和子类的类对象,则只加载一次)
执行顺序:加载父类类对象:父类静态属性 > 父类静态块>
加载子类类对象:子类静态属性>子类静态块 >
父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >
子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>
父类实例化:父类实例属性初始化 > 父类普通代码块>父类构造方法 >
子类实例化:子类实例属性初始化 > 子类普通代码块>子类构造方法>