我一直在为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”。

如果以前的Employee没有访问HRExecutive成员的权限,为什么在类中声明相同的方法后又将其覆盖?这是我想了解的。

最佳答案

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

但是,如果为getInt()声明了Employee,则可以调用它,并且在运行时将调用与实例的动态类型相对应的方法,即HRExecutive

10-06 12:49