2017-10-10 106 views
0

我一直在为OCA Java SE 8认证做准备,并且我一直在做很多的学习,最难的部分之一对我来说,一直是继承,主要是因为我开始使用PHP进行编程,所以我的编程并没有如此面向对象。不管怎样,我的问题是:Java继承 - 在派生对象中使用基本变量时,派生类重写基类方法

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; 
    } 
} 

使用员工变量来创建一个HRExecutive对象,它不会让我达成任何HRExecutive成员,试图编译将会失败是由于没有找到符号,这使得感。

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

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

+0

这就是多态性的要点。你可以在基类中声明一个方法;当代码调用该方法时,程序实际上可以运行该方法的不同实现,具体取决于对象是否实际上是该基类或其某个子类的对象。你真的应该通过一个教程来了解基本概念。 Oracle有一个[这里](https://docs.oracle.com/javase/tutorial/java/concepts/),虽然有可能更好。 – ajb

回答

1

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

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

1

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

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