Java继承 - 在为派生对象使用基础变量时,派生类会覆盖基类方法

时间:2017-10-10 04:52:54

标签: java inheritance

我一直在为OCA Java SE 8认证做准备,而且我已经做了很多学习,对我来说最困难的部分之一就是继承,主要是因为我开始用PHP编程所以我的编程天堂是如此面向对象。无论如何,我的问题如下:

class MyOffice{
    public static void main(String args[]){
        Employee emp = new HRExecutive();

        int x = emp.getInt();

        System.out.println(x);
    }
}

class Employee {
    public String name;
    String address;
    protected String phoneNumber;
    public float experience;
    int y = 12;

    /* COMMENTED CODE THAT GETS OVERRIDDEN WHEN UNCOMMENTED
    public int getInt(){
        System.out.println("Employee getInt");
        return y;
    }
    */
}

interface Interviewer{
    public void conductInterview();
}

class HRExecutive extends Employee implements Interviewer{
    public String[] specialization;
    int elInt = 10;
    public void conductInterview(){
        System.out.println("HRExecutive - conducting interview");
    }

    public int getInt(){
        System.out.println("HRExecutive getInt");
        return elInt;
    }
}

使用Employee变量创建HRExecutive对象,它不允许我到达任何HRExecutive成员,尝试编译将因找不到符号而失败,这是有道理的。

但是当我删除注释并在基类Employee中声明getInt()时,它会被HRExecutive的方法覆盖。它打印" HRExecutive getInt"和" 10"。

如果之前的员工无法访问HRExecutive成员,为什么在课堂上声明相同的方法后会被覆盖?这就是我想要理解的。

2 个答案:

答案 0 :(得分:1)

在编译时,您只知道实例的静态类型,在这种情况下为Employee。当Employee没有getInt()方法时,您无法调用它。

但是如果为getInt()声明Employee,则可以调用HRExecutive,并且在运行时,将调用与keytool -list -v -keystore KEYSTORE_PATH -alias ALIAS_NAME 实例的动态类型对应的方法。

答案 1 :(得分:1)

“如果之前的员工无法访问HRExecutive成员,为什么在课堂上声明相同的方法后会被覆盖?”

原因是动态绑定。即使方法'getInt()'由'Employee'变量调用,它也会在'HRExecutive'对象上调用。因此,在运行时,方法调用将解析子类方法,即'HRExecutive'中的方法。如果'HRExecutive'中没有覆盖,则会调用超类方法。