2010-08-17 2 views
1

Je programme sur netbeans ubuntu java standart projet (préparation de test). lorsque je crée AccountStudent.java, j'obtiens une erreur.problème d'héritage java - doit créer un constructeur vide dans la classe père

Account.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 - erreur: ne peut pas trouver le symbole: compte constructeur()

public class AccountStudent extends Account{ 

} 

Fix pour ajouter constructeur de problèmes compte vide:

Account.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++; 
} 
} 

Pourquoi devrais-je créer constructeur vide compte si elle est déjà, il existe parce qu'il héritera classe d'objets?

Merci

Répondre

8

Why should i create empty constructor Account if already he exist because he inherit Object class?

Constructors ne sont pas hérités. Si une classe n'a pas de constructeur explicite, le compilateur hte ajoute silencieusement un constructeur par défaut sans argument qui ne fait rien sauf appeler le constructeur de la superclasse sans argument. Dans votre cas, cela échoue pour AccountStudent car Account n'a pas de constructeur sans argument. L'ajouter est un moyen de résoudre cela. Une autre solution serait d'ajouter un constructeur à AccountStudent qui appelle le constructeur existant de Account, comme ceci:

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

Cette erreur devrait être reformulé à l'endroit où il est logique – TheLQ

+0

@Micheal: il y a erreur de typo. public Account (String owner) {super (propriétaire);} devrait être public AccountStudent (propriétaire de la chaîne) {super (propriétaire);}. – Shashi

+0

@Shashi: merci, corrigé –

3

Chaque classe Java doit avoir un constructeur, si vous ne définissez pas, le compilateur fait pour vous et créer un constructeur par défaut (celui sans paramètres). Si vous créez vous-même un constructeur, le compilateur n'a pas besoin d'en créer un. Donc, même s'il hérite de Object, cela ne veut pas dire qu'il aura un constructeur par défaut. Lorsque vous instanciez un AccountStudent, vous devez appeler le constructeur parent. Par défaut, si vous ne spécifiez pas vous-même un constructeur parent à appeler, il appellera le constructeur par défaut. Si vous voulez appeler explicitement un constructeur parent, vous le ferez avec super().

Il y a trois voies pour éviter l'erreur:

Appelez le constructeur parent avec un paramètre que vous obtenez du constructeur de l'enfant:

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

} 

Appelez le constructeur parent avec un paramètre que vous vous créez:

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

} 

Appelez le constructeur parent par défaut, mais vous devez en créer un car le compilateur n'en créera pas un s'il ne s'agit pas d'une construction par défaut ou existe déjà.(La solution vous a donné)

1

JLS 8.8.9 Default Constructor

Si une classe ne contient pas de déclarations du constructeur, alors un constructeur par défaut qui ne prend aucun paramètre est automatiquement fourni. Si la classe déclarée est la classe primordiale Object, le constructeur par défaut a un corps vide. Sinon, le constructeur par défaut ne prend aucun paramètre et appelle simplement le constructeur de la superclasse sans arguments.

Dans ce cas, la classe AccountStudent ne possède aucun constructeur. Le compilateur ajoute donc un constructeur par défaut et ajoute un appel au constructeur de la superclasse. Ainsi, votre classe enfant ressemble effectivement comme:

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

An object of an extended class contains state variables (fields) that are inherited from the superclass as well as state variables defined locally within the class. To construct an object of the extended class, you must correctly initialize both sets of state variables. The extended class's constructor can deal with its own state but only the superclass knows how to correctly initialize its state such that its contract is honored. The extended class's constructors must delegate construction of the inherited state by either implicitly or explicitly invoking a superclass constructor.

Java ™ langage de programmation, quatrième édition par Ken Arnold, James Gosling, David Holmes

+0

Merci pour votre réponse. Cette question a plus de deux ans et déjà répondu. Nous serons heureux de voir votre effort dans des questions plus pressantes :) – Mifeet

+0

Pas de problème, j'essaie! Merci! :) – MarkHunt