-2
votes

Java Héritage - C -> B -> A. Méthode définie dans A et la nervure de la nervure dans C. Lequel devrait être appelé?

J'ai une base interface A forte>. Ensuite, il y a une autre interface B qui s'étend de cette interface A forte>. Et enfin une classe qui implémente b fort>.

B b = new C();
b.methodWhichCallsMethodOnInterface();


6 commentaires

Compte tenu de votre exemple, qu'est-ce que C a à voir avec elle?


ne peut pas reproduire . Veuillez fournir un exemple de reproductible minimal .


Le code que vous fournissez ne devrait rien faire du tout. Êtes-vous sûr de nous montrer le bon code? Vous ne pouvez pas directement instancier une instance de B, car B est une interface (qui est abstraite). Ainsi, au mieux, tout le code pourrait produire est une nullpointerexception, mais elle ne compile probablement pas.


@Davidschwartz B n'a pas de mise en œuvre pour la méthodeWHichCallsMethodoninterface. C'est la nervation de la norme en C qui est appelée quand je fais b.methodwhichcallsmethodoninterface ();


Votre code imprime simplement "méthodal1 Impression de la classe C" comme il devrait


Je ne comprends pas comment la méthode1 de C est appelée directement à partir de l'interface A? C'est à quel point fonctionne le travail. La mise en œuvre est sélectionnée en fonction du type d'exécution du B .


3 Réponses :


-4
votes

Il convient correctement à la méthode1 () d'A parce que c'est la méthode d'interface. C'est le comportement correct et attendu des méthodes définies dans l'interface.


0 commentaires

2
votes

appeler b.methodwhichcallsmethodoninterface () Appels Méthode2 () à partir de l'interface A et Méthode2 () de l'interface A appels Méthode2 ( ) de l'interface A, je suppose que vous pensiez que vous pensiez b.methodwhichcallsmethodoninterface () serait pour une raison quelconque faite Méthode2 () de l'interface a appelé méthode1 () de la classe C.

Si vous appelez b.method1 () vous devez obtenir l'impression à partir de la classe C Mais appeler l'autre fonction appellera l'interface A méthodal1 ()

Je suppose que vous avez prisisalisé b b = nouveau c () non?


0 commentaires

0
votes

Tout d'abord, interface B code> étendre interface A code> afin que vous puissiez imaginer que: xxx pré>

Vous pouvez oublier l'interface A code> à partir de maintenant! Continuez avec votre code. P>

class C implements B{
    @Override 
    public void method1() {
        System.out.println("method1 printing from class C");
    }

    @Override
    public void methodWhichCallsMethodOnInterface() {
        method2();
    }

    default void method2() { // inherited from B
        method1();
    }
}


0 commentaires