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