1. 程式人生 > >Java 靜態塊、構造方法加載順序

Java 靜態塊、構造方法加載順序

程序 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 靜態塊、構造方法加載順序