2009-02-04 9 views
10

Je travaille sur une classe qui hérite d'une autre classe, mais je reçois une erreur de compilation disant "Impossible de trouver le constructeur de symbole Account()". Fondamentalement, ce que j'essaye de faire est de faire une classe InvestmentAccount qui s'étend de Compte - Compte est destiné à maintenir un équilibre avec les méthodes de retrait/dépôt d'argent et InvestmentAccount est similaire, mais le solde est stocké en actions avec un prix d'action déterminant comment De nombreuses actions sont déposées ou retirées compte tenu d'une somme d'argent donnée. Voici les premières lignes (autour où le compilateur a souligné le problème) de la sous-classe InvestmentAccount:Héritage dans Java - "Impossible de trouver le constructeur de symboles"

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... 

La classe personne est tenue dans un autre fichier (Person.java). Maintenant, voici les premières lignes du compte superclasse:

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

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

Y at-il une raison pour laquelle le compilateur est pas seulement en train de lire le constructeur de symbole pour le compte de la classe de compte? Ou dois-je définir un nouveau constructeur pour Account dans InvestmentAccount, qui lui dit d'hériter de tout?

Merci

Répondre

25

utilisation super(customer) dans le constructeur de InvestmentAccount.

Java ne peut pas savoir comment appeler le que constructeur Account a, parce que ce n'est pas un constructeur vide. Vous pouvez omettre super() uniquement si votre classe de base a une constellation vide.

changement

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

à

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

qui fonctionne.

+0

Comme je le décris, je place toujours l'appel super() dans mon constructeur, le cas échéant. – eljenso

1

Vous devez appeler explicitement le constructeur de la classe de base si la classe de base n'a pas de constructeur par défaut (un sans arguments).

Dans votre cas, le constructeur doit être:

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

Et ne redéfinit pas customer comme une variable d'instance de la sous-classe!

1

Appelez la méthode super(). Si vous souhaitez appeler le constructeur Account (Person), utilisez l'instruction super (customer); Aussi cela devrait être le premier statment dans votre InvestmentAccount constructeur

+0

Pas "devrait être" mais "doit". – Bombe

1

Soit définir un constructeur par défaut dans la classe Account:

public Account() {} 

ou appelez super(customer) dans le constructeur InvestmentAccount.

2

Vous devez appeler le constructeur de la superclasse, sinon Java ne saura pas quel constructeur vous appelez pour construire la superclasse sur la sous-classe.

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