У меня есть базовая ситуация наследования с перегруженным методом в суперклассе.
public class Person {
private String name;
private int dob;
private String gender;
public Person(String theName, int birth, String sex){
name = theName;
dob = birth;
gender = sex;
}
public void work(){
getWorkDetail(this);
}
public void getWorkDetail(Employee e){
System.out.println("This person is an Employee");
}
public void getWorkDetail(Person p){
System.out.println("This person is not an Employee");
}
}
Следующий класс Employee
расширяет класс Person
выше:
public class Employee extends Person {
String department;
double salary;
public Employee(String theName, int birth, String sex){
super(theName, birth, sex);
department = "Not assigned";
salary = 30000;
}
}
Основной метод просто создает объект Employee
(как статический, так и динамический) и вызывает на нем функции .work()
:
public static void main(String[] args){
Employee e1 = new Employee("Manager1", 1976, "Female");
e1.work();
}
Это заканчивается печатью
This person is not an Employee
Просматривая это, я подумал, что поскольку статический и динамический тип объекта e1
является Employee
он вызывает перегруженный метод в Person, который принимает Employee
в качестве параметра. Поскольку я явно ошибаюсь в этом, я открыл отладчик, предполагая, что ссылка на "this" в строке getWorkDetail(this)
в классе Person
должна была превратиться в суперкласс. Однако это не то, что я нашел.
Очевидно, что в этот момент кода this
объект Employee
, однако он все же решил выполнить перегруженный метод getWorkDetail(Person p)
. Может ли кто-нибудь объяснить это поведение?