Java初始化顺序

import static net.mindview.util.Print.*;
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);
  }
  void draw() {
    print("RoundGlyph.draw(), radius = " + radius);
  }
}
public class PolyConstructors {
  public static void main(String[] args) {
    new RoundGlyph(5);
  }
} 

/* Output: Glyph() before draw() RoundGlyph.draw(), radius = 0 Glyph() after draw() RoundGlyph.RoundGlyph(), radius = 5

 

《Thinking in Java》说:

1. The storage allocated for the object is initialized to binary zero before anything else
happens.
2. The base-class constructors are called as described previously. At this point, the
overridden draw( ) method is called (yes, before the RoundGlyph constructor is
called), which discovers a radius value of zero, due to Step 1.
3. Member initializers are called in the order of declaration.
4. The body of the derived-class constructor is called.

 

由3可知,方法继承发生在构造器之前

 

posted @ 2018-06-11 17:27  imzywj  阅读(93)  评论(0)    收藏  举报