Sweat shirt Bleu Femme Col sweat Achat Vente marine REEBOK Rond HxZRH1

Sweat shirt Bleu Femme Col sweat Achat Vente marine REEBOK Rond HxZRH1 Sweat shirt Bleu Femme Col sweat Achat Vente marine REEBOK Rond HxZRH1

Nous avons vu que l’instanciation d’un objet recouvrait deux choses : la réservation d’un espace mémoire sur lequel la machine Java nous donne une référence, et l'initialisation de cet espace mémoire. Ensuite, la machine Java appelle les éléments d'initialisation qui ont été définis dans la classe, ou la hiérarchie de classes, tels que les blocs statiques et non statiques, l'initialisation des champs et les constructeurs.

Voyons en détails comment tous ces éléments sont appelés et dans quel ordre.

La première étape de l'instanciation d'un objet consiste à charger la classe à laquelle il appartient. Cette classe n'est chargée qu'une seule fois, et reste ensuite présente dans la machine Java. Certaines machines Java sont capables d'effacer des classes de leur mémoire, ce qui est possible en théorie, mais ce fonctionnement n'est pas la règle générale.

En général une classe n'est chargée que lorsqu'elle est référencée par un objet. On peut aussi déclencher explicitement le chargement d'une classe.

Lors du chargement d'une classe, la machine Java charge toutes les classes dont cette classe hérite, si elle ne l'ont pas déjà été.

L'ordre d'exécution des blocs statiques varie ensuite suivant que l'on utilise une machine Java version 4 ou version 5 et suivantes.

Pour les JVM version 4 et antérieures, les blocs statiques sont exécutés au chargement des classes. Donc, en partant de la classe Object, et en redescendant toute la hiérarchie jusqu'à la classe qu'elle charge, et pour toutes les classes nouvellement chargées :

  • la JVM exécute les initialiseurs des champs statiques ;

  • elle exécute ensuite les blocs statiques.

Pour les JVM version 5 et postérieures, ces deux opérations sont exécutées lors de la première instanciation d'un objet de la classe. Si un champ publique statique est référencé, alors il est initialisé, mais cela ne déclenche pas l'exécution des blocs statiques.

Ces deux opérations ne sont effectuées qu'une seule fois, puisqu'une classe n'est chargée qu'une seule fois.


En Java 4 et avant, le chargement de la classe Capitaine déclenche les opérations statiques dans l'ordre de leur numérotation. À partir de la version 5 de Java ces blocs sont exécutés lors de la première instanciation de la classe Capitaine.

Un constructeur d'une classe est une méthode particulière. Elle n'a pas de type de retour, et porte le même nom que la classe dans laquelle elle se trouve. Un constructeur peut jeter des exceptions.

Une classe peut avoir autant de constructeurs que l'on a le courage de lui en créer, dès l'instant qu'ils ont des signatures différentes, c'est-à-dire des paramètres différents. Il n'est toutefois pas conseillé de multiplier les constructeurs, ni de créer des constructeurs prenant des listes interminables de paramètres.

Une classe qui ne déclare aucun constructeur explicitement en possède en fait toujours un : le constructeur vide par défaut, qui ne prend aucun paramètre. Si l'on définit un constructeur explicite, alors ce constructeur vide par défaut n'existe plus ; on doit le déclarer explicitement si l'on veut encore l'utiliser. Écrire ce constructeur systématiquement est une bonne habitude de programmation : le bon fonctionnement de nombreux framework repose sur l'existence systématique de ce constructeur. Prenons l'exemple de la classe Marin ci-dessous.


La machine Java a créé un constructeur vide par défaut dans cette classe, on peut donc l'instancier de la façon suivante :

 Marin marin = new Marin() ;

Si l'on spécifie un constructeur dans cette classe, alors le constructeur vide par défaut n'est plus créé. Si l'on reprend notre exemple :


On ne peut plus instancier cette classe comme précédemment. On ne peut l'instancier que de la façon suivante :

 Marin marin = new Marin("Surcouf") ;

Considérons l'exemple suivant.


Sur ce code, instancions un objet de type Capitaine :

 Capitaine capitaine = new Capitaine("Capitaine de vaisseau") ;

L'instanciation de l'objet capitaine déclenche les opérations suivantes :

  • le constructeur de la classe Capitaine est appelé ;

  • ce constructeur appelle tout d'abord implicitement le constructeur vide de la classe Marin, qui initialise le champ nom ;

  • le constructeur de Capitaine initialise le champ grade.

Lors qu'un objet instance d'une classe qui en étend une autre est construit, au moins un constructeur de cette super classe doit être appelé. Si aucun appel explicite n'est écrit, alors la JVM exécute le constructeur vide par défaut. S'il n'existe pas, elle génère une erreur à la compilation. Dans notre exemple, remplacer le constructeur vide par un constructeur prenant en paramètre le nom du marin (par exemple), génèrera une erreur de compilation, puisque son existence supprime celle du constructeur vide par défaut. Il faudra donc conserver un constructeur vide, ou appeler explicitement ce nouveau constructeur de la classe Capitaine.

Il est également possible pour un constructeur d'appeler explicitement un unique constructeur. Cet appel ne peut être que la première instruction de ce constructeur. Voyons cela sur un exemple.


Rappelons que l'appel d'un autre constructeur, qu'il soit dans la même classe ou dans la super classe doit toujours être la première instruction d'un constructeur. On peut bien sûr ajouter autant d'instructions que l'on souhaite une fois cet appel effectué.

