2014-09-02 13:29 采纳率: 0%
浏览 744

java 多态中的一些问题

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()方法吗?

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-02 13:42
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Java多态中,我们使用继承来实现多重性。在这个例子中,RoundGlyph 类是 Glyph 类的一个子类。这意味着当我们创建一个 RoundGlyph 对象时,实际上是创建了一个新的对象,并且这个对象将具有自己的 draw() 方法。

    RoundGlyph 的构造函数中,它首先调用了 super() 关键字,这表示它是在调用基类的构造函数(这里是 Glyph)。然后,它设置了 radius 属性,并调用了 super() 关键字再次调用 draw() 方法。

    因此,在输出信息中,“RoundGlyph.draw”,实际上是在调用基类 Glyphdraw() 方法,而不是它的内部实现。这是因为 super() 关键字会在任何被继承的方法调用之前执行,即使它们是私有的或非静态的。

    如果你想要只显示 roundGlyphdraw() 方法,你可以这样做:

    public class PolyConstructors {
    
        public static void main(String[] args) {
            RoundGlyph roundGlyph = new RoundGlyph(5);
            roundGlyph.draw();
        }
    }
    

    这样,只输出 RoundGlyph.draw() 而不输出 RoundGlyph.draw(),radius =5

    评论

报告相同问题?