请大神进来看看,小弟才疏学浅
输出结果为什么是这样的,实在是想不通?菜鸟求助class Person {
public void eat() {
System.out.println("吃饭");
}
private void speak() {
System.out.println("我是一个人");
}
public void show() {
speak();
eat();
}
}
public class Student extends Person {
@Override
public void eat() {
System.out.println("学生应该吃有营养的食物");
}
public void speak() {
System.out.println("我是一个学生");
}
public static void main(String[] args) {
Student s = new Student();
s.show();
}
}
/*
输出结果:
我是一个人
学生应该吃有营养的食物
*/ 两个函数不一样,一个public,一个private @Override重写了 Person 类里的eat方法 把父类的speak方法写成公共的,然后在子类重写就好了,还有,下次发帖请说明下你想输出的结果是啥样的,不然靠猜吗{:301_1008:} wslans 发表于 2021-5-10 11:08
两个函数不一样,一个public,一个private
这个我知道,可以讲的再详细点吗?比如在函数show()内部,怎么确定是调用父类的speak方法还是调用子类的speak方法,底层原理是什么?JVM怎么确定调用那个方法?对子类来说,speak不算是重写了父类的speak方法,算是子类特有的方法,但是起码子类是有speak方法的。如果子类重写了speak父类的speak方法,就会调用重写后的speak方法。 本帖最后由 grekevin 于 2021-5-10 11:22 编辑
along6 发表于 2021-5-10 11:17
把父类的speak方法写成公共的,然后在子类重写就好了,还有,下次发帖请说明下你想输出的结果是啥样的,不 ...
重写speak我理解,我的代码中这样我就搞不通了;结果在代码的最下面,不好意思,开头没明确表明 fengchuan 发表于 2021-5-10 11:16
@Override重写了 Person 类里的eat方法
谢谢,eat方法的调用我知道;speak方法的调用搞不通;不是子类也有speak方法,为什么不调用?
new一个子类对象,会初始化父类,在实例化子类,这时候,eat被重写,speak用为private,不被重写。
调用show方法,子类没有,进入父类查找调用,找到speak因为私有化没有被重写会调用父类方法。
然后调用eat方法。才有你下面的结果
你再父类方法写了eat,同等于this.eat()。如果你想调用父类eat,你需要加上super,super.eat(). grekevin 发表于 2021-5-10 11:24
谢谢,eat方法的调用我知道;speak方法的调用搞不通;不是子类也有speak方法,为什么不调用?
speak的方法修饰符是private,私有的,private修饰的方法无法被子类重写
页:
[1]
2