static
dans sa déclaration. Un tel bloc est utilisé pour initialiser les objets instances de cette classe. L'utilisation de ce genre de bloc peut être pratique, mais pose des problèmes lorsqu'il s'agit de tester unitairement des classes, comme nous le verrons.
private
,
protected
ou
public
. Les règles d'accès sont les suivantes.
Les membres
private
ne sont pas accessibles de l'extérieur d'une classe. On ne peut donc ni les lire, ni les modifier.
Les membres
public
sont accessibles de toute classe. Ils sont donc lisibles et modifiables de tout objet.
L'accès aux membres
protected
est un peu plus subtil. Ces membres ne sont accessibles que des instances de classes :
protected
;
protected
.
Marin
.
Exemple 28. Classe
Marin
pour les exemples de visibilité
public class Marin { protected String nom ; protected String getNom() { return this.nom ; } }
Marin
ont accès aux deux membres
protected
de
Marin
:
nom
et
getNom()
. Les instances des classes qui étendent
Marin
ont également accès à ces membres.
Si un membre est déclaré sans modificateur de visibilité, alors on dit qu'il est "
package protected
". C'est-à-dire qu'il est accessible de toute classe du même package, en plus des classes qui étendent celle dans laquelle il est déclaré.
Si l'on souhaite respecter les principes d'encapsulation enseignés par la programmation orienté objet, on évitera absolument de déclarer des champs autre que
private
, et on gardera à l'esprit qu'il n'y a pas beaucoup de différence entre
public
et
protected
. Il est effectivement très facile d'accéder à un champ
protected
d'une classe.
[visibilité] [static] typeDeChamp nomDuChamp [ = initialisation] ;La visibilité du champ peut être omise (ce qui n'est pas conseillé), elle peut prendre les valeurs
private
,
protected
ou
public
.
Le mot-clé
static
indique que le champ est statique. S'il est omis, le champ est non statique.
Le type du champ peut être un type de base, ou tout nom de classe.
Suit le nom du champ, et une éventuelle initialisation. Nous verrons dans la suite à quel moment exact cette initialisation est exécutée.
static
;
throws
.
private
,
protected
, ou
public
.
Une méthode est déclarée de la façon suivante.
[visibilité] [static] [signature] [throws exception] { … }Si l'on omet le modificateur de visibilité pour une méthode (ce qui n'est pas conseillé), alors elle est package protected . De même que pour un champ, une méthode peut être déclarée
static
. On parle alors de méthode de classe. Elle est dans ce cas stockée dans un espace mémoire commun à tous les objets instances de cette classe.
Une méthode statique ne peut accéder elle-même aux champs et méthodes non statiques de cette classe. Elle peut bien sûr recevoir en argument des champs non statiques et les traiter.
Une méthode peut rencontrer une erreur lors de son exécution, par exemple une division par zéro ou une erreur d’ouverture de fichier. La dernière déclaration permet de préciser le comportement face à cette erreur. Nous verrons cela en détails plus loin.
Une méthode pour laquelle on déclare un type de retour doit obligatoirement retourner une valeur. Le compilateur génèrera une erreur s'il se rend compte qu'il existe un chemin de sortie pour cette méthode, qui ne comporte pas de
return
.
Ainsi, la méthode suivante ne compile pas.
Exemple 29. Erreur de compilation due à une valeur de retour non toujours définie
public boolean testParite(int i) { // erreur de compilation : la méthode // ne retourne pas toujours une valeur if (i % 2 == 0) return true ; }
Exemple 30. Types de retour correctement définis
public boolean testParite1(int i) { if (i % 2 == 0) return true ; else return false ; } public boolean testParite2(int i) { if (i % 2 == 0) return true ; return false ; }
private
. Afin de pouvoir lire ces champs, et éventuellement d'en modifier la valeur, on ajoute à la classe un getter et un setter pour chacun de ses champs
private
.
Le nom de ces deux méthodes est fixé par une convention universellement suivie, et sur laquelle de nombreux frameworks s'appuient. Il convient donc de la respecter !
Un getter commence par
get
, suivi d'un nom, qui est en général le nom du champ, commençant par une majuscule. Il retourne une valeur en général du même type que le champ associé.
Le setter associé commence par
set
, suivi du même nom que le
get
. Il prend en paramètre un unique argument, du même type que le type de retour du getter associé.
La présence d'un getter définit dans une classe une propriété. Si aucun setter associé n'est présent, alors cette propriété est en lecture seule.
Voyons ceci sur un exemple.
Exemple 31. Getters et setters de la classe
Marin
public class Marin { private String nomDuMarin ; private String prenomDuMarin ; public Marin(String nom) { nomDuMarin = nom ; } public String getNom() { return nomDuMarin ; } public String getPrenom() { return prenomDuMarin ; } public void setPrenom(String prenom) { this.prenomDuMarin = prenom ; } }
Marin
comporte deux propriétés :
nom
, qui est en lecture seule. Le nom d'un marin est fixé lors de sa construction, et ne peut plus être modifié ;
prenom
, que l'on peut lire et modifier.
String
StringBuffer
et
StringBuilder