Java中代码块的执行顺序

java中代码块的分类

  1. 普通代码块(构造代码块):定义在类的成员位置上,使用"{}"括起来的代码。
  2. 静态代码块:定义在类的成员位置上,使用"{}"括起来的代码,只是多了一个static修饰。
  3. 构造方法:对象构造器。

局部代码块和同步代码块不在此讨论。

对象创建的过程中代码块的执行顺序是怎样的呢?

让我们写个代码验证一下吧,代码如下。

// 父类代码
public class Father
{
    static
    {
        System.out.println("父类静态代码块!");
    }

    {
        System.out.println("父类普通代码块!");
    }

    public Father()
    {
        System.out.println("父类构造方法!");
    }
}

// 子类代码
public class Son extends Father
{
    static
    {
        System.out.println("子类静态代码块!");
    }

    {
        System.out.println("子类普通代码块!");
    }

    public Son()
    {
        System.out.println("子类构造方法!");
    }
}

// 测试代码
public class Test01
{
    public static void main(String[] args)
    {
        Son son = new Son();
    }
}

结果如下:
代码结果
可以看到代码的执行顺序是
父类静态代码块——>子类静态代码块——>父类代码块——>父类构造方法——>子类代码块——>子类构造方法

为什么会这样呢?

我们知道在创建子类对象的时候,构造方法的第一行存在一个隐式的super调用,会先加载父类,并初始化。当类加载时会先初始化类变量即static修饰的属性,那么父类的静态代码块就会被执行。接下来会加载子类,子类的静态代码块就会接着执行。创建子类对象需要先初始化父类对象,所以父类的构造会先于子类构造执行。

由上面分析可知,静态代码块是最优先执行的,但是为什么构造代码块的执行顺序会比构造方法优先呢?通过反编译工具来看一下。

public class Father
{
    static
    {
        System.out.println("父类静态代码块!");
    }

    public Father()
    {
        System.out.println("父类普通代码块!");
        System.out.println("父类构造方法!");
    }
}

通过反编译工具发现,构造代码块编译后实际上是被放在了构造方法的第一行中。这也就是为什么构造代码块会先于构造方法执行的原因了。

总结

  1. 构造方法执行之前,首先会去执行构造代码块,也就是说构造代码块是优于构造方法执行。
  2. 构造代码块的位置不受构造方法的影响。
    当有多个构造代码块存在的时候,构造代码块执行的顺序是按类中声明的先后顺序来去执行。
  3. 构造代码块的作用:可以将多个构造方法中的共同代码放到构造代码块中。
  4. 静态代码块是类被加载的时候就会执行,静态代码块只会被执行一次。当存在多个静态代码块的时候,按类中声明顺序执行。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值