关于java中三种初始化块的执行顺序

2019-11-08 16:07:14来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

关于java中三种初始化块的执行顺序

许多小伙伴对于java中的三种初始化块的执行顺序一直感到头疼,接下来我们就来分析一下这三种初始化块到底是怎么运行的。有些公司也会将这个问题作为笔试题目。

下面通过一段代码来看看创建对象时这么初始化块是如何运行的

package com.hxy;
public class CodeBlock{
    public static void main(String[] args) {
        new HelloB();
       // new HelloB();
    }

}
class HelloA{
    //无参构造器
    public HelloA(){
        System.out.println("Hello A");
    }
    //初始化块
    {
        System.out.println("I'm A");
    }
    //静态初始化块
    static{
        System.out.println("Static A");
    }
}
class HelloB extends HelloA{
    public HelloB(){
        System.out.println("Hello B");
    }
    {
        System.out.println("I'm B");
    }
    static{
        System.out.println("Static B");
    }
}

运行结果如下图所示:

 

 从运行结果来看,在新创建一个对象的时候,程序先执行初始化块,再执行构造器。

当普通初始化块被static修饰后就变成了静态初始化块,也被称作类初始化块

普通初始化块是对对象进行初始化,而静态初始化块是对类进行初始化。所以静态初始化块要比普通初始化块先执行。

从上面的运行结果看。当第一次创建HelloB对象时,要先加载并初始化HelloB类。初始化HelloB类会先执行它父类的静态初始块(Static A),然后再执行它的静态初始化块。

综上所述:初始化块的执行顺序为:静态初始化块、普通初始化块、构造器。

接下来再看创建两个HelloB对象时它们又是怎么运行的。下面是运行结果:

 

 从运行结果来看,可能出乎一些小伙伴的预料。

静态初始化块只在第一次创建对象时执行,也就是说不管创建几次对象。静态初始化块都只会执行一次。普通代码块和构造器则是创建几次执行几次,且普通代码块比构造器先执行。

 


原文链接:https://www.cnblogs.com/huxiaoyang/p/11823444.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java阻塞队列

下一篇:基于SkyWalking的分布式跟踪系统 - 异常告警