若不用new 則只加載靜態修飾的內容
靜態變量>靜態塊>mian
public class Father {
int i;
static int staticI;
static {System.out.println("Father 靜態代碼塊1"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}
public Father() {System.out.println("Father 構造器");}
{System.out.println("Father 非靜態代碼塊2"+" i="+i+" (++staticI)="+(++staticI));}
static {System.out.println("Father 靜態代碼塊2"+" (++staticI)="+(++staticI));}
public static void main(String[] args) {System.out.println("main 方法"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非靜態代碼塊3"+" i="+i+" (++staticI)="+(++staticI));}
static {System.out.println("Father 靜態代碼塊3"+" (++staticI)="+(++staticI));}
}
運行結果
Father 靜態代碼塊1 (++staticI)=1
Father 靜態代碼塊2 (++staticI)=2
Father 靜態代碼塊3 (++staticI)=3
main 方法 (++staticI)=4
靜態內容>非靜態變量>非靜態塊>構造器
將main也歸納到靜態內容
將上面代碼的main改造:
public static void main(String[] args) {
System.out.println("main 方法"+" (++staticI)="+(++staticI));
new Father();
}
運行結果
Father 靜態代碼塊1 (++staticI)=1
Father 靜態代碼塊2 (++staticI)=2
Father 靜態代碼塊3 (++staticI)=3
main 方法 (++staticI)=4
Father 非靜態代碼塊1 i=0 (++staticI)=5
Father 非靜態代碼塊2 i=0 (++staticI)=6
Father 非靜態代碼塊3 i=0 (++staticI)=7
Father 構造器
結論
- 加載的順序從上至下
- 靜態變量>靜態塊>main>非靜態變量>非靜態塊>構造器
有子類又會咋麼樣呢?
既然上面已經證明了在遵循加載規則的情況下順序爲從上至下
那麼就可以簡化代碼了
public class CopyOfFather {
int i;
static int staticI;
static {System.out.println("Father 靜態代碼塊1"+" (++staticI)="+(++staticI));}
{System.out.println("Father 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}
public CopyOfFather() {System.out.println("Father 構造器");}
public static void main(String[] args) {
System.out.println("main 方法");
System.out.println("(++CopyOfSon.staticI)="+(++CopyOfSon.staticI));
}
}
class CopyOfSon extends CopyOfFather {
int i;
static int staticI;
public CopyOfSon() {System.out.println("Son 構造器");}
static {System.out.println("Son 靜態代碼塊1"+" (++staticI)="+(++staticI));}
{System.out.println("Son 非靜態代碼塊1"+" i="+i+" (++staticI)="+(++staticI));}
}
執行結果
Father 靜態代碼塊1 (++staticI)=1
main 方法
Son 靜態代碼塊1 (++staticI)=1
(++CopyOfSon.staticI)=2
結論:父類靜態內容>子類靜態內容
new 子類會怎麼樣
改造main:
public static void main(String[] args) {
System.out.println("main 方法");
new CopyOfSon();
}
運行結果
Father 靜態代碼塊1 (++staticI)=1
main 方法
Son 靜態代碼塊1 (++staticI)=1
Father 非靜態代碼塊1 i=0 (++staticI)=2
Father 構造器
Son 非靜態代碼塊1 i=0 (++staticI)=2
Son 構造器
結論
此處非靜態內容不包括構造器
父類靜態內容>子類靜態內容>父類非靜態內容>父類構造器>子類非靜態內容>子類構造器
詳細結論
父類靜態變量>父類靜態代碼塊>父類main>子類靜態變量>子類靜態代碼塊>父類非靜態變量>父類非靜態代碼塊>父類構造器>子類非靜態變量>子類非靜態代碼塊>子類構造器
請記住:
1.靜態>非靜態
2.變量>代碼塊: 先定義變量後在代碼塊使用
3.構造器在最後