2 Stimmen

Java Vererbungsproblem - muss leeren Konstruktor in Vaterklasse erstellen

Ich programmiere auf netbeans ubuntu java standart project (test preparation). wenn ich AccountStudent.java erstellen, erhalte ich Fehler.

Konto.java

public abstract class Account {
 protected double _sum;
 protected String _owner;
 protected static int accountCounter=0;

 public Account(String owner){
     this._sum=0;
     this._owner=owner;
     accountCounter++;
 }
}

AccountStudent.java - Fehler: Symbol nicht gefunden: Konstruktor Konto()

public class AccountStudent extends Account{

}

Problembehebung - leeren Account-Konstruktor hinzufügen:

Konto.java

public abstract class Account {
 protected double _sum;
 protected String _owner;
 protected static int accountCounter=0;

 public Account(){

 }

 public Account(String owner){
     this._sum=0;
     this._owner=owner;
     accountCounter++;
 }
}

Warum sollte ich leeren Konstruktor Account erstellen, wenn er bereits existiert, weil er die Klasse Object erbt?

感謝

10voto

Michael Borgwardt Punkte 334642

Warum sollte ich einen leeren Konstruktor erstellen? Account erstellen, wenn er bereits existiert, weil er Klasse Object erbt?

Konstrukteure werden nicht vererbt. Wenn eine Klasse keinen expliziten Konstruktor hat, fügt der Compiler stillschweigend einen Standardkonstruktor ohne Argumente hinzu, der nichts anderes tut, als den Konstruktor ohne Argumente der Oberklasse aufzurufen. In Ihrem Fall schlägt das fehl für AccountStudent というのも Account verfügt nicht über einen Konstruktor ohne Argumente. Das Hinzufügen dieses Konstruktors ist eine Möglichkeit, dieses Problem zu lösen. Eine andere Möglichkeit wäre das Hinzufügen eines Konstruktors zu AccountStudent die den vorhandenen Konstruktor von Account etwa so:

public class AccountStudent extends Account{
    public AccountStudent(String owner){
        super(owner);
    }
}

3voto

Colin Hebert Punkte 88407

Jede Klasse in Java muss einen Konstruktor haben. Wenn Sie keinen definieren, übernimmt der Compiler dies für Sie und erstellt einen Standardkonstruktor (den ohne Parameter). Wenn Sie selbst einen Konstruktor erstellen, braucht der Compiler keinen zu erstellen.

Auch wenn es von Object erbt, bedeutet das nicht, dass es einen Standardkonstruktor hat.

Wenn Sie einen AccountStudent instanziieren, müssen Sie den übergeordneten Konstruktor aufrufen. Wenn Sie keinen übergeordneten Konstruktor angeben, wird standardmäßig der Standard-Konstruktor aufgerufen. Wenn Sie explizit einen übergeordneten Konstruktor aufrufen wollen, tun Sie dies mit super() .

Es gibt drei Möglichkeiten, den Fehler zu vermeiden:

Rufen Sie den übergeordneten Konstruktor mit einem Parameter auf, den Sie vom untergeordneten Konstruktor erhalten:

public class AccountStudent extends Account{
    public AccountStudent(String owner){
        super(String owner);
    }

}

Rufen Sie den übergeordneten Konstruktor mit einem Parameter auf, den Sie selbst erstellen:

public class AccountStudent extends Account{
    public AccountStudent(){
        super("Student");
    }

}

Rufen Sie den standardmäßigen übergeordneten Konstruktor auf, aber Sie müssen einen erstellen, da der Compiler keinen erstellt, wenn bereits ein nicht standardmäßiger Konstruktor vorhanden ist. (die von Ihnen angegebene Lösung)

1voto

Shashi Punkte 11900

JLS 8.8.9 Standard-Konstruktor

Wenn eine Klasse keine Konstruktordeklarationen enthält, wird automatisch ein Standardkonstruktor bereitgestellt, der keine Parameter benötigt. Handelt es sich bei der deklarierten Klasse um die ursprüngliche Klasse Object, so hat der Standardkonstruktor einen leeren Körper. Andernfalls nimmt der Standardkonstruktor keine Parameter an und ruft einfach den Konstruktor der Oberklasse ohne Argumente auf.

In diesem Fall hat die Klasse AccountStudent keinen Konstruktor, so dass der Compiler einen Standardkonstruktor für Sie hinzufügt und auch einen Aufruf des Konstruktors der Oberklasse hinzufügt. Ihre Kindklasse sieht also effektiv so aus:

    class AccountStudent extends Account{
      AccountStudent() {
      super();
     }
    }

1voto

MarkHunt Punkte 171

Ein Objekt einer erweiterten Klasse enthält Zustandsvariablen (Felder), die von der Oberklasse geerbt werden, sowie Zustandsvariablen, die lokal innerhalb der Klasse definiert sind. Um ein Objekt der erweiterten Klasse zu konstruieren Klasse zu konstruieren, müssen Sie beide Gruppen von Zustandsvariablen korrekt initialisieren. Der Konstruktor der erweiterten Klasse kann mit seinem eigenen Zustand umgehen, aber nur der Superklasse weiß, wie sie ihren Zustand korrekt initialisieren kann, so dass ihr Vertrag eingehalten wird. Die Konstruktoren der erweiterten Klasse müssen die Konstruktion des geerbten Zustands delegieren, indem sie entweder implizit oder explizit einen Konstruktor der Oberklasse aufrufen.

Die Java™-Programmiersprache, Vierte Ausgabe Von Ken Arnold, James Gosling, David Holmes

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X