2016-09-29 183 views
2

如果我有一個abstract class稱爲具有constructor員工抽象類和構造函數

public abstract class Employee { 
    //instance fields or attributes of employee 
    public Employee(String name, String extensionNumber){ 
     //initializing the variables 
    }  

我怎麼寫有在附加attribute(不是subclass命名SalariedEmployeeconstructorsuper class)?

回答

2

只需創建具有附加參數[S]一個構造函數和調用使用super超類的構造函數:

public class SalariedEmployee extends Employee { 
    //instance fields or attributes of employee 
    public SalariedEmployee(String name, String extensionNumber, int salary) { 
     super(name,extensionNumber); 
     // more logic 
    } 
} 
+0

謝謝。之後我回答了邏輯。 –

3

你會寫:

public SalariedEmployee(String name, int extensionNumber, BigDecimal salary) { 
    super(name, extensionNumber); 
    this.salary = salary; 
} 

構造函數可以,因爲它是第一行使用this(args)或使用super(args)的超類的構造函數調用另一個構造函數class。如果沒有這樣的調用,編譯器會自動插入一個調用super() - 無參數超類的構造函數。推論是,如果沒有這樣的調用,並且超類沒有無參數構造函數,那麼這是一個編譯器錯誤。

JLS §8.8.7

一個構造體的第一個語句可以是相同的類或直接超類(§8.8.7.1)的另一個構造的明確調用。

...

如果構造體不明確的構造函數調用,並正在申報的構造開始不是原始類對象的一部分,然後在構造函數體含蓄與超類構造函數調用「超級開始();「,它的直接超類的構造函數的調用不帶任何參數。

2

如果子類SalariedEmployee有一個額外的字段,然後您可以創建接受這個參數,然後調用抽象父類的構造函數構造:

public class SalariedEmployee extends Employee { 
    private String param; 

    public SalariedEmployee(String name, String extensionNumber, String param) { 
     super(name, extensionNumber); 
     // do something with 'param', e.g. 
     this.param = param; 
    } 
} 
+1

謝謝你可以這樣做:this.param = param –

7

你只寫一個構造函數,能夠將nameextensionNumber值提供給超類的構造函數,並執行其他任何你喜歡的操作。

我會親自做Employee構造protected爲好,因爲它確實是提供給子類。請注意,除了這方面之外,在抽象類和具體類中使用構造函數確實沒有區別。

public abstract class Employee { 
    // ... 
    protected Employee(String name, String extensionNumber) { 
     // ... 
    } 
} 

public class SalariedEmployee extends Employee { 
    // ... (probably a field for the salary) 

    public SalariedEmployee(String name, String extensionNumber, BigDecimal salary) { 
     // Pass information to the superclass constructor to use as normal 
     super(name, extensionNumber); 
     // Use salary here 
    } 
} 

請注意,這不是要求你有相匹配的超類的參數,參數,只要你能在super電話爲他們提供。例如:

public class SalariedEmployee extends Employee { 
    ... 

    public SalariedEmployee(Employee plainEmployee, BigDecimal salary) { 
     super(plainEmployee.getName(), plainEmployee.getExtensionNumber()); 
     // Use salary here 
    } 
} 

(您可能還需要考慮把extensionNumberint,而不是String,因爲它確實很可能是一個普通的數字 - 而完整的電話號碼最好作爲字符串存儲)。