首先看一下代碼:ide
class Glyph{ void draw(){ System.out.println("Glyph.draw()");} Glyph(){ System.out.println("Glyph() before draw()"); draw(); System.out.println("Glyph() after draw()"); } } class RoundGlyph extends Glyph{ private int radius = 1; RoundGlyph(int i){ radius = i; System.out.println("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw(){ System.out.println("RoundGlyph.draw(), radius = " + radius); } } public class PolyConstructors{ public static void main(String[] args){ new RoundGlyph(5); } }
好,咱們跑一下,納尼,爲何輸出的是spa
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5code
下面我來講一下運行過程當中的過程,我想大家就知道爲何會這樣了。對象
首先,在其餘任何事物發生以前,將分配給對象的存儲空間全都初始化爲二進制的零。blog
而後,開始調用構造器,先調用基類的構造器,在這個過程當中,調用的draw()方法是被子類對象覆蓋後的draw()方法而不是基類的draw()方法,這時須要特別注意的一個地方。這裏因爲第一步的緣故,radius的值爲0;event
其次,按照聲明的順序調用成員的初始化方法。class
最後就是調用導出類的構造器了。cli