java - Java中调用了哪个重载方法
问题描述
我在超类中有一个重载方法的基本继承情况。
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
,它会调用以 anEmployee
作为参数的 Person 中的重载方法。由于我对此显然错了,我打开了一个调试器,假设在类中的行getWorkDetail(this)
中对“this”的引用Person
必须已经转变为它的超类。然而,这不是我发现的。
显然此时代码this
中是一个Employee
对象,但是它仍然选择执行重载的方法getWorkDetail(Person p)
。谁能解释这种行为?
解决方案
与方法重载不同,方法重载是基于静态类型链接的。在这种情况下,getWorkDetail(this)
inPerson
只知道Person
类型。
方法重载并非旨在提供动态运行时行为。
要利用动态绑定,您可能需要重新设计代码以覆盖方法,而不是:
public static void main(String[] args) throws IOException {
new Employee("Manager1", 1976, "Female").getWorkDetail();
new Person("Manager1", 1976, "Female").getWorkDetail();
}
并根据实现类修改行为。当然,您可以重载方法,只要您在需要时也注意覆盖重载的方法。
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 getWorkDetail() {
System.out.println("This person is not an Employee");
}
}
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;
}
public void getWorkDetail() {
System.out.println("This person is an Employee");
}
}
推荐阅读
- time - influxdb连续查询的时间偏移不起作用
- html - 如何使移动菜单响应?
- react-native-android - 如何修复“react-native-spinkit:未指定”
- python - 查找每个唯一值的多列模式
- javascript - 无限滚动显示重复结果
- python - Python中的变量参数与列表作为函数参数
- python - 使用python在Houdini中旋转面对向量
- reactjs - 减速器将状态作为组件中的道具传递未定义
- c++ - 为什么sqlite的delete总是成功,即使要删除的行不存在?
- javascript - OpenVidu - 为现有发布者添加流 - Javascript