坑【2】父类子类以及静态块,方法中的加载顺序

来源:互联网 发布:mac 移动硬盘装双系统 编辑:程序博客网 时间:2024/06/15 06:35
public class Test {    public static void main(String[] args) {        new Son();        new Father();    }}class Father {    static {        System.out.println("父类静态代码块初始化");    }    {        System.out.println("父类代码块初始化");    }    private static String s = print();    public static String print() {        System.out.println("父类静态方法");        return "父类静态成员变量的初始化";    }    public Father() {        System.out.println("父类无参构造函数初始化完成");        show();    }    public void show() {        System.out.println("父类show()方法。。。");    }}class Son extends Father {    static {        System.out.println("子类静态代码块初始化");    }    {        System.out.println("子类代码块初始化");    }    private static int i = 1;    private String s = "子类私有成员变量";    public void show() {        System.out.println("子类成员变量初始化完成:s=" + s);        System.out.println("子类show()方法:i=" + i);    }    public Son() {        System.out.println("子类构造函数初始化完成");        show();    }}/** * 颠倒这俩效果不同 * new Son();  new Father(); * * 父类静态代码块初始化 父类静态方法 子类静态代码块初始化 父类代码块初始化 父类无参构造函数初始化完成 子类成员变量初始化完成:s=null 子类show()方法:i=1 子类代码块初始化 子类构造函数初始化完成 子类成员变量初始化完成:s=子类私有成员变量 子类show()方法:i=1 父类代码块初始化 父类无参构造函数初始化完成 父类show()方法。。。 从结果可以看出类中各成员初始化的顺序是: 1.如果类中存在继承关系(Son 继承 Father)  则首先会初始化导出类(Son)的基类(Father),然后再是导出类 2.在基类首先会初始化静态 的东西  静态块>静态变量  而且只初始化一次 (因为静态的东西都是跟着类的加载而加载的) 3.随后就是初始化导出类的静态东西  跟基类的静态初始化一样(同上) 4.非静态代码块 5.初始化基类无参构造器(调用有参就初始化有参构造器) 6.初始化导出类无参构造器(注意:导出类的成员变量和代码块都是是比构造函数的初始化要早。。看输出结果可知)*/
0 0