0
votes

Comment faire du polymorphisme Java

éditer: devrait être A2 = nouveau B () em> strong> Je ne comprends pas pourquoi le résultat pour A2.FOO (B) est 3 dans la question de la pratique suivante.

Je pensais avec polymorphisme, la méthode des types dynamiques fonctionnerait avec la signature de méthode qui prend l'argument qui correspond à la statique taper. P>

public class A {
    public int foo(Object o) {
        System.out.println(1);
        return 1;
    }

    public int foo(A a) {
        System.out.println(2);
        return 2;
    }
}

public class B extends A {
    public int foo(A a) {
        System.out.println(3);
        return 3;
    }

    public int foo(B b) {
        System.out.println(4);
        return 4;
    }

public static void main(String[] args) {
        A a2 = new B();
        B b = new B();
        a2.foo(b);
    }
}



5 commentaires

En fait, cela reviendrait 2. Peut-être que vous aviez peut-être une erreur de copier la question et a2 = nouveau A (); devrait être A2 = nouveau B (); ?


Je viens d'exécuter votre code et réellement qui retourne 2 , pas 3 .


hey, désolé, A2 est en fait b ()


meta.stactverflow.com/questions/317294/...


Vous avez déjà reçu des réponses sur votre question en les manipulant que vous avez invalidé toutes les réponses existantes.


3 Réponses :


1
votes

Edit: Comme la question a été modifiée, la réponse est maintenant 3 comme a.foo (a) est appelé mais remplacé.


Si A2 était un B puis la méthode remplacée serait utilisée, jamais une méthode surchargée.

mais a2 est un a et quelle classe a une méthode foo (a) qui peut être appelé, donc il imprime 2

En bref, seul le type de ceci sur le côté gauche de . changera le choix de la méthode appelée.


3 commentaires

Vaut la peine de noter qu'il renvoie 2 , pas 3 .


@Amongalen a accepté, ça n'a pas été clair comme je l'ai écrit, merci.


Salut, désolé, A2 est en fait b ()



0
votes

A2 est évidemment a , donc a # fio est exécuté. Il est possible (compile et exécute) depuis B est une instance de A .

Etant donné que A # FOO est exécuté, la réponse est 2 (non 3 et pas 4 ). < / p>


1 commentaires

Vous devez peut-être mettre à jour cela comme la question a été modifiée. C'est faux car il se trouve.



1
votes

Il y a deux choses en cours ici:

  1. Surcharge
  2. remplacer

    surcharge est d'avoir deux méthodes différentes dans la même classe avec le même nom, mais des types d'arguments différents (ils sont donc différents). le remplacement et le polymorphisme consiste à avoir la même méthode unique dans deux classes différentes.

    classes a B surcharge la méthode FOO : ils ont deux méthodes avec le même nom. Dans a une méthode prend objet comme paramètre et on prend a comme paramètre. Dans B on prend A comme paramètre et on prend B . De ces quatre méthodes, deux sont les mêmes ( foo (a) ).

    Le foo (a) méthode dans B remplace le FOO (a) méthode dans A . La méthode foo (b) est une méthode différente.

    Alors, lorsque vous appelez a2.foo (b) Vous appelez la méthode foo (a) . Ça doit être, comme A2 est déclaré comme A et a n'a pas de a.foo (b) . Étant donné que a2 est un objet de type B , vous appelez b.foo (a) comme il remplace a.foo (A) .


0 commentaires