先貼一段**,結果輸出弄明白了,就不用往下看了
class meal
static string wsp=printf("base static field");
static string printf(string s)
int money=getint(7);
int getint(int x)
}class bread
}public
class
rewrite
extends
meal
static string wsp=meal.printf("super static field");
public
static
void
main(string args)
}//output:可以說明大部分情況了~
base static field
super static field
base non-static field
base constructor: meal()
super non-static field
super constructor: rewrite()
首先是靜態變數(域或者方法),它隨著類的編譯一起被初始化,當讀到 public class rewrite 時就會被初始化,畢竟是不依賴於物件的類變數;
但由於rewrite 後又有extends關鍵字,編譯器會去先編譯基類;畢竟匯出類中的**靜態變數很有可能會依賴於基類終端靜態變數**
然後,全部基類的靜態變數都初始化完畢後,呼叫匯出類(rewrite)的構造器,然後呼叫基類的構造器(super());
在基類中,構造器初始化之前,類內的非靜態變數進行初始化;即使變數定義散步在方法定義之間,它們仍會在任何方法(包括構造器)被呼叫之前得到初始化(?感覺tij4描述有點問題)
所有基類構造器都初始化完畢,就可以對當前匯出類進行初始化了。輸出顯示確實是按照這樣的順序執行的;
個人理解,如有不正確的地方還請多多指點^_^
java初始化順序
1 父類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 2 子類靜態成員和靜態初始化塊 按在 中出現的順序依次執行 3 父類例項成員和例項初始化塊 按在 中出現的順序依次執行 4 父類構造方法 5 子類例項成員和例項初始化塊 按在 中出現的順序依次執行 6 子類構造方法 public abstr...
java初始化順序
例如以下 package chapter5 public class demo1one public void printinfo public static void main string args 程式一開始先執行 private static string password 0721 這行 ...
JAVA初始化順序
1 當使用新建物件例項或者呼叫靜態成員變數或者方法時,初始化靜態變數 2 靜態變數在初始化時在前面的先初始化,靜態塊和靜態變數相同對待 在初始化過程中,有新建物件例項的時候,暫時停止後面的靜態變數初始化 3 靜態變數沒有初始化時,使用預設的初始值 如int為0 4 新建物件例項,對非靜態的成員變數進...