Java 类初始化构造器的顺序问题整理

文章详细解释了Java中静态代码块、普通代码块的执行顺序以及子类初始化时对父类构造方法的影响。通过实例代码和分析,展示了类加载、实例化过程中的输出结果。
摘要由CSDN通过智能技术生成

笔者整理java试题的是否发现,很多喜欢考察静态代码块、普通代码块、父子类的初始化顺序,特地在此进行一个整理和归纳,话不多说,我们先上代码

首先给出A类的实现:

public class A {
    static {
        System.out.println("A static code block");
    }

    {
        System.out.println("A normal code block");
    }
    public A(){
        System.out.println("new A");
    }

}

可以看到里面有静态代码块、普通代码块与构造方法,为了区分打印结果我们设置了不同的输出
再提供一个子类B继承A类:下面是B类的实现:


public class B extends A {
    public B(){
        System.out.println("new B");
    }

static{
        System.out.println("B static code block");
    }
    {
        System.out.println("B normal code block");
    }
    public static B b = new B();



    public static void main(String[] args) {
        B b= new B();
    }
}

猜猜看这个代码运行结果是什么呢?

话不多说,我们上答案:
请添加图片描述
解释:

首先,加载类A和类B,执行静态代码块,因为静态代码块只在类加载时执行一次,所以输出"A static code block"和"B static code block"。

然后,执行类B的静态变量初始化,即public static B b = new B();,这会触发类B的实例化过程。

类B的实例化过程中,首先会初始化父类A,所以执行A的普通代码块和构造函数,输出"A normal code block"和"new A"。

然后,执行类B的普通代码块和构造函数,输出"B normal code block"和"new B"。

最后,在main方法中,再次创建类B的实例,重复上述的实例化过程,输出"A normal code block"、“new A”、“B normal code block"和"new B”。

所以,小伙伴儿们你们晓得这个原理了么?一起加油

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值