基础不牢系列-子父类的加载执行顺序

JAVA中一般来说顺序如下:

父类静态代码->子类静态代码->父类变量初始化(构造代码块,注意覆盖字段)->子类变量初始化(构造代码块)->父类构造函数->子类构造函数

public class Print {
    Print(Object s){
        System.out.print(s+"	");
    }
}

public class A {
    public static Print A_sv1 = new Print("A_sv1");  //1
    public Print A_cv1 = new Print("A_cv1");//3
    public int num = 66;//初始化
    public int num2 = 88;//初始化
    A(){
        new Print("A_s");//4
        show();
    }
    public void show(){//show被子类重载,执行子类的
        new Print(num);//8、打印66
        new Print(num2);//9、打印88
    }
}
public class B extends A {
    public static Print B_sv1 = new Print("B_sv1"); //2
    public Print B_cv1 = new Print("B_cv1");
    public int num = 99;

    B() {
        new Print("B_s");//10
        new Print(num);//11、子类num完成初始化,打印99
    }

    public void show() {
        new Print(num);//5、num被子类覆盖此时还未初始化0,值为0
        new Print(num2);//6、打印子类里的88
        super.show();//执行父类的
    }
}
class Test {
    public static void main(String[] args) {
        B b = new B();
        System.out.println();
        System.out.println("-----------------------------");
        B b2 = new B();
    }
}

可以先尝试下自己判断下内容。


这里为实例的打印结果:

A_sv1 B_sv1 A_cv1 A_s 0 88 66 88 B_cv1 B_s 99

-----------------------------

A_cv1 A_s 0 88 66 88 B_cv1 B_s 99


需要说明的是0 88 66 88这里的打印,主要是在执行父类的构造函数中,调用了show方法,但show方法被子类重载,所以进行到子类的show方法里,但此时num被覆盖且未完成初始化,所以为0;而子类中又显示调用了父类的show,父类中的num则是完成了初始化的,所以为66。

你答对了吗???

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章