JAVA是一门面向对象的编程语言,在面试的时候除了一道题,把我搞蒙了。代码块和构造器,谁先执行?
答案是肯定的了: 不考虑继承的情况下,1静态代码块,2代码块,3构造器
说明:
不考虑继承关系,一般的类里面包含:
1、静态代码块(静态区、静态变量等/用static修饰的)
2、代码块(一块代码/j就是用{}抱起来的代码)
3、构造方法(默认的,无参的,有参的构造器)
new一个对象时,其执行顺序也是1、2、3先后执行,特别强调的是:代码块优先构造器执行。
考虑继承关系:子类与父类的执行顺序是:
1、先执行父类的静态代码块(父1)
2、子类的静态代码块(子1)
3、父类构造代码块(父2)
4、父类构造方法(父3)
5、子类构造代码块(子2)
6、子类构造方法(子3)
当一个类从被JVM装载开始,各种代码的执行顺序大致如下:
这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化:
1.即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,
2.先进性成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种->显示初始化,例如给int型显示初始化了值->构造方法初始化,所以是这里执行到了构造方法。
但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关。
先看一个实例,证实以上结论:
package com.gzu.pyu.thinking.in.java; public class JavaExecutionOrder { public static void main(String[] args) { new HelloA(); // new HelloB(); } } class HelloB extends HelloA{ HelloB(){ System.out.println("HelloB constructor"); } static{ System.out.println("HelloB static code block"); } { System.out.println("HelloB code block"); } } class HelloA{ HelloA(){ System.out.println("HelloA constructor"); } static{ System.out.println("HelloA static code block"); } { System.out.println("HelloA code block"); } }
不考虑继承关系,先执行new HelloA();结果如下:
考虑继承关系,先执行new HelloB();结果如下: