Java,在构造器里调用多态方法
class Glyph {
void draw() { System.out.println("Glyph.draw()"); }
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);
}
void superDraw(){
super.draw();
}
}
public class PolyConstructors {
public static void main(String[] args) {
RoundGlyph rg = new RoundGlyph(5);
rg.superDraw();
}
}
这样一段代码,执行结果是这样的:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5
Glyph.draw()
Thinking In Java中有一句话
Glyph.draw()方法设计将要被覆盖,这种覆盖是在RoundGlyph中发生的。(这里都OK)但是Glyph构造器会调用这个方法,结果导致了对RoundGlyph.draw()的调用。
这句话我就不太明白了,①为什么Glyph的构造器会去调用子类的draw方法而不去调用自己的draw方法呢?重写明明是在子类中发生的呀,父类中的draw方法并没有被重写吧(看我后来又调了super.draw,结果也是父类中的draw方法)。
常见的多态代码是向上转型,把一个子类的实例赋值给父类的引用,这时候产生多态,这个我知道。但是②这个多态是怎么产生的呢?
主要就是①②这两个问题
相关阅读:
git 如何把云端的代码同步到本地!?
zepto做动画效果有什么好的解决方法没
用户不在当前标签页面改变title?
secure file transfer怎么保存登陆密码
项目里一个功能出错
关于用python做国际化的一个疑问
smarty模板引擎原理有段代码不明白
两列布局中 左20% 右80% 为什么还能够换行? amazing
centos7.1编译安装nginx1.95+php7+mariaDB10.1?
flyway 无法识别sql,Unable to scan for SQL migrations in location。
可以给kvm虚拟机增加kvm_intel模块吗?
请问下这里的 call 和 apply 怎么理解
LocalResizeIMG.js在iphone下上传图片旋转了90度,如何解决
安卓微信浏览器内设置viewport不生效,如何解决?
iterm2配色问题
单链表实现问题
js检测横竖屏,页面会闪一下,求解~
CharacterEncodingFilter 类
如何在if条件里配置access_log文件
php如何去除字符串中由于字节丢失造成的乱码字符