【问题标题】:Calling a function placed in another function that is in another class调用放置在另一个类中的另一个函数中的函数
【发布时间】:2023-03-12 12:43:01
【问题描述】:

我无法理解为什么下面的代码会打印控制台 Person 两次。我认为应该是 Person 和 Student。当通过“a”对象调用 printPerson() 中的 getInfo() 时,为什么 Person 类中的那个被调用而 Student 类中的那个没有被调用?提前致谢。

class deneme{
     public static void main(String[] args) {
        Person b = new Person();
        b.printPerson();
        Student a = new Student();
        a.printPerson();
    }
}

class Student extends Person {
     public String getInfo() {
        return "Student";
    }

 }

class Person{

     private String getInfo() {
        return "Person";
    }

     public void printPerson() {
        System.out.println(getInfo());
    }
}

【问题讨论】:

    标签: java function object inheritance polymorphism


    【解决方案1】:

    我认为这是因为Person.getInfo()private 并且你不能覆盖私有方法,所以a.printPerson() 实际上会调用它自己的getInfo()。始终使用 @Override 注释要覆盖的方法;如果在父类中找不到要覆盖的方法,编译器将抛出错误。
    如果您想将 Person.getInfo() 设为其他类的私有但仍想覆盖它,只需将其设为 protected

    【讨论】:

      【解决方案2】:

      您试图覆盖private 方法。这是不可能的。有关详细信息,请参阅Override "private" method in java。因为Student 看不到Person.getInfo,Java 假定您正在声明一个新方法。

      如果您将getInfo 设为公开,您会发现Student 会被打印出来。

      这是在您打算覆盖超类方法的任何方法之前使用@Override 注释的好参数。它不仅仅是文档——它可以通过让您的 IDE 发出警告来避免细微的错误。

      【讨论】:

      • 实际上我知道私有方法不能被覆盖并且我声明了一个新方法。但是我感到困惑的一点是我通过 Student 类的对象在 main 方法中调用 printPerson 方法,即使我通过 Student 类在 main 方法中调用 printPerson 方法,Student 中的 getInfo 方法也没有被调用,这并不奇怪对象?
      • Person.printPerson 知道getInfo 是私有的,因此不可覆盖。所以this 的实际类型在那时是无关紧要的——它必须调用本地私有getInfo
      猜你喜欢
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2013-08-10
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      相关资源
      最近更新 更多