2016-11-10 5 views
0

Ich bekomme einen Fehler, der keine Standardkonstruktoren zur Verfügung stellt, nur in einer meiner konkreten Klassen, die dieselbe abstrakte Klasse implementieren, und ich bin nicht sicher, warum jede Hilfe sehr geschätzt wird."kein Standardkonstruktor in der abstrakten Klasse verfügbar"

`

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

Sie eine Klasse erweitern, die keinen Konstruktor keine-args hat, so dass Sie den Super-Konstruktor mit den anrufen müssen korrekte Argumente ('super (...);') – Rogue

+2

Die 'void' vor pieceWorker muss entfernt werden. –

+0

@CarlMastrangelo ist richtig, es ist Ihre Syntax! Konstruktoren benötigen keinen Rückgabetyp. Sie geben immer ihre eigene Instanz zurück. – Sagar

Antwort

1

Sie einen Rückgabetyp von void für Ihren Konstruktor angegeben haben. Da Konstruktoren keine Rückgabetypen haben können, erhalten Sie diesen Fehler, weil Sie keinen Konstruktor definiert haben, sondern nur eine normale Methode. Sie werden void von Ihrer Methode in pieceWorker entfernen müssen, um es ein Konstruktor zu machen, wie folgt aus:

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

auch, es sei denn date eine Klasse die Sie erstellt haben, möchten Sie es Date ändern, im java.util Paket.

2

Da in der parent abstrakten Klasse kein Standard (oder kein Arg) -Konstruktor vorhanden ist, muss der in Unterklassen verwendete Konstruktor angegeben werden.

In der Unterklasse haben Sie keinen Konstruktor angegeben, da Sie den Rückgabetyp void hinzugefügt haben. Bitte ändern Sie den Code wie folgt.

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

Wie durch @Gulllie und @dammina Erwähnt (fast in der gleichen Zeit), Klasse pieceWorker ein Verfahren

public void pieceWorker(args...) 

und kein Konstruktor aufweist. Daher wird die Klasse pieceWorker einen Standardkonstruktor verwenden. Die erste Zeile eines Konstruktors ist der Aufruf von super(). Wenn Sie nicht explizit super() aufrufen, macht Java das für Sie.

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

Sie haben keinen Standardkonstruktor in der obigen abstrakten Klasse, da Sie Ihren eigenen Konstruktor definiert haben. Compiler wird folgende Änderung an Ihrer Klasse "pieceWorker" vornehmen.

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

Sie können Sie wie folgt auf Ihren Code Arbeit zu machen:

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