java - 如何在不调用子类的情况下调用方法

标签 java inheritance polymorphism

我一直在研究继承和多态性。下面代码的打印结果是:Student 1 Person 1 Undergrad 2。所以我有两个问题:

为什么当我在学生类中调用method2()时,Java会自动插入一个.this?如果我想打印出 Student 1 Person 1 Student 2,而不是原始打印输出,该怎么办。我如何显式调用 Student 类的 method2?

我有 3 个类,Person 类:

public class Person {
  public static void main(String[] args) {
    Person u = new Undergrad();
    u.method1();
  }
  public void method1() {
    System.out.print("Person 1 ");
  }
  public void method2(){
    System.out.print("Person 2 ");
  }   
}

学生类(class)

public class Student extends Person {
  public void method1(){
    System.out.print("Student 1 ");
    super.method1();
    method2();
  }
  public void method2(){
    System.out.print("Student 2");
  }
}

本科生类:

public class Undergrad extends Student{
  public void method2(){
    System.out.print("Undergrad 2 ");
  }
}

最佳答案

这就是代码的工作原理:

  1. 您创建了一个名为 u本科生
  2. 您调用u.method1()
  3. Undergrad 未定义 method2,因此它会查看其父级。
  4. Student 定义了 method2,因此被调用。
  5. 打印“学生 1”
  6. Student::method1 调用 super.method1,它查看 Person
  7. “Person 1” 被打印;函数返回到堆栈点 6
  8. Student::method1 调用 method2
  9. 请记住,这在技术上指的是 Undergrad 对象。由于 Undergrad 覆盖 method2,因此它会打印 Undergrad 2
  10. method2 返回到 main

如果您想调用 Student 类的 method2,您需要找到一个不会覆盖 method2Student 对象;也就是说,一个真正的普通学生,而不是本科生。

关于java - 如何在不调用子类的情况下调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47084154/

相关文章:

java - 无法更新 GWT ui Binder 中的工具提示标题

c++ - 自定义对象的 vector

java - 仍然无法让基本的 Symja 评估发挥作用

Java Graphics2D、JPanel、JScrollPane

JavaScript继承: member functions not inheriting?

Java类继承,子类可以访问私有(private)字段,为什么?

C++:多态容器/迭代器与编译时概念/特征

python - 在 Python 中,有什么方法可以从其父类调用子类的方法重写吗?

c++ - 使用 operator<< 重载打印派生对象不起作用

java - 如何将 HTTP 状态代码转换为 Java 中的文本?