Java中static块、构造块、构造函数的执行顺序
最近被一个面试题难住了,看来之前对JAVA的执行顺序欠了解。以为原面试题代码:
public class Example { public static void main(String[] args) { HelloB bb = new HelloB(); } } class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } } class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { new HelloB(); } }
执行结果是:
static A
static B
I'm A class
HelloA
I'm B class
HelloB
得出以下总结:
1. 当调用JAVA子类的无参构造函数时,虽然子类无参构造函数没有显式调用其父类的无参构造函数,但是Java会自动调用其父类的无参构造器 (注:有参构造函数需要显式调用)
2. JAVA的执行顺序是:父类静态变量-> 父类静态块 -> 子类静态变量 -> 子类静态块 -> 父类成员变量 -> 父类构造块 -> 父类构造函数 -> 子类成员变量 -> 子类构造块 -> 子类构造函数