2016-11-10 2 views
0

Я получаю ошибку конструктора, не имеющую по умолчанию, только в одном из моих конкретных классов, которые реализуют один и тот же абстрактный класс, и я не уверен, почему любая помощь очень ценится.«конструктор по умолчанию не доступен в абстрактном классе»

`

public abstract class Employee implements Payable 
    private String firstName; 
    private String lastName; 
    private String socialSecurityNumber; 
    private date birthdate; 

      // constructor 
      public Employee(String firstName, String lastName, 
      String social, date dob) 
      { 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.socialSecurityNumber = social; 
      //this.birthdate = getBirthdate(); 
       // Birthdate(year, month, day); 
       birthdate = dob; 
      } 



public class pieceWorker extends Employee // no default constructor available 
{ 
    private double wage; `` 
    private int pieces; 


    public void pieceWorker(String firstName, String lastName, String social,date dob, double wage, int pieces) // use some getters ? 
    { 
     super(firstName,lastName,social, dob); 
     setWage(wage); 
     setPieces(pieces); 
     this.wage = wage; 
     this.pieces = pieces; 
    } 
+1

вы расширяете класс, который не имеет конструктора без арг, так что вам нужно вызвать супер конструктор с правильные аргументы ('super (...);') – Rogue

+2

«void» перед сборкой должен быть удален. –

+0

@CarlMastrangelo правильно, это ваш синтаксис! Конструкторам не нужен тип возврата. Они всегда возвращают свой собственный экземпляр. – Sagar

ответ

1

Вы указали тип возвращаемого void для конструктора. Поскольку конструкторы не могут иметь типы возврата, вы получаете эту ошибку, потому что вы на самом деле не определили конструктор, это обычный метод. Вам нужно удалить void из метода в pieceWorker, чтобы сделать его конструктор, например:

public pieceWorker(String firstName, String lastName, String social,Date dob, double wage, int pieces) 
    { 
     super(firstName,lastName,social, dob); 
     setWage(wage); 
     setPieces(pieces); 
     this.wage = wage; 
     this.pieces = pieces; 
    } 

Кроме того, если date не является классом, вы создали, вы можете изменить его на Date, в пакете java.util.

2

Поскольку в родительском абстрактном классе нет конструктора по умолчанию (или no-arg), должен быть указан конструктор, используемый в подклассах.

В подклассе у вас нет конструктора, указанного при добавлении возвращаемого типа void. Пожалуйста, измените код, как показано ниже.

public abstract class Employee implements Payable 
    private String firstName; 
    private String lastName; 
    private String socialSecurityNumber; 
    private date birthdate; 

      // constructor 
      public Employee(String firstName, String lastName, 
      String social, date dob) 
      { 
      this.firstName = firstName; 
      this.lastName = lastName; 
      this.socialSecurityNumber = social; 
      //this.birthdate = getBirthdate(); 
       // Birthdate(year, month, day); 
       birthdate = dob; 
      } 



public class pieceWorker extends Employee // no default constructor available 
{ 
    private double wage; 
    private int pieces; 


    public pieceWorker(String firstName, String lastName, String social,date dob, double wage, int pieces) // use some getters ? 
    { 
     super(firstName,lastName,social, dob); 
     setWage(wage); 
     setPieces(pieces); 
     this.wage = wage; 
     this.pieces = pieces; 
    } 
} 
0

как уже упоминалось @Gulllie и @dammina (почти одновременно), класс сдельщика оказывает метод,

public void pieceWorker(args...) 

, а не конструктор. Следовательно, classpieceWorker будет использовать конструктор по умолчанию. Первой строкой любого конструктора является вызов super(). если вы явно не вызываете super(), java сделает это за вас.

public abstract class Employee implements Payable{ 
private String firstName; 
private String lastName; 
private String socialSecurityNumber; 
private date birthdate; 

     // constructor 
     public Employee(String firstName, String lastName, 
     String social, date dob) 
     { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.socialSecurityNumber = social; 
     //this.birthdate = getBirthdate(); 
      // Birthdate(year, month, day); 
      birthdate = dob; 
     } 
} 

У вас нет конструктора по умолчанию в над абстрактном классе, так как вы определили свой собственный конструктор. Компилятор выполнит следующую модификацию вашего класса.

public class pieceWorker extends Employee // no default constructor available 
{ 
private double wage; 
private int pieces; 

// compiler will insert following constructor 
public pieceWorker(){ 
    super(); 
} 

public void pieceWorker(String firstName, String lastName, String social,date dob, double wage, int pieces) // use some getters ? 
{ 
    super(firstName,lastName,social, dob); 
    setWage(wage); 
    setPieces(pieces); 
    this.wage = wage; 
    this.pieces = pieces; 
} 
} 

Вы можете сделать следующее, чтобы сделать ваш код работать:

public class pieceWorker extends Employee // no default constructor available 
{ 
private double wage; 
private int pieces; 

public pieceWorker(String firstName, String lastName, String social,date dob, double wage, int pieces) // use some getters ? 
{ 
    super(firstName,lastName,social, dob); 
    setWage(wage); 
    setPieces(pieces); 
    this.wage = wage; 
    this.pieces = pieces; 
} 
} 
Смежные вопросы