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

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说话!

*/

Student student = new Student();

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

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

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

你先子类继承了父类。那子类中就有了父类的方法。这叫重载
public class Student extends Person {
这里你在fight中改变了方法内容,就是重写了父类的方法,当你用子类对象调用fight的时候,就是调用子类自己这个重写后的方法。

@Override
public void fight() {
System.out.println("Student战斗!");
super关键字表示的就是父类的引用。所以打印内容参考person的fight()实现
super.fight();
}

@Override
public void say() {
    System.out.println("Student说话!");
}

public static void main(String[] args) {
     这里你生命的是子类自己的对象,所以调用的也就是子类自己的方法。
       另外你可以吧Person定义成 public abstract interface Person class 然后你在试试。

    Student student = new Student();
    student.fight();
}

}

这道题今天之前我也不会,不过现在懂了。嘿嘿。