5- Modèle Objet Java


0 Rappel - Charger des classes et rattacher des classes à un package

1 Généralités sur le modèle objet de Java

2 Exploration pratique et partielle des packages Java

3 Le package Applet

4 Les packages java.awt et javax.swing

5 Le package io

6 Le package lang

7 Le package util

Exercices Corrigés


0 Rappel - Charger des classes et rattacher des classes à un package

La forme générale d'une classe :

package PackA;

import java.util.*;
import javax.swing.JFrame;
import Divers.Utils;

public class A{
/*Definition des méthodes et des attributs*/
}


La toute première instruction indique que la classe appartient au package PackA. Si le chemin d'accès au package n'est pas précisé, le package sera défini en fonction d'un chemin d'accès par défaut. Ainsi, si le jsdk a pour adresse c:\j2sdk1.4.0\ sur ma machine, alors l'instruction package PackA sera reinterprétée comme package c:\j2sdk1.4.0\bin\PackA par la machine (il est possible de modifier ce comportement par défaut).

Je peux préciser directement le nom du package auquel je fait réference en spécifiant un chemin absolu : package c:\pack3D. Lors de la compilation, le fichier de bytecodes .class crée sera mis dans le répertoire qui correspond au package déclaré (à vérifier en fonction des versions du compilateur, sinon, il faut manuellement mettre les .class créés dans le répertoire correspondant). L'instruction c:\pack3D.objets3D fait réference aux classes contenues dans le sous-repértoroire objets3D du répertoire c:\pack3D\

Les instructions de type import indiquent les classes/packages auxquelles on fait réference et qui pourront être utilisées dans le corps du document. On pourra instancier et déclarer des objets du type des classes réferencées.

Là aussi, pour une instruction avec un chemin relatif, le chemin est complété par le repertoire par défaut, sauf pour les réferences à des package java.... ou javax.... qui sont des réferences standards et ne correspondent pas à des repertoires directement visibles sur le disque.

Si je veux faire réference aux package pack3D et objets3D vus plus haut : import c:\pack3D.*; import c:\pack3D.objetsED.*. Si je veux pouvoir utiliser les objets et classes qui sont dans c:\j2sdk1.4.0\bin\packA : import packA.*;. Pour chaque package, je peux avoir besoin d'une classe ou de plusieurs classes de ce package. Supposons que je veuille utiliser la classe A du packA et non pas tout le package packA, je peux préciser ma réference : import packA.A;. L'instruction import packA.*; appelle à charger l'ensemble du contenu du package en mémoire vive. Pour la manipulation de classes de packages importants, il peut être bon d'optimiser convenablement les appels qui y sont fait.

Note1 : la classe d'un package packA "voit" l'ensemble des classes du package packA. Ainsi, un code du type :

package packA;

import packA.*;
...
Est tout à fait redondant.

Note2 : pourquoi l'organisation en package ? L'alternative serait de tout mettre dans un unique repertoire et de rajouter les classes constitutives de notre application dans ce repertoire. Ce faisant :

1 Généralités sur le modèle objet de Java

Pour une bonne utilisation d'un langage objet, il y a une démarche optimale à avoir entre le coût que représente le fait de coder des fonctionnalités et le fait d'assimiler des fonctionnalités du modèle objet.

Lorsqu'on conçoit une hiérarchie de classes pour une application particulière, soit la hiérarchie est indépendante, soit elle se rattache à la hirérarchie des objets de Java (elle s'y rattache toujours de manière implicite puisque tout objet implémente l'interface Object).

Il existe plusieurs moyens d'accéder aux codes sources de l'API java. Lors de l'installation du sdk, un dossier src peut ou non apparaître. Si il apparaît, on peut l'explorer pour aller voir l'ensemble des classes de l'API.

Une autre manière d'accéder aux codes sources est d'utiliser la documentation en ligne de java. Dans Google, tapez "sun java LinkedList" et le premier élement renvoyé par Google est une page HTML de documentation sur la classe LinkedList de l'API.

