標籤:簡單的 pre order tle print cto xtend 空間 padding
Java對象的初始化步驟如下:
1.首先將分配給對象的儲存空間初始化為二進位的零;
2.如果有繼承,則先調用基類的構造器;
3.按照聲明的順序調用成員的初始化方法;
4.調用匯出類的構造器主體.
看下面的例子:
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 r) { radius = r; 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); }}
輸出結果:
結果分析:
1).匯出類RoundGlyph覆蓋了基類Glyph中的draw()方法.當基類Glyph構造器調用draw方法時,實際會調用RoundGlyph的draw()方法;
2).由於對象初始化時,首先將分配給對象的儲存空間初始化為二進位的零,因此此時radius的值為0.
結論:
1).編寫構造器時有一條有效準則:"用儘可能簡單的方法使對象進入正常狀態;如果可以的話,避免調用其他方法";
2).在構造器內唯一能安全調用的那些方法是基類中的final方法(也適用於private方法,它們自動屬於final方法).這些方法不能被覆蓋,因此也就不會出現上述令人驚訝的問題.
Java對象的初始化過程