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

首先看一下代码:

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;

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

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





你可能感兴趣的:(初始化)