Java 類的初始化和實例的初始化
類的初始化
一個子類初始化要先初始化他的父類
一個類初始化就是執行clinit方法
- 這裏我們注意 這裏的初始化是對靜態變量和靜態代碼塊進行初始化 而他們兩執行的先後順序就是看誰寫在前面 誰寫在後面
實例的初始化
實例的初始化就是執行init方法
- init方法由3部分組成 分別是 非靜態的實例變量 非靜態代碼塊 對應構造器代碼組成
- 非靜態實例變量的賦值和非靜態代碼塊從上到下按順序執行 對應的構造器代碼最後執行
- init方法首先執行父類的init方法
總結
- 觸發初始化的執行順序
1)父類的靜態成員變量和static代碼塊
2)子類的靜態成員變量和static代碼塊
3)父類的普通成員變量和非static代碼塊
4)父類的構造方法
5)子類的普通成員變量和非static代碼塊
6)子類的構造方法
我們來看一個例子
package com.zyk;
class HelloA {
private static int i=method();
public static int method(){
System.out.println("父類的靜態變量");
return 1;
}
public HelloA() {
System.out.println("HelloA");
}
{ System.out.println("I'm A class"); }
static { System.out.println("父類的靜態代碼塊 static A"); }
}
public class HelloB extends HelloA {
private static int i=method();
public static int method(){
System.out.println("子類的靜態變量");
return 1;
}
public HelloB() {
System.out.println("HelloB");
}
{ System.out.println("I'm B class"); }
static { System.out.println("子類的靜態代碼塊 static B"); }
public static void main(String[] args) {
new HelloB();
}
}
運行結果
父類的靜態變量
父類的靜態代碼塊 static A
子類的靜態變量
子類的靜態代碼塊 static B
I'm A class
HelloA
I'm B class
HelloB