版權所有:(xiaodaoxiaodao)藍小刀
http://m.tkk7.com/xiaodaoxiaodao/archive/2007/06/06/122383.html
?
轉載請注明來源/作者
Java
對象初始化順序
?
java
對象是如何進行初始化的,新建一PrintClass.java文件如下(包括類PrintClass以及A和其子類B),編譯運行其中的main方法,
?
public class PrintClass
{
??? public static void main(String[] args){
???????
new B();
??? }
??? PrintClass(String var) {
??????? System.out.println(var);
??? }
}
?
class A
{
??? static PrintClass pClassA1 = new PrintClass("A.
靜態成員的初始化1");
??? static {
??????? System.out.println("A.
靜態初始化塊1");
??? }
??? static {
??????? System.out.println("A.
靜態初始化塊2");
??? }
??? static PrintClass pClassA2 = new PrintClass("A.
靜態成員的初始化2");
?
??? {
??????? System.out.println("A.
實例初始化塊1");
??? }
??? PrintClass pClassA = new PrintClass("A.
實例成員的初始化");
??? {
??????? System.out.println("A.
實例初始化塊2");
??? }
?
??? public int Avar;
??? public A() {
??????? System.out.println("A.
構造方法");
??????? doSomething();
??? }
?
??? private void doSomething() {
//??? public void doSomething() {
??????? Avar = 1111;
??????? System.out.println("Avar=" + Avar);
??? }
}
?
//class B extends A
class B
extends
A
{
??? public static void main(String[] args){
??????? new B();
??? }
??? public int Bvar = 2222;
?
??? {
??????? System.out.println("B.
實例初始化塊1");
??? }
??? {
??????? System.out.println("B.
實例初始化塊2");
??? }
??? PrintClass pClassB = new PrintClass("B.
實例成員的初始化");
?
??? static {
??????? System.out.println("B.
靜態初始化塊1");
??? }
??? static PrintClass pClassB1 = new PrintClass("B.
靜態成員的初始化1");
?
??static PrintClass pClassB2 = new PrintClass("B.
靜態成員的初始化2");
??? static {
??????? System.out.println("B.
靜態初始化塊2");
??? }
?
??? public B() {
??????? System.out.println("B.
構造方法");
??????? doSomething();
??? }
??? public void doSomething() {
??????? System.out.println("Bvar=" + Bvar);
??? }
}
?
可以看到運行結果為:
A.
靜態成員的初始化1
A.
靜態初始化塊1
A.
靜態初始化塊2
A.
靜態成員的初始化2
B.
靜態初始化塊1
B.
靜態成員的初始化1
B.
靜態成員的初始化2
B.
靜態初始化塊2
A.
實例初始化塊1
A.
實例成員的初始化
A.
實例初始化塊2
A.
構造方法
Avar=1111
B.
實例初始化塊1
B.
實例初始化塊2
B.
實例成員的初始化
B.
構造方法
Bvar=2222
?
由此可知當新建一java對象(上面main方法中new B())時,它的內部初始化順序為:
1.?
父類靜態成員和靜態初始化塊
,按在代碼中出現的順序依次執行
2.?
子類靜態成員和靜態初始化塊
,按在代碼中出現的順序依次執行
3.?
父類實例成員和實例初始化塊
,按在代碼中出現的順序依次執行
4.?
父類構造方法
5.?
子類實例成員和實例初始化塊
,按在代碼中出現的順序依次執行
6.?
子類構造方法
?