【发布时间】:2018-10-05 10:44:17
【问题描述】:
我有一个基本的继承情况,超类中有一个重载的方法。
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;
}
}
main 方法只是简单地创建一个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,它会调用以Employee 作为参数的Person 中的重载方法。由于我对此显然错了,我打开了一个调试器,假设在Person 类中的getWorkDetail(this) 行中对“this”的引用必须已经变形为它的超类。然而,这不是我发现的。
显然此时代码this 是一个Employee 对象,但是它仍然选择执行重载方法getWorkDetail(Person p)。谁能解释这种行为?
【问题讨论】:
-
恕我直言,父类不应该对子类一无所知。我的意思是
Person类中没有getWorkDetail(Employee e)方法的位置... -
@zlakad 我认为这些功能应该是静态的?
-
@StarWeaver,静态与否,这个特定问题有什么区别?
-
类
Person中的this是静态类型Person。 -
正如@zlakad 所暗示的,这个类结构的结构很差。
this是一种隐含的非静态方法。在这里将this传递给成员方法确实没有任何意义。
标签: java inheritance overloading