class Glyph{
void draw(){
System.out.println("Glyph.draw()");
}
Glyph(){
System.out.println("Glyph() before draw()");
draw();
System.out.println("Glyh() 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);
}
}
public class PolyConstructors {
public static void main(String [] args){
new RoundGlyph(5);
}
}
输出:
Glyph() before draw()
RoundGlyph.draw(),radius =0
Glyh() after draw()
RoundGlyph.RoundGlyph(),radius =5
问题: 为何会打印第二行呢?初始化基类构造器时调用的不是内部的draw()方法吗?

java 多态中的一些问题
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- 你知我知皆知 2024-08-02 13:42关注
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在Java多态中,我们使用继承来实现多重性。在这个例子中,
RoundGlyph
类是Glyph
类的一个子类。这意味着当我们创建一个RoundGlyph
对象时,实际上是创建了一个新的对象,并且这个对象将具有自己的draw()
方法。在
RoundGlyph
的构造函数中,它首先调用了super()
关键字,这表示它是在调用基类的构造函数(这里是Glyph
)。然后,它设置了radius
属性,并调用了super()
关键字再次调用draw()
方法。因此,在输出信息中,“RoundGlyph.draw”,实际上是在调用基类
Glyph
的draw()
方法,而不是它的内部实现。这是因为super()
关键字会在任何被继承的方法调用之前执行,即使它们是私有的或非静态的。如果你想要只显示
roundGlyph
的draw()
方法,你可以这样做:public class PolyConstructors { public static void main(String[] args) { RoundGlyph roundGlyph = new RoundGlyph(5); roundGlyph.draw(); } }
这样,只输出
RoundGlyph.draw()
而不输出RoundGlyph.draw(),radius =5
。解决 无用评论 打赏 举报