gpt4 book ai didi

Java 继承 - 当对派生对象使用基变量时,基类方法被派生类覆盖

转载 作者:行者123 更新时间:2023-12-02 02:34:07 24 4
gpt4 key购买 nike

我一直在准备 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() 方法时,您无法调用它。

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

关于Java 继承 - 当对派生对象使用基变量时,基类方法被派生类覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46658827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com