Java 靜態塊、構造方法加載順序
阿新 • • 發佈:2017-12-30
程序 created ext string out blog 需要 tor 加載順序
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、構造方法最晚;
為什麽不能先加載子類?
因為子類繼承了父類,假設子類需要使用父類的變量或者方法,父類此時卻還未實例化,那麽程序將出錯;
為什麽不能先加載構造方法?
簡單地說,如果非靜態方法使用靜態變量,這時候靜態域卻沒有執行,那靜態變量的值就出錯了。
Java 靜態塊、構造方法加載順序