您的位置:首页 > 编程语言 > Java开发

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

2016-12-22 00:00 183 查看
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");
}
}

输出:

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?

初始化的实际过程:

在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零。

如前所述那样调用基类构造器,此时,调用被覆盖后的draw()方法(注意,要在调用RoundGlyph构造器之前调用),由于步骤1 的缘故,我们此时会发现radius的值为0

按照声明的顺序调用成员的初始化方法

调用导出类的构造器主体

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

另,如果父类构造器调用了被子类重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上调用的是子类覆盖的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 构造器内多态