Compréhension des Méthodes défaut dans une interface [Résolu]

Signaler
-
 Babo -
Bonjour,

J'étudie actuellement la programmation Java et je me trouve confronté à un problème.
Je ne comprends pas les Méthodes défaut dans une interface.
J'ai le code suivant:
public interface Mitose extends Reproduction {

    public static void description(){
        Reproduction.description();
        System.out.println("Redéfinie dans Mitose.java");
    }

    default void reproduire(){
        System.out.println("Je me divise !");
    }
}
public interface Pondre extends Reproduction {

    public static void description(){
        Reproduction.description();
        System.out.println("Redéfinie dans Pondre.java");
    }

    default void reproduire(){
        System.out.println("Je ponds des oeufs !");
    }
}
public class Alien implements Pondre, Mitose {

    public void reproduire(){
        System.out.println("Je suis un alien et :");
        Pondre.super.reproduire();
        Mitose.super.reproduire();
    }
}

Mais a la place d'avoir le résultat attendu à savoir:
Je suis un alien et :
Je ponds des oeufs !
Je me divise

Je me retrouve avec le résultat suivant:
Méthode statique dans une interface
Méthode statique dans une interface
Redéfinie dans Pondre.java
Méthode statique dans une interface
Redéfinie dans Mitose.java

J'ai la dernière version d'Eclipse et les dernières versions de Java.
J'espère que vous pourrez m'aider.

Merci par avance pour votre aide.

3 réponses

Messages postés
16073
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 octobre 2020
2 703
Bonjour,

Pour pouvoir t'aider convenablement il faudrait que l'on ait le code complet.
Or ici il nous manque l'interface Reproduction (dont hérite Mitose et Pondre) et surtout la classe principale avec la méthode main pour savoir quel code tu exécutes.

Le code que tu dis attendre correspond aux méthodes "reproduire" et celles que tu dis avoir correspond aux méthodes "description" qui ne sont a priori pas appelées l'une par l'autre.

Pour bien comprendre les méthodes par défaut il faudrait peut-être un autre exemple :
public interface List {
    int size();

    default boolean isEmpty(){
        return size() == 0;
    }
}

Lors de l'implémentation de l'interface, seule la méthode size() devra être redéfinie, la méthode isEmpty() pouvant - par défaut - être calculée à partir de la méthode size().
Toutefois, les classes d'implémentations peuvent - si besoin - redéfinir la méthode isEmpty() quand même, mais ce n'est pas obligatoire sauf si on a une hiérarchie d'héritage en diamant (comme avec ta classe Alien qui implémente à la fois Mitose et Pondre, héritant toutes les deux de la même interface), dans ce cas il est obligatoire de redéfinir la méthode par défaut pour ne pas avoir plusieurs implémentations différentes de la même méthode.
Bonjour KX,

Merci pour ton aide,
Oui, désolé j'ai oublié de rajouter ces deux classes.
Dans la classe Reproduction j'ai:

public interface Reproduction {
public static void description(){
System.out.println("Méthode statique dans une interface");
}

}


Et dans ma classe main j'ai cela:

public class Main {

public static void main(String[] args) {

Reproduction.description();
Pondre.description();
Mitose.description();

}

}


Dans le cours que je suis, ils disent (si je comprends bien leurs observations) que dans la classe Alien on fait appel au deux interfaces filles (Pondre et Mitose) et que le résultat devrait ce qui est codé dans la partie reproduction de la classe Alien à savoir:

	System.out.println("Je suis un alien et :");
Pondre.super.reproduire();
Mitose.super.reproduire();


et ainsi reprendre la partie default des interfaces Pondre et Mitose.

Merci pour votre aide.
Messages postés
16073
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 octobre 2020
2 703
La méthode main que tu as recopiée appelle uniquement les méthodes description() de Reproduction, Pondre et Mitose, mais jamais aucune méthode reproduire() n'est appelée, ce qui serait de toute façon impossible sans créer au préalable un objet Alien.

Essayes ce code :
public class Main {
    public static void main(String[] args) {
        Alien alien = new Alien();
        alien.reproduire();
    }
}
Ok, parfait, merci pour votre aide.
Bon weekend.