Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不调用子类的情况下调用方法_Java_Inheritance_Polymorphism - Fatal编程技术网

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

Java 如何在不调用子类的情况下调用方法,java,inheritance,polymorphism,Java,Inheritance,Polymorphism,我一直在玩弄继承和多态性。下面代码的打印输出是:学生1人1本科生2人。所以我有两个问题: 当我在student类中调用method2()时,为什么Java会自动插入.this?如果我想打印学生1个人1学生2,而不是原始打印,会怎么样。我将如何显式调用Student类的method2 我有3个班,个人班: public class Person { public static void main(String[] args) { Person u = new Undergrad();

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

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

我有3个班,个人班:

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

这就是代码的工作原理:

  • 您创建了一个名为
    u
    本科
  • 您可以调用
    u.method1()
  • Undergrad
    没有定义
    method2
    ,因此它查看它的父对象
  • Student
    定义了
    method2
    ,因此它被称为
  • “学生1”
    已打印
  • Student::method1
    调用
    super.method1
    ,它查看
    Person
  • “个人1”
    已打印;函数返回到堆栈点6
  • Student::method1
    调用
    method2
  • 请记住,这在技术上是指
    本科
    对象。由于
    Undergrad
    覆盖
    method2
    ,因此它会打印
    Undergrad 2
  • method2
    返回到
    main

  • 如果要调用Student类的
    method2
    ,则需要找到一个不重写
    method2
    Student
    对象;也就是说,一个真正的普通学生,而不是本科生。

    代码就是这样工作的:

  • 您创建了一个名为
    u
    本科
  • 您可以调用
    u.method1()
  • Undergrad
    没有定义
    method2
    ,因此它查看它的父对象
  • Student
    定义了
    method2
    ,因此它被称为
  • “学生1”
    已打印
  • Student::method1
    调用
    super.method1
    ,它查看
    Person
  • “个人1”
    已打印;函数返回到堆栈点6
  • Student::method1
    调用
    method2
  • 请记住,这在技术上是指
    本科
    对象。由于
    Undergrad
    覆盖
    method2
    ,因此它会打印
    Undergrad 2
  • method2
    返回到
    main

  • 如果要调用Student类的
    method2
    ,则需要找到一个不重写
    method2
    Student
    对象;也就是说,一个真正的普通学生,而不是本科生。

    试着查看所有关键词,如public、final、private、static。然后是“方法隐藏”和“方法重写”的主题。还要查看“@override注释”。试着去理解你是如何铸造类的。除了本主题中的其他答案外,在您的示例中,您还可以执行以下操作:

    Student u = new Undergrad();
    

    因为任何一个本科生都是学生。但是现在你可以使用Student的方法了。因此,我建议将method2设置为Student private,这样u.method2()会打印“Student 2”。

    尝试查看所有关键字,如public、final、private、static。然后是“方法隐藏”和“方法重写”的主题。还要查看“@override注释”。试着去理解你是如何铸造类的。除了本主题中的其他答案外,在您的示例中,您还可以执行以下操作:

    Student u = new Undergrad();
    

    因为任何一个本科生都是学生。但是现在你可以使用Student的方法了。因此,我建议在Student private中设置method2,以便u.method2()打印“Student 2”。

    您已经在
    Undergrad
    中覆盖了
    method2
    ,并在
    Undergrad
    类的对象上对其进行cll。因此调用重写的
    method2
    ,因为这是polymophism的全部要点。如果您希望被重写的方法调用其超类的方法,则必须将其编程到该方法中。您已经在
    Undergrad
    中重写了
    method2
    ,并在
    Undergrad
    类的对象上对其进行了cll。因此调用重写的
    method2
    ,因为这是polymophism的全部要点。如果您希望被重写的方法调用其超类的方法,则必须将其编程到该方法中。