問題
如果在一個構造器內部,調用正在構造的對象的某個動態綁定方法,那會發生什么情況呢?
代碼
class Glyph {
void draw() {
print("Glyph.draw()");
}
/**
* 在基類的構造器中,調用動態綁定的方法(此方法被導出類覆蓋)
*
*/
Glyph() {
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
@Override
void draw() {
print("RoundGlyph.draw(), radius = " + radius);
}
}
class RectangularGlyph extends Glyph {
private int width = 4;
private int height = 5;
RectangularGlyph(int width, int height) {
this.width = width;
this.height = height;
print("RectangularGlyph.RectangularGlyph(), width = " + width + ", height = " + height);
}
void draw() {
print("RectangularGlyph.draw(), area = " + width *
height);
}
}
/**
* 在基類構造器中,調用動態綁定的方法,則導出類方法被調用時,導出類的成員實際上還未被初始化;
* 當調用到導出類的構造器時,導出類的成員已經被初始化了;
*/
public class E15_PolyConstructors2 {
public static void main(String[] args) {
new RoundGlyph(5);
print("------------------------------");
new RectangularGlyph(2, 2);
}
}
輸出結果
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
------------------------------
Glyph() before draw()
RectangularGlyph.draw(), area = 0
Glyph() after draw()
RectangularGlyph.RectangularGlyph(), width = 2, height = 2
結論
類初始化的實際過程是:
- 在其他任何事物發生之前,將分配給對象的存儲空間初始化成二進制的零。
這也解釋了為何基類構造器中調用動態綁定方法時為何radius = 0
、area = 0
- 調用基類構造器
- 按照聲明的順序調用成員的初始化方法
- 調用導出類的構造器主體
這解釋了導出類構造器中為何:radius = 5
、width = 2, height = 2