Java 静态块、构造方法加载顺序

时间:2021-11-12 19:26:20
 
 
package cn.lay.Test;

/**
* Created by lay on 2017/12/30.
*/
public class Test {
public static void main(String[] args) {
new C();
}
}


class A{
static {
System.out.println("A static");
}

{
System.out.println("A");
}

public A() {
System.out.println("A constructor");
}
}

class B extends A{
static {
System.out.println("B static");
}

{
System.out.println("B");
}

public B() {
System.out.println("B constructor");
}
}

class C extends B{
static {
System.out.println("C static");
}

{
System.out.println("C");
}

public C() {
System.out.println("C constructor");
}
}
 

C 继承自 B,B 继承自 A;ABC分别有静态域和构造方法,执行main方法结果如下:

A static
B static
C static
A
A constructor
B
B constructor
C
C constructor

我们看到,先按照继承顺序加载了ABC静态域,再按照继承顺序加载了非静态的;

由此,加载顺序其实是由生命周期,以及依赖顺序决定的;

1、先静态域加载;后构造方法加载;

2、先加载父类,后加载子类;

3、构造方法最晚;

为什么不能先加载子类?

因为子类继承了父类,假设子类需要使用父类的变量或者方法,父类此时却还未实例化,那么程序将出错;

为什么不能先加载构造方法?

简单地说,如果非静态方法使用静态变量,这时候静态域却没有执行,那静态变量的值就出错了。