Introduction à JAVA

Structures et modificateurs

4.1 Les packages

4.1.1 Définition

JAVA permet le regroupement de classes dans une bibliothèque de classes appelée « package ». Ils sont utilisés pour les projets importants qui contiennent un nombre de classes important ou pour constituer des bibliothèques de classes réutilisables. Les classes standards du langage sont regroupées dans différents packages.

Pour créer un package, on utilise un fichier source (extension java) contenant l'ensemble du code des différentes classes.

4.1.2 Utilisation des packages

Pour utiliser une classe d'un packages, il est possible de faire référence au nom complet de la classe (en utilisant la notation pointée ce qui est très lourd) ou d'importer la classe au moyen du mot clé import placé en début de fichier.
Pour importer la classe Graphics utilisée pour le dessin, on peut écrire en début de programme :

import java.awt.Graphics ;

Si on utilise beaucoup de classes d'un package ce système est assez lourd et il est préférable d'importer la totalité du package en utilisant la notation :

import java.awt.*;

4.1.2 Les packages standard de JAVA

Toutes les versions de JAVA sont fournies avec une « interface de programmation d'application » (en anglais API acronyme pour : Application Programming Interface) qui regroupe un ensemble de classes d'usage général. Ces classes sont regroupées dans les packages suivants :

java.lang  : ce package qui contient les éléments du langage est importée automatiquement.

java.applet  : gestion des applets

java.awt  : ( A bstract W indowing T oolkit) classes pour la mise en place de l'interface utilisateur.

java.awt.image  : gestion des images

java.awt.peer  : interface avec le système d'exploitation. Réservé aux utilisateurs très très confirmés.

java.util  : utilitaires divers.

java.io  : gestion des fichiers et des entrées sortie. Ne sera pas étudié ici.

java.net  : gestion des accès réseau. Ne sera pas étudié ici.

Sauf java.lang, ces packages doivent être importés par une instruction import placée en début de programme.

Le contenu de ces différents packages standard de JAVA sera étudié ultérieurement.

4.2 Les modificateurs

Ce sont des mots clé utilisés lors des déclarations pour modifier les attributs habituels des variables ou des méthodes. Il est possible de les placer avant ou après la déclaration du type.

Seules les variables d'instance et de classe peuvent être qualifiées par un modificateur.

Par défaut (pas de modificateur), la visibilité s'étend au package de l'objet de définition.

4.2.1 private, public protected

Ces trois modificateurs peuvent être combinés pour modifier la visibilité (portée) des classes, méthodes, variables. Il existe 4 niveaux différents de visibilité.

public  : classes, méthodes, variables déclarées «  public  » sont visibles par toutes les autres méthodes que ce soit à l'intérieur ou à l'extérieur du package de définition. La déclaration de variables publiques est contraire au principe d'encapsulation.

protected  : méthodes, variables ( protected n'est pas autorisé pour les classes) déclarées «  protected  » ne sont accessibles que par les méthodes de la classe et des sous-classe du package de l'objet de défintion.

private protected  : cette association restreint la visibilité à la classe et à ses sous-classes.

 private  : c'est le degré de restriction le plus fort ; seules les méthodes de la classe peuvent voir une entité (variable ou méthode) déclarée private .

4.2.2 static

Si dans une classe, on déclare une variable «  static  » cette variable va contenir une information commune à toutes les instance de la classe. Une telle variable est dite variable de classe.
Une méthode déclarée statique (static) est une méthode qui agit sur les variables de classe.
Exemple :
On peut compléter l'exemple « rectangle » du chapitre 3 en introduisant une notion d'échelle pour le dessin. Le facteur d'échelle qui sera commun à toutes les instances sera déclaré par :

private static float echelle = 1.0f

Pour mettre à jour cette variable de classe, on peut créer la méthode suivante :

static void init_echelle(float ech)
{   echelle = ech;}

Cette méthode qui agit sur une variable de classe peut être déclarée static.

La méthode "surface" doit être modifiée de la manière suivante :

public int surface()
{ int sur = (int)(large*haut*echelle);
   this.dessine();
   g.drawString(""+sur,orx+10,ory+20);
   return sur;}

Pour appeler la méthode init_echelle la syntaxe est :

rectangle.init_echelle(0.75f);

En effet comme la méthode init_echelle a été déclarée static elle ne référence aucune instance de la classe. On préfixe donc le nom de la méthode par le nom de la classe.

Remarque :

Si l'on omet le modificateur static dans la déclaration de la méthode init_echelle, pour pouvoir invoquer cette méthode il faut la préfixer par le nom d'une instance existante ce qui n'est pas très logique. L'appel doit alors s'écrire :

r1.init_echelle(0.75f);

mais si l'instance r2 existe alors «  r2.init_echelle(0.75f); » peut également être utilisé.

4.2.3 final

Variables  : une variable déclarée «  final  » est en fait une constante. Il n'est plus possible de la modifier.
Après la déclaration : final int x = 20  ; le code x = 30 ; déclenche une erreur de compilation.
Méthodes : les méthodes déclarées «  final  » ne peuvent pas être remplacée dans une sous-classe.
Classes  : les classes déclarées «  final  » ne peuvent pas avoir de sous-classe.

4.2.4 abstract

Les classes déclarées abstraites ne peuvent pas créer d'instances. Une classe abstraite est un cadre général utilisé pour générer des sous-classes ayant globalement la même structure. Une classe abstraite peut comporter des méthodes classiques dont hériterons toutes ces filles et des méthodes abstraites qui devront être implémentées de manière spécifique dans les classes filles. Les déclarations « abstract » sont donc destinées uniquement à améliorer la structuration du code.

4.2.5 synchronized

Dans les programmes qui gèrent plusieurs processus simultanés, il est nécessaire de protéger l'accès aux données communes aux différents processus sinon il peut se produire des conflits d'accès simultané à la même variable. Le modificateur « synchronized » est utilisé pour interdire ces accès simultanés.

4.2.6 volatile

Les données susceptibles d'être modifiées de manière externe (par exemple par un périphérique relié à l'ordinateur hôte) sont déclarées « volatile ».
Un concepteur d'applets n'aura sans doute jamais besoin d'utiliser ces trois derniers modificateurs.