0

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

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

学生类有2个方法:
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) 应该是最重要的吗?

非常感谢你们。我感谢你所有的答案

4

2 回答 2

2

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

于 2021-01-31T16:08:08.340 回答
1

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

于 2021-01-31T16:03:31.207 回答