Java笔记——Java代码块的执行顺序

Java代码块的执行顺序

Java程序中代码块的执行顺序对于学习Java的人来说是必不可少需要掌握的。

代码块

在Java中,使用{}括起来的代码被称为代码块。

根据其位置和声明的不同,可以分为:

  • 局部代码块
  • 构造代码块
  • 静态代码块

执行顺序

首先执行静态代码块
接着执行构造代码块
最后指向构造方法

静态代码块 >>> 构造代码块 >>>> 构造方法

考虑Java中关于继承的情况,这子类和父类的执行顺序稍有变化:

Created with Raphaël 2.1.2 开始执行 父类静态代码块 子类的静态代码块 父类的构造代码块 父类的构造方法 子类的构造代码块 子类的构造方法 结束

当一个类被JVM装载后各种代码块的执行顺序大致如下:

Created with Raphaël 2.1.2 类被JVM装载 执行父类相关的代码 是否有静态初始化 执行静态初始化,且只执行一次,即使后面再有该类的实例化也不会再执行 是否有静态代码块 同执行静态初始化一样执行静态代码块 new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式地执行super(),即父类的构造方法 执行非静态代码块 执行本类的构造方法 执行其他代码 结束 yes no yes no

这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化,即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,先进行成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种->显示初始化,例如给int型显示初始化了值->构造方法初始化,所以是这里执行到了构造方法。

但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关,下面代码很好的解释了这点。

测试代码

package com.chen;

public class People {

    {
        System.out.println("父类构造代码块");
    }

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

    public People() {
        System.out.println("父类构造代码块");
    }
    public People(String str){
        System.out.println("父类含参构造方法");
    }
}
package com.chen;

public class Student extends People{
    {
        System.out.println("子类构造代码块");
    }
    static {
        System.out.println("子类静态代码块");
    }

    public Student() {
        //super(null);  
        System.out.println("子类构造代码块");
    }

    public static void main(String[] args) {
        new Student();
    }
}

执行结果为:

父类静态代码块
子类静态代码块
父类构造代码块
父类构造代码块
子类构造代码块
子类构造代码块

注:
如果取消 super(null); 的注释,那么执行结果会发生变化,在选择父类的构造方法的时候会选择含参构造方法,执行结果为:

父类静态代码块
子类静态代码块
父类构造代码块
父类含参构造方法
子类构造代码块
子类构造代码块

你可能感兴趣的:(Java学习)