2017-10-10 108 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'中沒有重寫,超類方法會被調用。