9
votes

Java: Constructeur de la superclasse appelante qui appelle une méthode remplacée qui définit un champ de sous-classe

J'ai ce code de démo: xxx

Le code donne cette sortie: xxx

pourquoi? Je m'attends à ce que cette sortie: xxx

dans mon opionion, la fonction principale appelle un constructeur de classe Test2 pour créer un objet. Le constructeur appelle automatiquement le constructeur de superclasse. Ce constructeur appelle la méthode définie () qui est remplacée. Par conséquent, le jeu de méthodes () de la classe Test2 est appelé. Cette méthode définit la méthode Info () d'appels () qui écrit le numéro. Ensuite, la fonction principale appelle à nouveau la méthode Info () de l'objet créé.

Le champ Numéro est correctement défini comme la sortie de première ligne est "1". Mais pourquoi la deuxième ligne contient 0? Il semble que le champ n'était pas du tout défini. Pouvez-vous l'expliquer?

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


2 commentaires

Connexes: Stackoverflow.com/a/5692162/697449


On dirait que les initialiseurs de champ sont exécutés après le constructeur en Java, la valeur est donc réinitialisée à 0 par l'initialisateur après la méthode SET définit-le sur 1. Vous devez éviter d'appeler des méthodes virtuelles dans des constructeurs puisque vous invoquez comportement dans un objet partiellement construit.


3 Réponses :


18
votes
class Test2 {
    public int number;

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

1 commentaires

Eh bien, j'ai déjà eu une idée de l'évolution du problème - d'abord instancier, puis d'initialiser. Mais c'est très utile.



1
votes

Votre code enfreint une règle d'or en Java - ne jamais appeler une méthode dans un constructeur pouvant être remplacé par une sous-classe - c'est-à-dire que ces méthodes devraient être privées.

Au moment où le constructeur par défaut dans TEST2 est terminé, il a écrasé la valeur initiale de 1 l'affectée via l'initialisateur Numéro INT du public = 0; . .


0 commentaires

2
votes

Si dire animal étend votre chien et vous appelez Animal a = nouveau chien ()

alors séquence d'étapes serait comme ci-dessous

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

  2. bloc statique d'animal est exécuté

  3. Les champs statiques de chien sont initialisés

  4. bloc statique de chien est exécuté

  5. champ d'animal non statique est initialisé, ils seraient réinitialisé si animal les a changé de toute façon>

  6. constructeur animal est exécuté

  7. champ de chien non statique initialisé

  8. constructeur de chien est exécuté


0 commentaires