问题在<thinking in java> 3rd ed.的第七章Polymorphism上看到的代码如下(稍有改动)/*abstract*/ class Glyph {
 /* abstract*/ void draw(){System.out.println("draw() in Glyph");}
  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); 
  }
}输出:
       Glyph() before draw()
       RoundGlyph.draw(), radius = 0
       Glyph() after draw()
       RoundGlyph.RoundGlyph(), radius = 5问题1:对为何会调用RoundGlyph中的draw()而不是Glyph中的draw()不是很理解.
    2:编译器是先为需要构造的object分配所有的空间然后进行默认的赋值,还是按照构造函数调用的顺序分配空间?    

解决方案 »

  1.   

    JAVA是运行态时确定的调用那个类的方法。
      

  2.   

    楼上的能对这个例子分析一下吗?
    我当然知道是dynamic-binding
      

  3.   

    当在主函数里创建一个RoundGlyph(5)对象时,由于是继承自Glyph 所以要先调用基类构造器,顺序执行,由于RoundGlyph在继承Glyph时重写了draw()方法,所以当Glyph执行到draw()方法时,要按照重写后的draw()方法执行,执行完基类构造器后执行RoundGlyph(5)中的构造器。完
      

  4.   

    thanks,第一个问题我再想想,第二个问题继续挂着