如何在不调用其子类

时间:2017-11-02 20:31:34

标签: java inheritance polymorphism

我一直在玩继承和多态。以下代码的打印出来是:学生1人1本科生2.所以我有两个问题:

为什么当我在学生班中调用method2()时,Java会自动插入.this?如果不是原始打印出来,我想打印出学生1人1学生2.如何显式调用学生班的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 ");
  }   
}

学生班

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 ");
  }
}

2 个答案:

答案 0 :(得分:2)

这就是代码的工作原理:

  1. 您创建了一个名为(array([0], dtype=int64), array([0], dtype=int64)) (array([2], dtype=int64), array([1], dtype=int64)) 的{​​{1}}。
  2. 您致电Undergrad
  3. u未定义u.method1(),因此会查看其父级。
  4. Undergrad定义method2,因此会调用它。
  5. Student已打印
  6. method2调用"Student 1 ",查看Student::method1
  7. super.method1已打印;函数返回到6
  8. 的堆栈点
  9. Person来电"Person 1 "
  10. 请记住,这在技术上指的是Student::method1对象。由于method2会覆盖Undergrad,因此会打印Undergrad
  11. method2返回Undergrad 2
  12. 如果要调用Student类的method2,则需要找到不覆盖main的{​​{1}}对象;也就是说,一个真正的正常学生,而不是本科生。

答案 1 :(得分:0)

尝试查看所有关键字,例如public,final,private,static。然后是"方法隐藏"的主题。和"方法覆盖"。另请查看' @override注释'。尝试了解如何投射课程。除了本主题中的其他答案,在您的示例中,您还可以执行以下操作:

Student u = new Undergrad();

因为Undergrad的任何实例也是学生。但是现在您可以访问Student的方法。因此,我建议在Student内部设置method2,以便u.method2()打印"学生2"。