当声明父类而用子类实例化时:
public class Main {
public static int i=methodi();
public int y=methody();
public static int methodi() {
System.out.println("i");
return 1;
}
public int methody() {
System.out.println("y");
return 1;
}
public Main() {
System.out.println("Main构造器");
}
{
System.out.println("Main普通代码块");
}
static {
System.out.println("Main静态代码块");
}
public static void main(String[] args) {
Main m=new x();
}
}
class x extends Main{
public x() {
System.out.println("x构造器");
}
{
System.out.println("x普通代码块");
}
static {
System.out.println("x静态代码块");
}
}
输出为:
i
Main静态代码块
x静态代码块
y
Main普通代码块
Main构造器
x普通代码块
x构造器
当 Main m=new Main(); 时。
输出为:
i
Main静态代码块
y
Main普通代码块
Main构造器
当 x x=new x(); 时。
输出为:
i
Main静态代码块
xi
x静态代码块
y
Main普通代码块
Main构造器
x普通代码块
x构造器
总结:单个类执行顺序:静态变量的声明,静态代码块,普通变量声明,普通代码块,类构造器。
当声明父类而用子类实例化时执行顺序:
父类静态变量声明,父类静态代码块,子类静态变量声明,子类静态代码块,父类普通变量声明,父类普通代码块,父类构造器,子类普通变量声明,子类普通代码块,子类构造器。