2017-07-10 3 views
-4

J'ai écrit ci-dessous un exemple de polymorphisme.Pourquoi une nouvelle méthode dans la sous-classe n'est pas accessible en utilisant la variable de référence de la superclasse

package tsys; 

public class DynamicPolymorphism { 
    public void eat(){ 
     System.out.println("DynamicPolymorphism"); 
    } 
} 
class AnotherClass extends DynamicPolymorphism{ 
    public void eat(){ 
     System.out.println("Another Class"); 
    } 
    public void consume(){ 
     System.out.println("consume"); 
    } 
} 
class TestPolymorphism{ 
    public static void main(String args[]){ 
     DynamicPolymorphism dp = new AnotherClass(); 
     dp.eat();//Works fine 
     dp.consume();//compile time error 
    } 
} 

Maintenant question est pourquoi le compilateur se plaint de dp.consume()? Cette question m'a été posée dans une interview J'ai expliqué la raison que "Au moment de la compilation le compilateur ne sait que sur Type de référence comme type de dp est DynamicPolymorphism donc le compilateur est incapable de trouver la méthode consume." Interviewer contrer ma réponse et demandé ce qui se passe dans les coulisses que le compilateur donne l'erreur mais nous référons à la variable dp à une instance de AnotherClass. Qu'est-ce que je peux d'autre expliquer à l'intervieweur par rapport à la question du contre-interrogatoire?

+1

Downvoters, pouvez-vous expliquer ce qui ne va pas avec question afin que je puisse améliorer? –

+1

J'aurais demandé des précisions, car je ne comprends pas la contre-question. Il n'y a pas de "coulisses". Le compilateur sait que 'dp' est un' DynamicPolymorphism', donc il n'autorise que les appels connus, c'est-à-dire les appels aux méthodes déclarées par 'DynamicPolymorphism'. Fondamentalement ce que vous avez dit. C'est la nature fondamentale d'un langage [statiquement-typé] (https://stackoverflow.com/q/1517582/5221149) comme Java. – Andreas

+0

@Andreas Votre réponse est apt, je suis juste à la recherche ici, Y at-il quelque chose que j'ai manqué en ce qui concerne le polymorphisme. Merci –

Répondre

-2

dp est déclaré DynamicPolymorphism. donc ne sait rien sur les méthodes de AnotherClass. Si vous voulez appeler consommer, vous devez typer et appeler consommer. try ((AnotherClass) dp) .cosume()

+0

L'OP est déjà au courant de cela. S'il vous plaît lire toute la question. –

+0

Selon le contrat de DynamicPolymorphism classe seulement manger est visible. Par conséquent, la conversion de type est obligatoire pour être visible lors de la compilation. – PrashanthBC