2016-09-29 4 views
2

Если у меня есть abstract class называется Сотрудник имеющий constructor:Абстрактные классы и Конструкторы

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

Как я должен написать constructor из subclass имени SalariedEmployee, имеющий дополнительный attribute (не в super class)?

ответ

2

Просто создать конструктор, имеющий дополнительный параметр [ы] и вызвать конструктор суперкласса с помощью 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; 
} 

Конструктор может, так как это в первой строке вызовите другой конструктор того же class, используя this(args) или конструктор суперкласса, используя super(args). Если такой вызов не выполняется, компилятор автоматически вставляет вызов в super() - конструктор суперкласса без аргументов. Следствием этого является то, что если такой вызов не производится, и у суперкласса нет конструктора аргументов без аргументов, то это ошибка компилятора.

От JLS §8.8.7:

Первое утверждение в теле конструктора может быть явным вызовом другого конструктора того же класса или прямого суперкласса (§8.8.7.1).

...

Если тело конструктора не начинается с явным вызовом конструктора и конструктора объявляемым не является частью изначального класса Object, то тело конструктора неявно начинается с вызовом конструктора суперкласса «супер(); ", вызов конструктора его прямого суперкласса, который не принимает аргументов.

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

Вы просто написать конструктор, который способен предоставить значения name и extensionNumber конструктору суперкласса и делать все, что вам нравится.

Я бы лично сделать 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, как это на самом деле, вероятно, будет простой номер - в то время как полные номера телефонов лучше всего хранятся в виде строк.)

Смежные вопросы