grekevin 发表于 2021-5-10 11:02

请大神进来看看,小弟才疏学浅

输出结果为什么是这样的,实在是想不通?菜鸟求助
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();
      }
}

/*
输出结果:
我是一个人
学生应该吃有营养的食物
*/

wslans 发表于 2021-5-10 11:08

两个函数不一样,一个public,一个private

fengchuan 发表于 2021-5-10 11:16

@Override重写了 Person 类里的eat方法

along6 发表于 2021-5-10 11:17

把父类的speak方法写成公共的,然后在子类重写就好了,还有,下次发帖请说明下你想输出的结果是啥样的,不然靠猜吗{:301_1008:}

grekevin 发表于 2021-5-10 11:20

wslans 发表于 2021-5-10 11:08
两个函数不一样,一个public,一个private

这个我知道,可以讲的再详细点吗?比如在函数show()内部,怎么确定是调用父类的speak方法还是调用子类的speak方法,底层原理是什么?JVM怎么确定调用那个方法?对子类来说,speak不算是重写了父类的speak方法,算是子类特有的方法,但是起码子类是有speak方法的。如果子类重写了speak父类的speak方法,就会调用重写后的speak方法。

grekevin 发表于 2021-5-10 11:21

本帖最后由 grekevin 于 2021-5-10 11:22 编辑

along6 发表于 2021-5-10 11:17
把父类的speak方法写成公共的,然后在子类重写就好了,还有,下次发帖请说明下你想输出的结果是啥样的,不 ...
重写speak我理解,我的代码中这样我就搞不通了;结果在代码的最下面,不好意思,开头没明确表明

grekevin 发表于 2021-5-10 11:24

fengchuan 发表于 2021-5-10 11:16
@Override重写了 Person 类里的eat方法

谢谢,eat方法的调用我知道;speak方法的调用搞不通;不是子类也有speak方法,为什么不调用?

小柏_Bai 发表于 2021-5-10 11:48



new一个子类对象,会初始化父类,在实例化子类,这时候,eat被重写,speak用为private,不被重写。

调用show方法,子类没有,进入父类查找调用,找到speak因为私有化没有被重写会调用父类方法。

然后调用eat方法。才有你下面的结果

小柏_Bai 发表于 2021-5-10 11:49

你再父类方法写了eat,同等于this.eat()。如果你想调用父类eat,你需要加上super,super.eat().

小柏_Bai 发表于 2021-5-10 11:50

grekevin 发表于 2021-5-10 11:24
谢谢,eat方法的调用我知道;speak方法的调用搞不通;不是子类也有speak方法,为什么不调用?

speak的方法修饰符是private,私有的,private修饰的方法无法被子类重写
页: [1] 2
查看完整版本: 请大神进来看看,小弟才疏学浅