У меня есть базовая ситуация наследования с перегруженным методом в суперклассе.
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
классе, должно быть, превратилась в его суперкласс. Однако это не то, что я нашел.
![screenshot](https://i.stack.imgur.com/HzGoU.png)
Очевидно, что в этом месте кода this
является объектом Employee
, однако он все же решил выполнить перегруженный метод getWorkDetail(Person p)
. Кто-нибудь может объяснить это поведение?