构造器内部的多态方法的行为

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?安全

初始化的实际过程:函数

  1. 在其余任何事物发生以前,将分配给对象的存储空间初始化成二进制的零。
  2. 如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法(注意,要在调用RoundGlyph构造器以前调用),因为步骤1 的缘故,咱们此时会发现radius的值为0
  3. 按照声明的顺序调用成员的初始化方法
  4. 调用导出类的构造器主体

在构造器内惟一可以安全调用的那些方法是基类中的final方法(也适用private方法,它们自动属于final方法),这些方法不能被覆盖,故不存在这个问题。code

另,若是父类构造器调用了被子类重写的方法,且经过子类构造函数建立子类对象,调用了这个父类构造器(不管显示仍是隐式),就会致使父类在构造时实际上调用的是子类覆盖的方法。对象

相关文章
相关标签/搜索