En explorant l'API java, il est parfois difficile de comprendre les distinctions très fines qui sont faites. Ainsi java distingue entre des classes de flux sur fichier (java.io.FileOutputStream par exemple) et une classe Fichier (java.io.File). Ce type de distinction a des raisons qui n'apparaissent pas forcément, rendent l'utilisation parfois opaque, et induit un coût en temps pour la recherche des fonctionalités voulues.

Compatibilité ascendante : au cours des différentes version, l'API java s'enrichit et parfois les concepteurs sont obligés de modifier les classes fondamentales de l'API. Le modèle définit à la base est suffisamment large pour ne pas être souvent modifié. Néanmoins, des classes ont été modifiées au cours du temps et certains des rajouts se sont fait de manière contrainte par rapport à l'existant. Pour ce qui est des modifications des classes au cours du temps, on trouve que certaines méthodes sont annotées deprecated dans la documentation et le compilateur javac refuse la compilation d'applications appelant l'utilisation de telles méthodes. Les modifications apportées à l'API font que les fonctionnalités de ces méhodes sont accessibles par d'autres moyens.


2 Exploration pratique et partielle des packages Java

On aborde ici les principaux packages utiles pour une première approche de java, le lecteur curieux et avisé pourra poursuivre lui même l'exploration.
java.AppletLe package contient notamment une classe Applet dont on pourra faire hériter des classes
java.awtCe package définit une série d'élements graphiques. awt pour Abstract Windows Toolkit
java.ioio pour input/output : ce parckage permet de gérer des flux vers et depuis des fichiers.
java.langLe package contient une série de classes/Interfaces fondamentales : cf Object, Thread, Runtime etc... java.lang contient des Wrappers pour les ensembles de types de base
java.utilContient notamment des objets collection de différents types (LinkdList, Map, et...) et des éléments pour la gestion temporelle (Date par exemple).
javax.swingUn package graphique, en quelque sorte, une seconde génération des objets graphiques après awt.


3 Le package Applet

Une applet est une application graphique pouvant être intégrée dans un site Web. Elle est stockée sur le server (compressée au foramt jar ou non) et s'éxecute sur le client. Il faut être assez modeste dans les fonctionnalités de l'application : un utilisateur avertit aura configuré la sandbox de sa machine qui définit les opérations autorisées pour une application java.


4 Les packages java.awt et javax.swing

Les deux packages permettent de créer des interfaces graphiques aux applications (Fenetre, bouton, dessns etc...). awt est le package le plus anciens des deux, il contient des classes : Color, Frame, Panel (une surface), Component(une forme générale de zone graphique), Container (une interface définissant un objet contenant des objets graphiques)... Un cours est consacré à ces objets.


5 Le package io

io pour "in and out". Ce package donne un ensemble de classes permettant de travailler sur des flux vers des fichiers, une classe d'interfaçage vers le système de fichier. Classes de flux etc... une interface : Serializable. Un objet qui implémente cette interface peut être sauvegardé sous forme d'un fichier binaire dans son état courant et récupérer ensuite. Voir le chapitre sur les flux vers les fichiers


6 Le package lang

Ce package est toujours actif. Il n'est pas besoin de faire un import de ce package. C'est pour cela qu'on peut manipuler directement String par exemple.

Un package qui contient :


Un exemple d'utilisation de la classe Runtime :
public class Memoire {
    public static void main(String[] args){
      System.out.print("Mémoire totale : ");
      System.out.print(Runtime.getRuntime().totalMemory() / 1000000d);
      System.out.println("Mo.");
      System.out.print("Mémoire disponible : ");
      System.out.print(Runtime.getRuntime().freeMemory() / 1000000d);
      System.out.println("Mo.");
      System.out.print("Mémoire maximum utilisable : ");
      System.out.print(Runtime.getRuntime().maxMemory() / 1000000d);
      System.out.println("Mo.");
    }
}


7 Le package util

Ce package contient des collections qui seront explicitées au chapitre collections, les formats Date, Currency, Timer etc...

Il existe d'uatres package qui n'ont pas été évoqués ici : java.sql, java.text, javax.*, com.* etc... Certains s'expliciteront dans ce qui suit, mais le cours est loin d'aborder l'ensemble des packages pour des raisons évidentes, par ailleurs, certains packages évoluent au cours du temps.