Voyons à présent l'ensemble des opérations effectuées lors de la création d'un objet. Les différentes étapes se déroulent dans cet ordre :

  • la machine Java réserve de la mémoire pour stocker l'objet à créer ;

  • cette mémoire est effacée de toute ce qu'elle pouvait contenir auparavant : les champs sont mis à 0, false ou null suivant leur type ;

  • marine Sweat sweat shirt Vente Achat Rond REEBOK Femme Bleu Col le constructeur invoqué est appelé ;

  • si ce constructeur appelle un autre constructeur de la même classe, alors il est appelé ;

  • si ce constructeur appelle un autre constructeur d'une super classe, alors il est appelé ;

  • une fois que la chaîne d'appel des constructeurs a été épuisée, alors les initialiseurs de champs sont appelés ;

  • les blocs non statiques sont exécutés ;

  • le constructeur de la super classe dans laquelle on se trouve est exécuté ;

  • on passe à la sous-classe suivante, en répétant les mêmes opérations dans le même ordre, jusqu'à la classe dont on construit finalement une instance.

Voyons ceci sur un exemple.


Créons un objet Capitaine avec l'instruction suivante :

 Capitaine m = new Capitaine("Surcouf", 2) ;

Les opérations s'enchaînent de la façon suivante :

  • appel du constructeur Vente Achat Sweat sweat marine Bleu Rond REEBOK Col shirt Femme (String, int) de Capitaine ;

  • appel du constructeur (String) de Capitaine ;

  • appel du constructeur (String) de Marin ;

  • initialisation de la variable dateCreation de Marin ;

  • exécution du bloc non statique de Marin ;

  • exécution du constructeur (String) de Marin ;

  • initialisation de la variable dateCreation de Capitaine ;

  • exécution du bloc non statique de Capitaine ;

  • exécution du constructeur (String) de Capitaine ;

  • exécution du constructeur (String, int) de Capitaine.

Donc, lorsque l'exécution d'un constructeur s'achève, l'objet, ou le morceau d'objet dans lequel on se trouve est entièrement initialisé. Nous verrons que cela a un impact sur la définition des champs final.

Nous avons déjà utilisé ce mot-clé dans quelques exemples, sans définir précisément à quoi il correspond, il est donc temps de le faire.

Ce mot-clé peut être utilisé comme modificateur de plusieurs choses.

Tout d'abord, il peut être utilisé sur une classe. Si une classe est déclarée final, alors il n'est pas possible de l'étendre. De nombreuses classes sont final dans l'API standard : c'est le cas de String, et de toutes les classes enveloppes des classes de base.

Il peut être utilisé de façon analogue sur une méthode. Une méthode déclarée final ne peut pas être surchargée par une méthode d'une classe qui étendrait la classe dans laquelle cette méthode est définie. Par exemple, les méthodes wait() de la classe Object sont finales, elles ne peuvent donc pas être surchargées.

Il peut être utilisé sur le champ d'une classe, statique ou non. Dans ce cas, une fois intialisé, ce champ ne pourra plus être modifié. Se pose alors la question, à quel moment peut-on, et doit-ont initialiser un champ final ?

Un champ static final, doit être initialisé par un initialiseur de champ ou un bloc statique.

Un champ final (non statique) doit être initialisé par un initialiseur de champ, un bloc non statique, ou dans le constructeur.

Un champ final, statique ou non, ne peut pas être initialisé deux fois, une fois initialisé, il n'est plus possible de changer sa valeur.

Si un objet possède plusieurs constructeurs, et qu'il possède un champ Sweat shirt Vente REEBOK marine Rond Femme Col Bleu Achat sweat final, alors l'initialisation de ce champ doit suivre le même processus, quel que soit le constructeur appelé. En particulier, si ce champ est initialisé dans un constructeur, alors tous les constructeurs doivent l'initialiser, y compris le constructeur par défaut.

Le mot-clé final peut être posé sur un paramètre reçu par une méthode. Dans ce cas, ce paramètre ne pourra être modifié.

Enfin, le mot-clé final peut être posé sur une variable définie dans une méthode. Dans ce cas, la valeur de cette variable ne pourra être modifiée.

Notons qu'une classe locale, anonyme ou non, peut accéder aux variables et paramètres définis dans la méthode dans laquelle elle-même a été définie, que si ceux-ci sont Achat marine sweat Sweat Col shirt Vente REEBOK Femme Rond Bleu final.

Les règles d'utilisation des champs final sont complexes et subtiles. Heureusement les environnements de développement intégré sont là pour nous aider. Ils nous marquent les erreurs d'accès ou d'initialisation, et nous rappellent les règles à appliquer pour corriger nos erreurs.

Java langage & API
Retour au blog Java le soir
Cours & Tutoriaux

José Paumard © 2016, tous droits réservés

Table des matières

+ Introduction : un peu d'histoire
+ Programmer en Java
+ Classes Object et String
+ Structure d'une classe
1. Introduction
+ 2. Classes
+ 3. Éléments statiques
+Bleu Homme Hilfiger tommy soldes ARTHUR Chemises hilfiger polo Tommy wIIqZO1 4. Membres d'une classe, visibilité
+ 5. Constructeur, instanciation
5.1. Chargement d'une classe
5.2. Constructeurs d'une classe
5.3. Instanciation d'un objet
5.4. Destruction d'objets
5.5. Le mot-clé final
+ 6. Énumérations
+ Noms, opérateurs, tableaux
+ Nombres, précision, calculs
+ Héritage, abstraction, interfaces
+ Pigsou à pulls des Noël 10 Mag Top offrir Le geek pour tTXzx4nwq
+ Exceptions
+ Entrées / sorties