déclaration et l'initialisation de Java: OO séquence d'exécution du programme de numérisation



Présentation de l'implémentation Java de la déclaration et la séquence d'initialisation, voyons d'abord à deux classes: la base et classe dérivée. Notez que l'une des variables membres whenAmISet et prétraiter les méthodes ()

public class Base (Base () (prétraiter ();) prétraiter void () ())

public class dérivée étend Base (public whenAmISet String = "ensemble lorsqu'ils sont déclarés"; @ Override prétraiter void () (whenAmISet = "mis en ()";)) prétraiter

Si nous construisons une instance sous-classe, puis, whenAmISet la valeur de ce que c'est?

public class Main (public static void main (String [] args) (dérivée d = new dérivée (); System.out.println (d.whenAmISet);))

Reporté à la suivante pour lire avant de vous donner le temps de réfléchir à la sortie de ce qui précède est ce que ce programme? Oui, il ressemble tout à fait simple, ne même pas besoin de compiler et exécuter le code ci-dessus, nous devrions savoir La réponse, alors, pensez-vous que vous connaissez la réponse? vous sûr que votre réponse est correcte?

Beaucoup de gens vont trouver cette partie de la production du programme doivent être "mis en prétraiter ()", c'est parce que lorsque la classe dérivée enfant constructeur est appelé, il sera implicitement appeler la classe de base constructeur de base (via super () fonction), puis le constructeur de la classe de base est appelée prétraiter Base () la fonction, parce que cette classe est une instance de dérivés, et dans la sous-classe dérivée de cette fonction utilise le mot clé override, donc, en fait, à composer est le: Derived.preProcess (), mais cette méthode définit la variable membre valeur whenAmISet: "mettre en prétraiter ()".

Bien entendu, la conclusion ci-dessus est fausse. Si vous compilez et exécutez ce programme, vous trouverez que le processus de production réelle est "mis à leur déclaration". Comment est-ce? Est la base de classe de base de prétraiter () est appelée aujourd'hui? Non! Vous pouvez sortir quelque chose dans la classe de base prétraiter à voir, vous trouverez le programme s'exécute, Base.preProcess () n'est pas appelés à (sinon ce pour toutes les applications Java sera un bug très désastreuse).

Bien que la conclusion ci-dessus est faux, mais le processus de dérivation est raisonnable, mais incomplet, le texte suivant est la course ensemble du processus:

◆ dans le constructeur dérivés.

◆ variable membres issus de la mémoire est allouée.

◆ Base constructeur est appelé implicitement.

◆ Base de prétraiter appeler le constructeur ().

prétraiter ◆ dérivée la valeur de consigne whenAmISet "mis en prétraiter ()".

◆ dérivés initialisation de variable membre est appelée.

◆ exécutif corps du constructeur dérivés.

Attends, comment pourrait-il? Dans l'étape 6, dérivée des membres de l'initialisation effectivement en prétraiter () après un appel? Oui, précisément afin que nous ne pouvons pas laisser les membres de la déclaration de variable et l'initialisation dans une opération atomique Bien que Java, on peut l'écrire ainsi, permettez-déclaration et l'initialisation regarde comme tel. Mais ce n'est qu'une illusion, nos erreurs dans nos états et l'initialisation de l'air de Java en un seul. Dans le monde du C + +, C + + ne prend pas en charge la variable membre est initialisée lorsque la déclaration, qui vous oblige explicitement dans l'initialisation de variables constructeur de ses membres, semblait le sol, mais en fait, C + + bon cœur amer.

Dans le monde orienté objet, parce que le programme pour former des objets, conduisant à la mise en œuvre de notre programme de l'ordre de la fumée et des miroirs. Par conséquent, le monde orienté objet, l'exécution du programme de l'ordre est très important.

Voici les différentes étapes ci-dessus, un par un à expliquer.

◆ dans le constructeur.

◆ allouer de la mémoire pour la variable membre.

◆ à moins que vous appeler explicitement super (), ou une classe Java dans le constructeur de sous-top se faufiler dans super ().

◆ appeler le constructeur de la classe parent.

◆ prétraiter appel, car la surcharge de classe couette, alors appelez la sous-catégorie.

◆ Ainsi, l'initialisation se produit dans les prétraiter () après. C'est parce que, Java doit veiller à ce que l'initialisation des membres du groupe parent dès l'initialisation sous-classe, sinon l'enfant à utiliser la classe parente, variable membre de classe sera un problème.

◆ mise en œuvre formelle du constructeur sous-classe (ce qui constitue évidemment une fonction vide, effectivement nous n'avons pas une déclaration).

Vous pouvez consulter le cahier des charges "langage Java" dans la section correspondante pour en savoir plus sur les détails de Java pour créer l'objet.

Enfin, la nécessité de recommander un livre, Joshua Bloch et Neal Gafter écrire Puzzlers Java: Les pièges, les pièges et les affaires Corner, la version chinoise de "JAVA FAQ."