Enfin nous allons faire ce point tant attendu sur les niveaux d’accès en Java. Youpi !!!
Nous en profitons aussi pour faire un point syntaxe java.
La première partie de ce tutoriel vient en complément du tutoriel précédent sur la POO java. Dans le tutoriel précédent,vous avez pu voir comment déclarer des classes. Dans ce tutoriel, vous allez voir comment déclarer des attributs et des méthodes dans une classe et comment définir leurs niveaux de droit d’accès. En gros, comment écrire le corps d’une classe. Nous serons obligés pour être complet de présenter les règles d’écriture des “identifiers”. Ces mots qui vont vous permettre de nommer vos classes et vos variables. Nous ferons un tour des types primitifs en java, ça peut toujours servir. Puis pour être complet sur la syntaxe java, nous ferons un point sur les conditionnelles (if, while, for, …).
Corps de classe Java
Attributs
Les attributs, ou variables de classes, définissent un ensemble d’indicateurs de l’état des objets.
La classe définit les attributs et leurs types.
Un objet (instance de classe) a effectivement une liste d’attributs associés, ce sont des instances des attributs déclarés dans la classe. L’ensemble de ces valeurs définit l’état de l’objet, on les appelle d’ailleurs aussi variables d’état.
Les attributs sont typés. Ils peuvent être de type primitif ou être des objets.
La syntaxe pour déclarer un attribut est : le modifier de droit d’accés, le type de l’attribut, le nom de l’attribut. [modifier] [type] [nom de l'attribut] ;
exemple :
Eventuellement, vous pouvez aussi associer une valeur à l’attribut. Ce sera la valeur de l’attribut lors de l’instanciation d’un objet de la classe (sauf si vous modifiez cette valeur dans le constructeur) :
exemple :
Les modifiers d’accés permettent d’associer un droit d’accés à un attribut. Nous détaillerons les différents modifiers et leurs effets un peu plus loin dans ce tutoriel.
Méthodes
Les méthodes sont déclarées dans les classes, elles définissent le comportement des objets.
Elles peuvent être appelées par un objet, la syntaxe d’appel étant : monObjet.maMethode(param1, param2, …);
Lors de l’appel d’une méthode, celle-ci renvoie “quelque chose”. Cette “chose” peut être un objet, une valeur ou rien. Il faut donc préciser le type de ce qui est renvoyé par une méthode. Si la méthode ne renvoie rien, on utilise le mot clef void.
La syntaxe de déclaration d’une méthode est : le modifier de droit d’accés, le type de retour de la méthode, le nom de la méthode, les paramètres entre parenthéses, le corps de la méthode entre accolades.
[modifier] [nom méthode] ( [type][param1] , [type][param2] , [type][param3], …, [type][param n]) { [corps de méthode] }
Pour dire dans le corps de la méthode de renvoyer quelque chose, on emploie le mot clef return.
exemple :
public void setId( int nouvel_id ) { id = nouvel_id ; }
Pour préciser que l’on fait référence à l’id de notre objet, j’aurai pu écrire this.id au lieu de id. Mais dans ce cas, il n’y a pas de confusion possible, donc this n’est pas nécessaire.
exemple :
public void setId( int nouvel_id ) { this.id = nouvel_id ; }
Surcharge et re-définition de méthodes
L’opération de surcharge consiste à définir plusieurs méthodes ayant le même nom dans une même classe. Ces méthodes peuvent avoir des types de retour identiques ou différents. Par contre, il est obligatoire que le nombre ou le type des paramètres change.
L’opération de re-définition de méthodes concerne l’héritage et consiste à redéfinir dans une classe fille une méthode déjà définie dans une classe mère.
Droits d’accès
Nous allons maintenant présenter les différents modifiers et les droits d’accés qu’ils permettent de définir. Nous ne traitons ici que des modifiers d’accés.
Les modifiers d’accés sont :
- default
- public
- private
- protected
Nous avons déjà vu dans les tutoriels précédents l’utilisation de default et public dans le cas de déclaration de classes. Encore une fois, default et public sont les seuls modifiers d’accés possibles sur des classes.
Effet des modifiers d’accés sur des classes
- default : c’est le niveau d’accés par défaut. Ne pas utiliser de modifier d’accés ou utiliser le modifier default revient au même. Une classe d’accés par défaut n’est visible que par les autres classes de son package.
- public : Une classe d’accés public est visible par toutes les autres classes.
Effet des modifiers sur les membres (attributs et méthodes) d’une classe
- default : est le niveau d’accés par défaut. Ne pas utiliser de modifier ou utiliser le modifier default revient au même. Un membre déclaré de niveau d’accés par défaut est visible dans la classe et dans toute classe du même package.
- public : Tout membre déclaré public appartenant à une classe A, est visible par toute classe qui a accés à la classe A.
- private : Tout membre déclaré private n’est visible que dans la classe ou il est déclaré. Soulignons que ceci est vrai même par héritage. Soit une classe A dont un membre est private. Une classe B hérite de A. La classe B n’hérite pas des membres private. Redéclarer dans la classe B un membre qui est présent et private dans A n’est ni une surcharge ni une re-définition.
- protected : Un membre déclaré protected est visible dans la classe, dans toute classe du même package et par héritage dans toute classe fille. Soit une classe A dont un membre est protected. La classe B hérite de A. La classe B hérite le membre protected de A.
Autres Modifier
Nous allons traiter ici de quelques autres modifiers bien utiles: final, abstract et static.
Il faut retenir qu’il est possible d’associer plusieurs modifiers à une déclaration (que ce soit une classe ou un membre). Bien sûr, on ne peut utiliser qu’un seul modifier d’accés. Mais on peut faire des combinaisons avec les autres modifiers.
On peut par exemple déclarer un membre static et final et public.
- final : Une classe marquée final ne pourra pas être héritée (pas de classes filles possible). Une méthode marquée final ne peut pas être redéfinie dans une classe fille. Une variable marquée finale ne pourra pas avoir une nouvelle valeur assignée. Marquer un attribut comme étant final revient à définir une constante. Marquer un paramètre final dans une déclaration de méthode revient à garantir que la méthode ne pourra pas modifier la valeur de ce paramétre.
- abstract : Abstract ne s’utilise que sur les classes et les méthodes. Une classe marquée abstract est dite abstraite, elle ne peut pas être instanciée (on ne peut pas faire d’objet par appel à new de cette classe). Une méthode abstraite n’a pas de corps (pas de définition) et une classe ayant une méthode abstraite doit nécessairement être abstraite. Les classes et les méthodes abstraites sont utiles dans un contexte d’héritage. Elles permettent de déclarer des classes d’un niveau d’abstraction élevé. Une classe héritant d’une classe abstraite doit implémenter toutes les méthodes abstraites héritées, à moins d’être elle-même abstraite.
- static : Une méthode ou un attribut marqué static existe indépendamment de toute instance de classe. On dit souvent que toutes les instances d’une classe partagent les mêmes membres static. En fait, c’est pire que ça. Un membre static est unique quelquesoit le nombre d’instances de la classe et il existe même si il n’y a aucune instance de cette classe.
Identifiers
Nous allons ici présenter les éléments de syntaxe essentiels pour les identifiers. Les identifiers étant les noms de variables (variables de classe, paramétres, variables locales), les noms de méthodes, les noms de classe.
Nous nous en tenons ici à ce qu’il est possible ou impossible de faire. Mais il existe beaucoup de bonnes pratiques ou conventions de codage que nous vous invitons à connaître et adopter : les javabeans (nous leur consacrerons un tutoriel) et la convention de codage recommandée par sun.
Il existe un plugin eclipse, check style qui vous permet de définir une convention de codage et de faire contrôler par eclipse que vous la respectez bien.
Il existe un ensemble de règles de bases (dites légales) à connaître concernant le nommage de classes, variables et méthodes.
Règles générales sur les identifiers :
- il est interdit de réutiliser un mot-clef java pour nommer une classe, une variable ou une méthode (vous ne pourrez pas appeler une variable void par exemple, ou public).
- les identifiers ne doivent être composés que de caractères unicodes, de nombres, de symboles monétaires, et de caractères de liens (”_” par exemple mais pas “-”).
- les identifiers doivent commencer par une lettre, un symbole monétaire ou un caractère de lien.
- les identifiers ne doivent pas commencer par un nombre.
- les identifiers sont sensibles à la casse.
Nommage de classes
- il ne peut y avoir qu’une seule classe public par fichier java. Le fichier java doit porter le même nom que cette classe public.
La règle suivante n’est qu’une convention. Mais même eclipse vous rappelera à l’ordre si vous ne la respectez pas.
- le nom d’une classe commence par une majuscule. Si le nom d’une classe est la concaténation de plusieurs mots, la première lettre de chaque mot devrait être en majuscule.
Nommage de variables et constantes
Ce sont aussi des conventions.
- le nom d’une variable commence par une minuscule.
- le nom d’une constante est en majuscule et on utilise un “_” pour séparer les mots constituants le nom de la constante.
Nommage de méthodes
C’est encore une convention.
- la premièe lettre d’une méthode est une minuscule. Ensuite chaque mot commence par une majuscule. En règle générale, on essaye d’utiliser des verbes.
Types primitifs
Les types primitifs en java sont représentés par des mots-clefs commençant par une minuscule. Le type String par exemple n’est pas un type primitif, c’est une classe héritant de Object.
Certaint types primitifs ont des équivalents objets comme int et Integer par exemple. La conversion entre int et Integer étant aisée et permettant de traiter des variables de type primitif comme des objets et vice versa.
Vous retrouverez ces informations sur la page de sun sur les types primitifs.
La liste des types primitifs :
- byte : codé sur 8 bits signés. Permet de représenter un entier entre -128 et 127 inclus.
- short : codé sur 16 bits signés. Permet de représenter un entier entre -32 768 et 32 767 inclus.
- int : codé sur 32 bits signés. Permet de représenter un entier entre -2 147 483 648 et 2 147 483 647 inclus.
- long : codé sur 64 bits signés. Permet de représenter un entier entre -9 223 372 036 854 775 808 et 9 223 372 036 854 775 807 inclus.
- float : Permet de représenter un nombre décimal avec une précision sur 32 bits.
- double : Permet de représenter un nombre décimal avec une précision sur 64 bits.
- boolean : Permet de représenter un booléen. Prend les valeurs true ou false.
- char : Permet de représenter un caractère unicode codé sur 16 bits.
Les conditionnelles en Java
Nous présentons ici les syntaxes de la plupart des conditionnelles Java. Sun les appelle les “control flow statements”, et leur consacre une partie de son tutoriel.
Les conditionnelles sont des sentences qui permettent de ne pas faire uniquement des exécutions linéaires du code. En règle générale, une ligne de code correspond à une instruction. Les instructions s’exécutent donc dans leur ordre d’apparition dans le code.
Les conditionnelles peremettent de casser cette linéarité en mettant en place des tests conditionnels (if then else) ou des boucles (for, while).
Il n’y a que deux conditionnelles à connaître : if et for.
A partir de ces deux conditionnelles toutes les autres peuvent être définies.
- if then else : permet de décrire une exécution de code ou une autre en fonction du résultat d’un test. Si le test est vrai exécuter ce code, si le test est faux, exécuter cet autre code.
- for : permet de mettre en place une boucle d’exécution. Pour chaque élément de cette liste, exécuter ce code. Donc exécuter n fois ce code.
Exemple de if then else :
{
System.out.print(”test vrai”);
}
else
{
System.out.print(”test faux”);
}
il est possible d’enchaîner les tests de if. Par exemple :
{
System.out.print(”id = 0″);
}
else if (id == 1)
{
System.out.print(”id=1″);
}
else …
Il est aussi possible de ne pas préciser de else si on a aucun code alternatif à faire exécuter.
Exemple de for :
{
System.out.print( ” tour n°” + i );
}
Cette boucle s’exécutera 5 fois et affichera : tour n°0 tour n°1 tour n°2 tour n°3 tour n°4
Les autres :
- switch : Cette conditionnelle revient à écrire un ensemble de tests if sur la valeur d’une variable.
- while : Cette boucle s’exécute tant qu’un test est vrai. Très pratique pour créer des boucles infinies.
- do-while : C’est l’utilisation inverse de la boucle while. Au lieu de dire “tant que ce test est vrai, faire cette action”, on dit “faire cette action tant que ce test est vrai”.
Exemple de switch :
soit un int month représentant un mois. Le code suivant permet de tester la valeur de month et d’afficher le mois en lettres en fonction de sa valeur numérique.
{
case 1: System.out.println("January"); break;
case 2: System.out.println("February"); break;
case 3: System.out.println("March"); break;
case 4: System.out.println("April"); break;
case 5: System.out.println("May"); break;
case 6: System.out.println("June"); break;
case 7: System.out.println("July"); break;
case 8: System.out.println("August"); break;
case 9: System.out.println("September"); break;
case 10: System.out.println("October"); break;
case 11: System.out.println("November"); break;
case 12: System.out.println("December"); break;
default: System.out.println("Invalid month.");break;
}
Le mot clef case permet de préciser “si month prend cette valeur alors faire tout ce qui suit”.
Le mot clef default revient à dire “si la valeur n’est pas prise en compte par un case alors faire …”.
Le mot clef break permet de dire qu’il faut s’arréter là ou break est rencontré. En réalité, case dit c’est à partir d’ici qu’il faut exécuter. Et s’il n’y a pas de break, le code des case suivant est aussi exécuté.
Par exemple dans notre cas précédent, s’il n’y avait pas de break et avec month = 10, il serait affiché : October November December Invalid month.
Nous revenons sur break dans les interrupteurs de boucles.
exemple de while :
{
System.out.println(”toto”);
}
C’est un exemple de boucle infinie. Le test de notre while est un booléen vrai. Donc le corps du while sera exécuté à l’infini. Ce genre de code peut-être dangereux et très pratique. Très dangereux parce que l’on peut facilement faire une boucle infinie sans le vouloir. Mais parfois on a besoin de boucles infinies. Quand on veut garder des processus atifs par exemple.
Un exemple de do while :
{
System.out.println(”toto”);
}
while(false)
C’est l’exemple inverse du cas précédent. Ici “toto” sera affiché une fois uniquement. Le test du while étant faux, la boucle ne sera pas exécutée.
La grande différence entre while et do-while est que dans le cas du do-while, le test est exécuté à chaque fin de tour et non au début. Du coup, le corps de do est exécuté au moins une fois.
Les interrupteurs de boucles :
- break : permet d’interrompre l’exécution d’une boucle. A la rencontre d’un break, la boucle est interrompue.
- continue : permet de finir un tour d’exécution de boucle. A la rencontre de continue, on passe au tour suivant d’exécution de la boucle.
- return : permet d’interrompre l’exécution d’une méthode et retourne une variable ou une valeur. return peut donc aussi être utilisé pour sortir d’une boucle, mais il terminera aussi l’exécution de la méthode dans laquelle la boucle est définie.
Nous en avons fini avec ce tutoriel sur la syntaxe et les niveaux de droits d’accés. Il ne vous reste plus qu’à pratiquer.
Dans la suite des tutoriels, nous allons nous orienter vers des composants logiciels java orientés pour du web essentiellement.
Il nous reste un cours sur les javabeans pour présenter une convention de nommage incontournable dans le monde professionnel. Un cours sur les Enums, qui permettent de définir des structures très utiles principalement pour le traitement de String.
Puis nous définirons un environnement de production qui nous semble otpimal pour des développements web (un ensemble de plugins eclipse, l’utilisation de Maven, et le framework hibernate).
Enfin, nous détaillerons les composants qui nous intéressent le plus, à savoir les Servlet et les Portlet.
Mots-clefs : droits d'accés, java, syntaxe






[...] Niveaux d’accés et syntaxe java [...]