【问题标题】:Java Inheritance: method in subclass overrides method in superclassJava继承:子类中的方法覆盖超类中的方法
【发布时间】:2021-05-04 22:31:22
【问题描述】:

这是上下文: 有 2 个类:PersonStudent extends Person

类 Person 有 1 个方法: print(Person x) {System.out.println("Person")}(1)

class Student 有两种方法:
print(Student x) {System.out.println("Student")} (2)

print(Person x) {System.out.println("Override")} (3)

那么我有:

Person p = new Student();
Student s = new Student();
p.print(s); // prints 'Override' (*)

我从讲座中得到的解释是:因为声明类型是Person,所以编译器会选择方法(1)。但是运行时类型是Student,所以方法(3)覆盖了它。
我的问题是:为什么方法 (2) 没有覆盖?这里的参数类型是 Student(从 (*) 行开始),方法 (2) 应该是最重要的吗?

非常感谢你们。感谢您的所有回答??????

【问题讨论】:

  • 这里有两件事在起作用:覆盖和重载。阅读两者之间的相似之处和不同之处将为您解决问题。
  • @SergeyKalinichenko 我第一次听到“重载”这个词:o 非常感谢,我会搜索它

标签: java inheritance methods overriding runtime-type


【解决方案1】:

多态性!。 print 呼叫路由到 Student 而不是 Person 的原因是 print (S) 驻留在 Student 而不是 person。在打印方法被覆盖的学生中,有更广泛的参考 >Print(P),因此 print(p) 比 print(s) 被执行。您将在异常处理中看到这种情况。

【讨论】:

  • > "...因为 print (S) 驻留在 Student 而不是 person..." 您的意思是 print(P),而不是 print(S)?
  • 不,我的意思是打印。您正在使用 Persons 引用来调用参数为 Student 的方法。 Person 类没有定义该方法,但 Student 有。
【解决方案2】:

您看到“Override”的原因是因为“p”被定义为“Person”类型的对象,并且对 Student 类中包含的其他方法一无所知,即使它使用 Student 构造函数。 “Student()”作为 print 方法的参数的原因是因为 Student 是 Person 的子类,并且至少包含 Person 对象的所有信息。但是,由于“p”被定义为“Student”对象,它将使用重写的 print 方法,而不是来自 Person 类的方法。此外,print(Person) 和 print(Student) 的签名不同,因此 Student 类不会将第二个 print(Student) 方法视为覆盖。

【讨论】:

  • 谢谢!正如您的解释,如果方法 (1) 不存在,则不会打印任何内容,不是吗?
  • 如果 method1 不存在,代码将无法编译,因为 Person 类没有可供 Student 子类覆盖的 print(Person) 方法。
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 2012-11-20
  • 2019-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多