我一直在为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成员,为什么在课堂上声明相同的方法后会被覆盖?这就是我想要理解的。
答案 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'中没有覆盖,则会调用超类方法。