Les modificateurs

Les modificateurs d'accès

Un modificateur indique si les autres classes de l'application pourront accéder ou non à la classe / méthode / membre (appelé par la suite « item »). Il  permet de contrôler la visibilité des différents items et d'empêcher que des actions illégales soient effectuées sur les items.

- public : toutes les classes peuvent accéder à l'item
- protected : seules les classes dérivées et les classes du même package peuvent accéder à l'item
- private : l'item est seulement accessible depuis l'intérieur de la classe où il est défini.
- (par défaut) : sans modificateur d'accès, seules les classes du même package peuvent accéder à l'item.

Static

Placé devant une méthode ou une variable, ce modificateur indique que celle-ci appartient à la classe, et qu'elle est partagée par toutes les instances. 

Donc il n'est pas nécessaire d'instancier une méthode pour l'appeler ( Class.methode() ). Pour une variable, on dit que c'est un attribut de classe, et que sa valeur est partagée entre les différentes instances de sa classe.

Un bloc peut être défini static, auquel cas ce bloc va s’exécuter au chargement de la classe par le classloader (donc une seule fois). Il est aussi appelé bloc d'initialisation statique, et est constitué d'un bloc d'instructions entre accolades précédé du mot-clé static.

Dans une méthode statique, on ne peut pas faire référence à une méthode d'instance sans créer d'objet, car les méthodes statiques ne s'exécutent pas dans le contexte d'un objet. Pour les méthodes statiques, il n'existe pas de référence this.

Les champs statiques existent dès le chargement de la classe, et sont accessibles même si l'on n'a pas créé d'objets. Ils sont dans une zone mémoire liée à la classe et commune à toutes les instances de cette classe.

Note 1Une interface ne peut pas contenir de méthodes static.

Final

- Placé devant un attribut ou une variable locale, il est immuable, dès lors qu'il est initialisé.
- Placé devant une méthode, il indique que celle-ci ne peut pas être modifiée dans une classe dérivée

- Une méthodes static est propre à la classe, donc ne peut pas être modifier par une instance. 
- Une méthodes private ne peut pas être redéfinie, donc modifiée. 
- Une méthode static et private  est implicitement final.
En déclarant méthode finale, on optimise le code, puisqu'on ne peut plus modifier cette méthode.
- Les méthodes déclarées avec l'un des modificateurs static, private ou final ne peuvent pas être abstraites, étant donné qu'elles ne peuvent pas être redéfinies dans une sous-classe.
- Une classe déclarée final ne peut pas être abstract, En effet, une classe final elle ne peut pas être sous-classée. Elle ne peut donc pas  contenir de méthodes abstraites qui devraient normalement être implémentées dans une sous-classe.

Synchronized

Une méthode synchronized ne peut être exécutée que par un thread à la fois.
Le verrou ne s'active que pour l'objet sur lequel la méthode a été appelée
Une même méthode synchronized peut être exécutée en même temps par deux threads différents sur deux objets différents.

Transient

Un attribut transient n'est pas sérialisé. Ce qui implique que quand cet objet sera désarialisé, l'attribut noté transient ne sera pas initialisé. Sa valeur pourra être calculée, par exemple.

Native

Ce modificateur permet d'indiquer que cet item est défini dans une bibliothèque externe écrite dans un autre langage de programmation, utilisant l'API JNI.

Strictfp 

Ce mot-clé (strict floating point) permet de garantir les mêmes calculs quelle que soit la machine virtuelle sur laquelle l'opération est effectuée. Il agit sur les opérations en virgule flottante. C'est à dire sur les types primitifs double et float.

Volatile

Pour une variable, le modificateur volatile force la JVM, avant et après chaque utilisation de la variable, à la rafraîchir à partir de la mémoire principale au lieu d'utiliser un cache local. Cela permet de synchroniser la valeur de la variable entre plusieurs threads.