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

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.初始化导出类无参构造器(注意:导出类的成员变量和代码块都是是比构造函数的初始化要早。。看输出结果可知)*/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值