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();
}
}
这道题今天之前我也不会,不过现在懂了。嘿嘿。