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、构造方法最晚;
为什么不能先加载子类?
因为子类继承了父类,假设子类需要使用父类的变量或者方法,父类此时却还未实例化,那么程序将出错;
为什么不能先加载构造方法?
简单地说,如果非静态方法使用静态变量,这时候静态域却没有执行,那静态变量的值就出错了。