2009-02-04 5 views
10

Ich arbeite an einer Klasse, die von einer anderen Klasse erbt, aber ich erhalte einen Compilerfehler, der besagt "Ich kann den Symbolkonstruktor Account() nicht finden". Grundsätzlich versuche ich, eine Klasse InvestmentAccount zu machen, die sich von Konto - Konto erstreckt, um ein Gleichgewicht mit Methoden für das Abheben/Einlegen von Geld zu halten, und InvestmentAccount ist ähnlich, aber das Guthaben wird in Aktien mit einem Aktienkurs gespeichert, der bestimmt wie Viele Aktien werden bei einem bestimmten Geldbetrag hinterlegt oder abgehoben. Hier die ersten Zeilen (um, wo der Compiler wies darauf hin, das Problem) der Unterklasse InvestmentAccount:Vererbung in Java - "Ich kann den Symbolkonstruktor nicht finden"

public class InvestmentAccount extends Account 
{ 
    protected int sharePrice; 
    protected int numShares; 
    private Person customer; 

    public InvestmentAccount(Person customer, int sharePrice) 
    { 
     this.customer = customer; 
     sharePrice = sharePrice; 
    } 
    // etc... 

Die Person-Klasse wird in einer anderen Datei (Person.java) gehalten. Jetzt ist hier die ersten paar Zeilen des Super Konto:

public class Account 
{ 
    private Person customer; 
    protected int balanceInPence; 

    public Account(Person customer) 
    { 
     this.customer = customer; 
     balanceInPence = 0; 
    } 
    // etc... 

Gibt es einen Grund, warum der Compiler nicht nur ist das Symbol Konstruktor für Konto aus der Klasse Konto zu lesen? Oder muss ich einen neuen Konstruktor für Account innerhalb von InvestmentAccount definieren, der ihm sagt, dass er alles erben soll?

Dank

Antwort

25

Verwendung super(customer) in InvestmentAccount Konstruktor.

Java kann nicht wissen, wie die nur Konstruktor aufzurufen Account hat, weil es kein leeren Konstruktor ist. Sie können super() nur auslassen, wenn Ihre Basisklasse einen leeren Konstruktor hat.

ändern

public InvestmentAccount(Person customer, int sharePrice) 
{ 
     this.customer = customer; 
     sharePrice = sharePrice; 
} 

zu

public InvestmentAccount(Person customer, int sharePrice) 
{ 
     super(customer); 
     sharePrice = sharePrice; 
} 

, die funktionieren.

+0

Wie ich regele ich immer den super() Aufruf in meinem Konstruktor wenn anwendbar .. – eljenso

1

Sie müssen den Konstruktor der Basisklasse explizit aufrufen, wenn die Basisklasse keinen Standardkonstruktor hat (einen ohne Argumente).

public InvestmentAccount(Person customer, int sharePrice) { 
    super(customer); 
    sharePrice = sharePrice; 
} 

Und bringt keine customer als Instanzvariable der Unterklasse:

In Ihrem Fall sollte der Konstruktor sein!

1

Rufen Sie die super() -Methode auf. Wenn Sie den Account (Person) -Konstruktor aufrufen möchten, verwenden Sie die Anweisung super (Kunde); Auch sollte dies der erste statment sein in Ihrem InvestmentAccount Konstruktor

+0

Nicht "sollte sein" sondern "muss". – Bombe

1

entweder einen Standard-Konstruktor in der Account Klasse definieren:

public Account() {} 

Oder super(customer) im InvestmentAccount Konstruktor aufrufen.

2

Sie müssen den Superklassenkonstruktor aufrufen, sonst weiß Java nicht, welchen Konstruktor Sie aufrufen, um die Oberklasse für die Unterklasse zu erstellen.

public class InvestmentAccount extends Account { 
    protected int sharePrice; 
    protected int numShares; 
    private Person customer; 

    public InvestmentAccount(Person customer, int sharePrice) { 
     super(customer); 
     this.customer = customer; 
     sharePrice = sharePrice; 
    } 
}