2010-12-06 7 views
3

Hé les gars, je vais avoir un sacré problème avec un problème dans un ensemble de problèmes sur lequel je travaille - je pense avoir un bloc parce qu'il est écrit être délibérément déroutant. Voici le problème que je donné:Java - Prolonge le numéro

class A { 
    int x; 
    A(int a) {System.out.println(" class A");} 
} 

class B extends A { 
    int x; 
    B() {System.out.println(" class B");} 
    public static void main (String [] args) { 
    A a = new B(); 
    } 
} 

Quand je compile, je reçois l'erreur suivante mis à la porte de la console:

cannot find symbol 
symbol : constructor A() 
location: class A 
    B() {System.out.println(" class B");} 
    ^

et je suis censé être en mesure de corriger cette erreur en classe B sans toucher à la classe A. Il me manque clairement quelque chose de stupidement évident, mais j'ai essayé des permutations de tout ce à quoi je peux penser pendant une heure et rien ne fonctionne.

Jusqu'à présent, j'ai essayé:

  • jetant un vide devant B() - même erreur.
  • en faisant B() dans A (int a) - ce dernier revient avec une erreur de déclaration de méthode invalide (l'ajout d'un vide en face de moi renvoie l'erreur "can not find symbol")
  • () B (int a) - même erreur, plus jette une erreur supplémentaire "ne peut pas trouver le symbole" depuis que j'ai maintenant saccagé la déclaration B().
  • faire de la classe B étend A dans la classe B étend A (int A) - lance neuf erreurs. Clairement pas la réponse. Changer le nom de classe de A à Apple juste pour voir si cela me donnerait une réponse - cela veut que j'ajoute un vide devant A (int a) dans la classe Apple, ce que je ne peux pas faire.

Que diable est-ce que je manque ici? Ce n'est pas un cours avancé, donc ça ne peut pas être terriblement compliqué, mais ça me rend complètement fou. Toute aide serait grandement appréciée.

Répondre

5

Dans une classe dérivée, vous devez appeler le constructeur de la classe de base. Si vous ne le faites pas explicitement, le compilateur essaiera d'insérer un appel au constructeur sans argument - s'il n'en existe aucun dans la classe de base, vous obtenez cette erreur.

La solution est d'appeler explicitement le constructeur de la classe de base avec une certaine valeur:

B() { 
    super(0); 
    System.out.println(" class B"); 
} 
+0

vous me battre de 45 secondes :) –

+0

Ah - Je me souviens que j'ai essayé de le faire comme super (a) et il a jeté une erreur, probablement parce que je ne définissais pas vraiment. Je vous remercie! – BigE

+0

@BigE: Veuillez cocher cette réponse en cliquant sur la case à cocher située à gauche. Merci. – Asaph

0

classe A ne dispose pas d'un constructeur par défaut parce que vous n'avez pas écrit un (mais vous n'écrire un qui prend un int paramètre).

La classe B a un constructeur par défaut sans argument. Il doit appeler un constructeur de superclasse, mais il ne peut pas parce qu'il n'y a pas une telle chose dans la classe A.

+0

Ouais, j'ai compris, mais j'essayais de trouver comment contourner ce problème - le poste d'Anon a la solution qui a fonctionné. Merci! – BigE

2

votre premier appel dans le constructeur de B doit être super (a); étant ce que vous voulez entrer dans le constructeur de B.

+0

Ouais - (a) doit être un entier réel cependant, parce qu'avant j'ai posté j'ai essayé de le faire avec la variable et cela n'a pas fonctionné et a figuré que se dirigeait dans la mauvaise route. Oops! :) – BigE

1

1) Lorsque vous étendez une classe, votre sous-classe contient implicitement un bloc de données constitué de toutes les données utilisées pour créer une instance de la superclasse. Vous devez également initialiser ces données. Si vous ne dites pas comment il sera initialisé, il est supposé que vous voulez le constructeur par défaut, c'est-à-dire A.A(). Mais ce constructeur n'existe pas - vous avez seulement A.A(int).

Pour ce faire, l'initialisation, la première ligne dans le constructeur B, vous faites un appel au constructeur A, avec une syntaxe spéciale comme suit:

B() { 
    super(42); 
    // because we are calling the constructor that takes an int, we must supply 
    // one. It's up to you to figure out what values should be supplied. Maybe 
    // you wanted to take an int in the B constructor, and pass it along? 
    System.out.println(" class B"); 
} 

2) Vous avez un int x; déclaré dans les deux classes A et classe B. Ce n'est probablement pas ce que vous voulez. Comme indiqué, chaque instance B contient déjà un int x - celui qu'il obtient automatiquement parce que B étend A.

+0

C'est juste un exercice pour se débarrasser de l'erreur, donc tout int fourni fonctionne très bien et n'affecte pas la sortie de la console. Je vous remercie! – BigE