9 votes

Java : Appel du constructeur de la superclasse qui appelle la méthode surdéfinie qui définit un champ de la sous-classe.

J'ai ce code de démonstration :

class Test2 extends Test {
    public int number = 0;

    @Override
    public void set(){
        number = 1;
        info();
    }

    @Override
    public void info(){
        System.out.println(number);
    }
}

public class Test {
    public Test(){
        set();
    }

    public void set(){
    }

    public void info(){
    }

    public static void main(String[] args){
        Test2 object = new Test2();
        object.info();
    }
}

Le code donne ce résultat :

1
0

Pourquoi ? J'attends ce résultat :

1
1

A mon avis, la fonction principale appelle un constructeur de la classe Test2 pour créer un objet. Le constructeur appelle automatiquement le constructeur de la superclasse. Ce constructeur appelle la méthode set() qui est surchargée. Par conséquent, la méthode set() de la classe Test2 est appelée. Cette méthode définit le champ et appelle la méthode info() qui écrit le nombre. Ensuite, la fonction principale appelle à nouveau la méthode info() de l'objet créé.

Le champ numérique est correctement configuré puisque la première ligne contient "1". Mais pourquoi la deuxième ligne contient-elle 0 ? Il semble que le champ n'ait pas été défini du tout. Pouvez-vous l'expliquer ?

Que dois-je faire pour obtenir le comportement que j'attends ? Merci d'avance !

18voto

xehpuk Points 645
class Test2 {
    public int number = 0;
}

est équivalent à

class Test2 {
    public int number;

    public Test2() {
        super();
        number = 0;
    }
}

Ainsi, en invoquant le super constructeur, le champ number est fixé à 1. Après le retour du super constructeur, votre affectation de number à 0 est exécuté.

Il suffit de supprimer l'affectation et il devrait se comporter comme vous le souhaitez.

2voto

check Points 41

Si disons que Animal étend Dog et que vous appelez Animal a = nouveau chien()

La séquence des étapes est alors la suivante

  1. Les champs statiques de l'animal sont initialisés

  2. Le bloc statique de l'animal est exécuté

  3. Les champs statiques du chien sont initialisés. Ils seraient réinitialisés. si Animal les modifiait de quelque façon que ce soit>

  4. Le bloc statique du chien est exécuté

  5. Les champs non statiques des animaux sont initialisés. Ils seraient réinitialisés si l'animal les modifiait de quelque façon que ce soit.

  6. Le constructeur d'animaux est exécuté

  7. Champ non statique du chien initialisé < Ils seraient réinitialisés si Animal les changeait >

  8. Le constructeur du chien est exécuté

1voto

JamesB Points 3254

Votre code enfreint une règle d'or en Java - ne jamais appeler une méthode dans un constructeur qui peut être surchargée par une sous-classe - c'est-à-dire que de telles méthodes doivent être privées.

Au moment où le constructeur par défaut de Test2 se termine, il a écrasé la valeur initiale de 1 qui lui a été attribuée par l'initialisateur public int number = 0; .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X