Java程序初始化的执行顺序:
父类静态变量—>父类静态代码块—>>子类静态变量—>子类静态代码块 【静态部分只在类加载时初始化一次】
---->父类非静态变量—>父类非静态代码块—>父类构造方法—>>子类非静态变量—>子类非静态代码块—>子类构造方法
示例:
以牛客网的一道题为例:运行下面代码,输出的结果是()
class A {
public A() {
System.out.println("class A");
}
{ System.out.println("I'm A class"); }
static { System.out.println("class A static"); }
}
public class B extends A {
public B() {
System.out.println("class B");
}
{ System.out.println("I'm B class"); }
static { System.out.println("class B static"); }
public static void main(String[] args) {
new B();
}
}
结果是:
class A static
class B static
I'm A class
class A
I'm B class
class B
理解:
1. 因为子类是父类的拓展,必须先初始化父类才能保证子类的初始化正确【比如子类调用了父类的方法或属性】
2. 类必须先被加载才能实例化【类在第一次被调用时进行加载,并对静态部分进行初始化】