原文鏈接http://zhhll.icu/2020/04/29/java%E5%9F%BA%E7%A1%80/java%E5%9F%BA%E7%A1%80%E4%B9%8B%E5%88%9D%E5%A7%8B%E5%8C%96/
初始化順序
在類中變數定義的順序決定了它們初始化的順序,
public class House {
// 構造器之前
Window w1 = new Window(1);
House(){
System.out.println("House()");
Window window = new Window(11);
}
// 構造器之后
Window w2 = new Window(2);
void f(){
System.out.println("f()");
}
Window w3 = new Window(3);
public static void main(String[] args) {
House house = new House();
house.f();
}
}
public class Window {
public Window(int mark){
System.out.println("Window("+mark+")");
}
}
執行結果
Window(1)
Window(2)
Window(3)
House()
Window(11)
f()
驗證類加載
public class Initable {
// 非編譯期常量
public static final int COUNT =new Random().nextInt(1000);
static {
System.out.println("Initable初始化");
}
}
public class Initable1 {
// 編譯期常量
public static final int COUNT = 47;
static {
System.out.println("Initable1初始化");
}
}
public class Initable2 {
public static int COUNT = 56;
static {
System.out.println("Initable2初始化");
}
}
public class Initable3 {
public static int COUNT = 33;
static {
System.out.println("Initable3初始化");
}
}
public class Initable4 {
public static int COUNT = 44;
static {
System.out.println("Initable4初始化");
}
}
結果:
Initable---------------
Initable初始化
457
Initable1---------------
47
Initable2---------------
Initable2初始化
56
Initable3---------------
Initable4---------------
Initable4初始化
對于static final的值是一個編譯期常量的話(如Initable1.COUNT),獲取這個值時不需要對Initable1進行初始化就可以讀取,如果用static final的值不是一個編譯期常量(如Initable.COUNT),訪問這個變數會強制對該類進行初始化
對于一個僅僅是static修飾的欄位而不是final的,在讀取這個欄位之前,需要為該欄位分配存盤空間以及初始化該存盤空間
使用.class語法不會對類進行初始化,而使用Class.forName()來產生Class參考會直接引發類的初始化
由于本身的博客百度沒有收錄,博客地址http://zhhll.icu
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/243464.html
標籤:Java
上一篇:LinkedList(鏈表)
