5
votes

Erreur de polymorphisme dans Java: impossible de trouver le symbole

Je viens de commencer à apprendre la programmation orientée objet à partir du livre head first java.Il dit que le polymorphisme me permet de créer un tableau de type superclasse puis d'avoir toutes les sous-classes comme éléments du tableau.Mais quand j'ai essayé d'écrire du code en utilisant les mêmes principes, il a rencontré une erreur en disant erreur: impossible de trouver le symbole J'ai créé les classes, la superclasse était animale et la classe chien a étendu la classe animale en ayant sa propre méthode de récupération, mais quand j'ai référencé la variable chien comme animal, cela ne fonctionnait pas, voici le code

La classe animale p >

tester.java:4: error: cannot find symbol
doggie.fetch();
      ^
symbol:   method fetch()
location: variable doggie of type animal
1 error

La classe de chien

public class tester{
public static void main(String args[]){
    animal doggie = new dog();
    doggie.fetch();
    doggie.eat();
    doggie.roam();
}

La classe de testeur

public class dog extends animal{
public void fetch(){
    System.out.println("Auoooooooo");
}
}

}

L'erreur

public class animal{
String family;
String name;
public void eat()
{
    System.out.println("Ghap Ghap");
}
public void roam()
{
    System.out.println("paw paw");
}
}


2 commentaires

Pouvez-vous ajouter le journal des erreurs complet pour qu'il soit plus facile à comprendre?


Veuillez démarrer vos classes Java avec des majuscules.


3 Réponses :


3
votes

Vous faites référence à doggie.fetch () mais ce n'est pas une méthode définie dans animal.

Puisque vous utilisez votre objet doggie comme animal, vous pouvez n'utilisez pas cette méthode.

Si vous souhaitez utiliser la méthode, vous pouvez faire quelque chose comme une vérification d'instance:

 if(doggie instanceOf dog){
    ((dog)doggie).fetch();
 }


0 commentaires

4
votes

Puisque la méthode fetch () n'existe pas dans animal, cela renvoie l'erreur. Vous pouvez définir une méthode d'extraction dans animal et la remplacer dans la classe dog.


3 commentaires

d'accord, mais si je conçois un jeu et qu'il contient un tas d'animaux, par exemple, si un particulier est quelque chose d'unique, comme aller chercher le chien bien que d'autres animaux n'aient pas cette méthode, je devrai quand même ajouter cette méthode dans la super classe, puis la surpasser. droite?


Animal ne doit contenir que des méthodes communes à tous les animaux, comme makeSound (), noOfLegs () etc. et chaque classe dérivée peut remplacer la méthode avec sa propre implémentation. Vous ne devriez pas ajouter de méthodes spécifiques à l'implémentation à la classe animale, juste pour appeler via une référence animale, c'est une mauvaise conception. Vous devez utiliser instanceOf pour appeler des méthodes spécifiques à l'implémentation.


ok Merci, j'y ai pensé moi-même parce que c'était une mauvaise conception, je vais sûrement regarder dans instanceOf, merci !!



7
votes

Lors de l'utilisation du polymorphisme, si vous créez une instance de la sous-classe et stockez sa référence dans une variable de type superclasse, vous ne pouvez appeler ces méthodes que sur l'instance nouvellement créée qui est présente dans la super classe .

Dans votre code, vous avez créé une instance de la classe dog et stocké sa référence dans doggie qui est de type animal (super classe de chien), dans ce cas, vous ne pouvez appeler aucune méthode sur l'instance de la classe dog qui n'est pas disponible dans la classe animal .

La méthode fetch n'est pas définie dans la classe animal donc vous obtenez l'erreur.

Solution strong >

Soit définir la méthode fetch dans la classe animal

OU

change p >

dog doggie = new dog();

à

animal doggie = new dog();


0 commentaires