/**
* created by fei on 2017/5/31.
*/public
class
sonclass
extends
parentclass
static
public
static
void
main(string args)
}class parentclass
static
}
執行結果:
parentclass's static block
sonclass's static
block
------ main start ------
parentclass's block
parentclass's constructor
sonclass's
block
sonclass's
constructor
------ main
end ------
根據執行結果,一目了然,在執行 main 方法中 new sonclass() 之前,就在類載入之後執行了類中 static **塊。然後再進入main方法,執行new操作,當然顯而易見,在執行new子類操作的時候,是要先進行其父類的構造,即先執行父類的構造**塊(**中只用大括號包裹的那段**)以及建構函式 ,然後再執行子類的構造**塊以及建構函式。
修改一下**,再來看看執行的結果:
/**
* created by fei on 2017/5/31.
*/public
class
sonclass
extends
parentclass
public
sonclass(string name)
public
static
void
main(string args)
}class parentclass
public
parentclass(string name)
}
執行的順序是:
------ main start ------ 32
4------ main end ------
總之,一句話:子類沒有顯示呼叫父類建構函式,不管子類建構函式是否帶引數都預設呼叫父類無參的建構函式,若父類沒有則編譯出錯。
還是兩個類,我們再更改一下。
/**
* created by fei on 2017/5/31.
*/public
class
sonclass
extends
parentclass
public
void
printname()
public
static
void
main(string args)
}class parentclass
public
void
printname()
}
看了上面的兩個例子,最後這個例子就很容易被迷惑,可能有人會覺得執行結果是類似這樣的:
parentclass print name: parentclass
sonclass print name: sonclass
或者是:
parentclass print name: sonclass
sonclass print name: sonclass
但真正的結果是這樣的:
sonclass print name: null
sonclass print name: sonclass
為什麼會這樣,其實只要開啟**中父類構造器中的這句注釋,就很容易理解了:system.out.println(this.getclass())
結果是:
class
sonclass
沒錯,父類中的this引用是子類例項物件,所以在父類建構函式裡呼叫的還是子類的printname()方法。具體原因也並我能十分肯定,我個人淺見,是因為雖然我們呼叫了父類的構造方法,但是我們並沒有例項化出父類的例項物件,所以this還是指向的是子類的引用。 java 繼承類載入順序
package xu.jin class insect static static int print string str static int x1 print static insect class hello extends insect static public static void ...
java類載入順序
1 父類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。2 子類靜態成員和靜態初始化塊,按在 中出現的順序依次執行。3 父類例項成員和例項初始化塊,按在 中出現的順序依次執行。4 執行父類構造方法。5 子類例項成員和例項初始化塊,按在 中出現的順序依次執行。6 執行子類構造方法。下面提供了有關靜...
java類載入順序
package com.demo description 類載入順序 author fujianyong 2015 2 6上午11 21 37 public class classloadersequence public static void test1 public void test2 pu...