基类
public class Father {
private int i = testFather(); // 6
private static int f = method();// 1
static {
System.out.println("父类静态代码块被加载");// 2
}
private static int f2 = method2();// 3
Father(){ // 9
System.out.println("父类构造函数被加载");
}
{
System.out.println(" 父类 普通代码块 被加载"); // 7
}
private int j = test1(); // 8 此处实际调用子类的 test1
public int testFather() {
System.out.println("父类成员变量i被加载");
return 1;
}
public static int method(){
System.out.println("父类静态变量f被加载");
return 1;
}
private static int method2() {
System.out.println(" 父类静态变量f2被加载 ");
return 0;
}
public int test1() {
System.out.println("父类test1执行");
return 1;
}
}
子类
public class Son extends Father {
{
System.out.println(" 子类普通代码块 ");// 10
}
private int i = test1(); // 11
private static int f = method();// 4
static {
System.out.println(" 子类静态代码块 "); // 5
}
Son(){
System.out.println(" 子类构造函数 ");
}// 12
public int test1() {
System.out.println(" 子类test1被执行");
return 1;
}
public static int method(){
System.out.println(" 子类静态变量f加载");
return 1;
}
}
测试类
public class Demo {
public static void main(String[] args) {
System.out.println("开始");
Father father1 = new Son();
System.out.println("---以下是father2 ----");
Father father2 = new Son();
}
}
运行结果
执行顺序已经在代码中标注出加粗样式来了
结论
父类静态代码块或者父类静态变量>子类静态代码块或者子类静态变量>父类成员变量或父类构造代码块>父类构造函数>子类成员变量或子类构造代码块>子类构造函数
补充:静态代码块和静态变量处在同一优先级,成员变量和构造代码块处在同一优先级,都是谁位置靠前,先加载谁
特别注意:当两个类是继承关系时,父类调用“子类覆写”了的方法时,其实是调用的子类的方法
即上诉代码中的第八步,父类中private int j = test1();
实际是调用的子类的test1
方法
详情参见
阿里巴巴难度系数五颗星的试题,小白竟然说很简单:https://blog.csdn.net/leisure_life/article/details/108681214