在初始化过程中调用的多态方法产生的问题

首先看一下代码:

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);
    }
}
View Code

好,我们跑一下,纳尼,为什么输出的是

Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

下面我来说一下运行过程中的过程,我想你们就知道为什么会这样了。

首先,在其他任何事物发生之前,将分配给对象的存储空间全都初始化为二进制的零。

然后,开始调用构造器,先调用基类的构造器,在这个过程中,调用的draw()方法是被子类对象覆盖后的draw()方法而不是基类的draw()方法,这时需要特别注意的一个地方。这里由于第一步的缘故,radius的值为0;

其次,按照声明的顺序调用成员的初始化方法。

最后就是调用导出类的构造器了。





posted @ 2014-07-14 20:18  Vaker丶XH  阅读(195)  评论(0)    收藏  举报