public class PolyContructors { public static void main(String[] args) { new RoundGlyph(5); } } class Glyph { void draw() { System.out.println("Glyph.draw()"); } public Glyph() { System.out.println("Glyph's Constructor"); System.out.println("before draw..."); draw(); System.out.println("after draw..."); } } class RoundGlyph extends Glyph { private int radius = 1; void draw() { System.out.println("RoundGlyph.draw() -> radius=" + radius); } public RoundGlyph(int r) { radius = r; System.out.println("RoundGlyph's Constructor"); } }
输出:java
Glyph's Constructor before draw... RoundGlyph.draw() -> radius=0 after draw... RoundGlyph's Constructor
输出结果radius为何是0而不是1?
think in java
说Glyph的构造器调用draw()方法时,radius不是默认初始值1,而是0(?),我理解的是radius要么是发现变量未定义,要么找到变量的定义并初始化为1,为何是0呢.....对象.在堆里已分配了空间,初始化成了默认值0?安全
初始化的实际过程:函数
在构造器内惟一可以安全调用的那些方法是基类中的final方法(也适用private方法,它们自动属于final方法),这些方法不能被覆盖,故不存在这个问题。code
另,若是父类构造器调用了被子类重写的方法,且经过子类构造函数建立子类对象,调用了这个父类构造器(不管显示仍是隐式),就会致使父类在构造时实际上调用的是子类覆盖的方法。对象