在初始化过程中调用的多态方法产生的问题
首先看一下代码:
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); } }
好,我们跑一下,纳尼,为什么输出的是
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
下面我来说一下运行过程中的过程,我想你们就知道为什么会这样了。
首先,在其他任何事物发生之前,将分配给对象的存储空间全都初始化为二进制的零。
然后,开始调用构造器,先调用基类的构造器,在这个过程中,调用的draw()方法是被子类对象覆盖后的draw()方法而不是基类的draw()方法,这时需要特别注意的一个地方。这里由于第一步的缘故,radius的值为0;
其次,按照声明的顺序调用成员的初始化方法。
最后就是调用导出类的构造器了。

浙公网安备 33010602011771号