JAVA物件初始化步驟
阿新 • • 發佈:2021-02-04
文章目錄
前言
在面向物件的程式語言中,瞭解物件初始化的步驟有利於我們更好地寫成程式碼。
一、物件初始化步驟
- 父類靜態變數、靜態程式碼塊初始化
- 子類靜態變數、靜態程式碼塊初始化
- 父類變數、程式碼塊初始化
- 父類構造方法
- 子類變數、程式碼塊初始化
- 子類構造方法
注意:
1:所有的靜態變數,靜態程式碼塊只會在第一次建立物件時進行初始化
2:變數和程式碼塊的初始化過程是按照在類中定義的順序執行的,如變數a,程式碼塊b,變數c,則初始化過程為a->b->c,不是a->c->b(靜態變數和靜態程式碼塊同理)
二、例項
注意public Father()和public Son()兩行的註釋。
class Father{
public int num2=4;//5
public Father(){//呼叫構造方法時轉到5,去完成變數和程式碼塊的初始化,結束後執行7
//7
System.out.println("父類建構函式初始化");
}
{//6
System.out.println("父類程式碼塊初始化");
}
static {//1
System.out.println ("父類靜態程式碼塊初始化");
}
public static int num1=2;//2
}
class Son extends Father{
public static int num3=6;//3
public Son(){ //呼叫構造方法時轉到父類構造方法處,父類初始化完成後,去完成變數和程式碼塊的初始化,結束後執行10
//10
System.out.println("子類建構函式初始化");
}
{//8
System.out.println("子類程式碼塊初始化" );
}
public int num4=8;//9
static {//4
System.out.println("子類靜態程式碼塊初始化");
}
}
public class initializeDemo {
public static void main(String[] args) {
Son son = new Son();
}
/*
執行結果:
父類靜態程式碼塊初始化
子類靜態程式碼塊初始化
父類程式碼塊初始化
父類建構函式初始化
子類程式碼塊初始化
子類建構函式初始化
*/
}
三、特殊案例
如果一個類的靜態變數f2建立了該類的物件,則初始化流程有所不同(如果f2建立的不是該類的物件,則f2按照一中所說的步驟執行),此時f2不會執行一中的1.2步。
class Father{
public int num2=4;
public static Father f2=new Father();//對f1的靜態變數f2(如果此時f2和f1是同一類的物件)進行初始化時,會先對f2中的非靜態程式碼進行初始化,結束後再按照物件初始化步驟依次執行
public Father(){
System.out.println("建構函式初始化");
}
{
System.out.println("程式碼塊初始化");
}
static {
System.out.println("靜態程式碼塊初始化");
}
}
public class initializeDemo {
public static void main(String[] args){
Father f1 = new Father();
}
/*
執行結果:
程式碼塊初始化
建構函式初始化
靜態程式碼塊初始化
程式碼塊初始化
建構函式初始化
*/
}
四、列舉類初始化
在第一次建立列舉類物件時,會一次性初始化所有列舉常量(並不是建立哪個列舉常量就初始化哪個),之後再建立列舉類物件時不再呼叫構造方法。
enum Mark {
bad("0-60"),common("61-80"),good("81-100");
private String markRange;
Mark(String m) {
markRange= m;
System.out.println("初始化完成:"+m);
}
String getMarkRange() {
return markRange;
}
}
public class initializeDemo {
public static void main(String[] args) {
Mark good = Mark.good;
System.out.println("===========");
Mark bad = Mark.bad;
}
/*
執行結果:
初始化完成:0-60
初始化完成:61-80
初始化完成:81-100
===========
*/
}