首页 > 解决方案 > 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)。谁能解释这种行为?

标签: javainheritanceoverloading

解决方案


与方法重载不同,方法重载是基于静态类型链接的。在这种情况下,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");
    }
}

推荐阅读