类初始化 实例初始化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
可以简单理解为类中的静态变量和静态代码块按顺序执行,然后有继承关系的要先初始化父类
可以查看字节码文件,如果翻译成十六进制会发现有clinit字眼

在这里插入图片描述
所谓实例就是加载某一个类的实例化对象,这个时候才去加载成员变量(即非静态变量)和非静态代码块,以及对应的构造器(最后),这里强调对应是因为构造器可以重载,创建几个对象就实例初始化几次

父类Father.class

public class Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("1 ");
    }
    Father(){
        System.out.print("2 ");
    }
    {
        System.out.print("3 ");
    }
    public int test(){
        System.out.print("4 ");
        return 1;
    }
    public static int method(){
        System.out.print("5 ");
        return 1;
    }

}

子类Son.class

public class Son extends Father {
    private int i = test();
    private static int j = method();

    static {
        System.out.print("6 ");
    }
    Son(){
        System.out.print("7 ");
    }
    {
        System.out.print("8 ");
    }

    public int test() {
        System.out.print("9 ");
        return 1;
    }
    public static int method(){
        System.out.print("10 ");
        return 1;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println( );
        Son s2 = new Son();
    }
}

运行结果
在这里插入图片描述

其中5 1 10 6 代表类的初始化
932代表实例初始化,至于为何父类先于子类调用,开头却是9是因为test方法已经被子类重写了,所以即使调用了test方法执行的仍然是子类的test方法因此输出是9而不是4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值