欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

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

来源: javaer 分享于  点击 25357 次 点评:233

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(),即父类的构造方法执行非静态代码块执行本类的构造方法执行其他代码结束yesnoyesno

这里的执行顺序同子类构造中有一个默认的父类构造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); 的注释,那么执行结果会发生变化,在选择父类的构造方法的时候会选择含参构造方法,执行结果为:

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

相关文章

    暂无相关文章
相关栏目:

用户点评