Mer*_*ack 6 java subclass this superclass
代码是这样的:
class Main {
public static void main(String args[]) {
Person p1 = new Student();
Person p3 = new Teacher();
Student p4 = new Student();
OnlineLecture lec3 = new OnlineLecture();
lec3.addAttendant(p1);
lec3.addAttendant(p3);
lec3.addAttendant(p4);
}
}
abstract class Person {
public void join(Lecture lec) {
System.out.println("Joining "+lec);
}
public void join(OnlineLecture lec) {
System.out.println("Joining "+lec);
}
}
class Student extends Person {
public void join(Lecture lec) {
System.out.println("Student joining "+lec);
}
}
class Teacher extends Person {
public void join(OnlineLecture lec) {
System.out.println("Teacher joining "+lec);
}
}
class Lecture {
public void addAttendant(Person p) {
p.join(this);
}
public String toString() {
return "a lecture";
}
}
class OnlineLecture extends Lecture {
public String toString() {
return "an online lecture";
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我得到的输出是这样的:
Student joining an online lecture
Joining an online lecture
Student joining an online lecture
Run Code Online (Sandbox Code Playgroud)
不应该在 lec3 上调用的“addAttendant”方法中的“join(this)”导致“join(OnlineLecture lec3)”,因此给出这个
Joining an online lecture
Teacher joining an online lecture
Joining an online lecture
Run Code Online (Sandbox Code Playgroud)
作为输出?
reference.method()当调用a 时就会表现出多态性object类型引用的动态行为reference static class Lecture {
public void addAttendant(Person p) {
p.join(this);
}
}
Run Code Online (Sandbox Code Playgroud)
addAttendant,多态性可以根据类型控制调用哪个方法。objectLecturesubclass(es)Lecture.addAttendant匹配的方法签名(即使可以动态引用)。即使所引用的对象可能是多态类型,这里也不存在多态性。p.join(this)join(Lecture)pthis