极标 2013-05-10 21:41
浏览 245
已采纳

一段代码,父类调用了子类重载的方法,求解释。

public class Person {
    
    public void fight(){
        System.out.println("Person战斗");
        say();
    }
    
    public void say(){
        System.out.println("Person说话");
    }
    
}
public class Student extends Person {
    
    @Override
    public void fight() {
        System.out.println("Student战斗!");
        super.fight();
    }

    @Override
    public void say() {
        System.out.println("Student说话!");
    }
    
    public static void main(String[] args) {
        Student student = new Student();
        student.fight();
    }
    
}

/*

输出结果

Student战斗!

Person战斗!

Student说话!

*/

  • 写回答

3条回答 默认 最新

  • lao19884wang 2013-05-11 02:14
    关注

    Student student = new Student();

    student.fight();
    调用子类的 fight方法 所以打印---Student战斗!

    而子类中的方法中super.fight();
    调用父类中的fight方法 打印--Person战斗!
    父类中的fight中又调用了say方法 你感觉奇怪的是为什么不是打印父类中say方法中的--Person说话 而是打印子类中的--Student说话 它在调用say方法的时候首先是到父类里面找say方法 然后在到子类中找 在父子类中一样的方法 jvm会认为子类重写了父类的方法 所以调用的是子类的say方法 不相信你把父类的 say方法 改成sayDota() 这样都会打印出来

    不对的请指正 继续向jinnianshilongnian膜拜!!!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