今天总结了一下子父类当中含有静态代码块、代码块、构造函数、成员变量、子类复写父类方法时子类的初始化过程,把思路理清一下

class Fu { //父类成员变量 private int num = 3;

    //静态代码块,随着类的加载而加载
    static{
            System.out.println("父类静态代码块");
    }
    
    //代码块,运行于构造函数之前,成员变量显示初始化之后
    {
            System.out.println("父类代码块,num = "+num);
    }
    
    //构造函数,先去找他爸爸,运行完父类再运行子类
    Fu(){
            super();//此处去找Object,可忽略
            System.out.println("父类构造函数,num = "+num);
            
            //此处调用的是子类的show方法,因为被覆盖了,注意子类覆盖父类方法时,返回值也得一样
            show();
    }
    
    public void show()
    {
            System.out.println("父类show方法,num = "+num);
    }

} class Demo extends Fu { private int age =23;

    //静态代码块,他有直接父类时,先去加载直接父类
    static{
            System.out.println("子类静态代码块");
    }
    
    //构造代码块,当有直接父类时,当父类运行完毕才轮到构造代码块
    {
            System.out.println("子类代码块,age = "+age);
    }
    
    Demo()
    {
            System.out.println("子类构造函数,age = "+age);
            show();
            
    }
    public void show()
    {
            System.out.println("子类show方法,age = "+age);
            
    }
    
    
    public static void main(String[] args)throws IOException
    {
            new Demo();
    }
    
    
    /*
     *         父类静态代码块
            子类静态代码块
            父类代码块,num = 3
            父类构造函数,num = 3
            子类show方法,age = 0
            子类代码块,age = 23
            子类构造函数,age = 23
            子类show方法,age = 23
     * */

} 总结一下: 1.父类字节码先被JVM加载,父类静态代码块先运行。 2.子类字节码被加载,子类静态代码块运行。 3.子类构造函数进栈,子类的成员变量默认初始化 4.super启动,父类构造函数进栈,父类成员变量默认初始化(super-->Object,可忽略) 5.父类成员变量显示初始化 6.父类构造代码块加载 7.父类构造函数运行。 8.子类成员变量显示初始化 9.子类构造代码块运行。 10.子类构造函数运行