You are on page 1of 58

Packages

Ou
Namespaces

Quest ce quun package?


Les classes Java sont regroupes en paquetages
(packages en anglais)
Ils correspondent aux bibliothques des autres
langages comme le langage C, Fortran, Ada, etc...
Les paquetages offrent un niveau de modularit
supplmentaire pour
runir des classes suivant un centre dintrt commun
la protection des attributs et des mthodes
Le langage Java est fourni avec un grand nombre de
paquetages

Packages

Exemples de packages
java.lang : rassemble les classes de base JAVA, Object, String,
System...Ce package est import par dfaut.
java.applet : fournit les classes ncessaires pour crer et utiliser les applets.
java.util : classes pour les collection
java.awt (Abstract Window Toolkit) : Contient les classes pour crer les
interfaces utilisateur et pour dessiner des graphiques.
Java.io : Fournit les classes pour les entres/sorties (flux de donnes,
srialisation, fichiers).
Javax.crypto : Fournit les classes et interfaces pour les oprations de
cryptographie.
Javax.swing : Provides a set of "lightweight" (all-Java language)
components that, to the maximum degree possible, work the
same on all platforms.
Packages

Rle dun package


Le regroupement des classes dans des packages permet d'organiser les
librairies de classes Java et d'viter d'ventuels conflits de noms.
Exemple : Dans les librairies standards deux classes Date
Mais dfinies dans des packages diffrents

nom complet de la classe


(Fully Qualified Name) :
nomDupackage.nomDeLaClasse

Packages et Systme de fichiers


Java
Java.sql

Date.class

Chaque classe est


stocke dans un
fichier
Chaque package
correspond un
rpertoire

Java.util

Date.class

Java.awt
Java.awt.DataTransfer

Chaque package peut contenir :


Des classes

Button.class

Des interfaces
Dautres package (sous
package)

Paint

Clipboard.class

5
La hirarchie des packages correspond une hirarchie de rpertoires

Packages et Systme de fichiers


A une hirarchie de packages correspond une hirarchie de rpertoires
dont les noms concident avec les composantes des noms de package
Java
Java.awt
Java.util
Date

Date

classes

java

java

Java.awt.image
DataBuffer
awt

Java.sql

src

sql util

Java.awt.event

image

ActionListener

Au niveau des
sources (.java)

event

awt
image

sql

util

event

Au niveau du
bytecode (.class

Packages

Ajout dune classe un package


Instruction package
Pour ajouter une classe un package, il faut dabord crer un rpertoire qui
correspond au package puis utiliser linstruction:
package nomDuPackage;
Linstruction package est optionnelle, mais lorsquelle existe, elle doit tre la
premire instruction du fichier qui contient la classe.
Si elle est absente, la classe est ajoute au package par dfaut qui correspond au
rpertoire courant o est stock le fichier de la classe.

. Rpertoire courant

package mypackage;
public class UneClasse {
}

package mypackage.etudiants;
public class EtudiantFB{
package mypackage.etudiants;
} public class EtudiantFC {
package mypackage.matieres;
} public class MatierePr{

mypackage
MaClase

etudiants
UneClasse

package mypackage.matieres;
} public class MatiereTh{
}

public class MaClasse{


}

matiere
s

EtudiantFB

EtudiantF
C

MatierePr

MatiereTh

Packages

Packages dans lIDE NetBeans 5.0


La fentre Files
donne
lorganisation
physique des
fichiers de
lapplication

src
Myproject

mypackage
MaClase
matiere
s

etudiants
UneClasse
La fentre
Projects donne
lorganisation
Logique des
packages de
lapplication

EtudiantFB EtudiantFC

MatierePr

Le rpertoire src est la racine des


hirarchies de packages dun projet
Les options classpath et sourcepath
automatiquement places sur ce
rpertoire
8

Accs aux lments dun Package


Pour pouvoir utiliser, dans une classe dun package donn, une classe issue
dun autre package il faut prciser son origine au compilateur.
Comme le montre lexemple ci-dessous , il existe 3 faons diffrentes pour
prciser lorigine dune classe :
1 En important la classe
package
MyProject.mypackage.matieres;
import java.util.*;
import java.sql.Connection;
2

public class MatierePr{


String laboratoire;
String preparateur;

Connection c;
3

2 En important tout le package


o est dfinie la classe
3 En indiquant le nom complet de la
classe (Fully Qualified Name : FQN).

import ninsre pas du code dans le


code de la classe (comme le fait
#include du C). Il sagit simplement
dune indication pour le compilateur.
En interne seuls les FQN sont utiliss.

Date d1;
java.sql.Date d2;

..

Packages

Accs aux lments dun Package


Linstruction import nomPackage.* ne concerne que les classes du package
indiqu. Elle ne sapplique pas aux classes des sous packages.

import java.awt.image.*;
import java.awt.*;
public class Star {
double x,
double y;
Color c;

Classe Star utilise les classes Color


et Graphics du package java.awt
et la classe Raster du package
java.awt.image.
Import java.awt.* nimporte pas les
classes du sous package
java.awt.image

public void draw(Graphics g) {


.
Raster r;
.
}
..
}

Packages

Pas besoin dimport


pour les classes du
package java.lang
Il est import par dfaut
10

Lever une ambigut


On aura une erreur la compilation si
2 paquetages ont une classe qui a le mme nom
ces 2 paquetages sont imports en entier
Exemple (2 classes List) :
import java.awt.*;
import java.util.*;
Pour lever lambigut, on devra donner le nom complet
de la classe. Par exemple,
java.util.List l
Packages

11

Import des membres statiques dune classe


Jusqu' la version 1.4 de Java, pour utiliser un membre statique d'une classe, il faut
obligatoirement prfixer ce membre par le nom de la classe qui le contient.
public class version1_4 {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.sqrt(20));
}
}
Java 1.5 propose une solution pour rduire le code crire concernant les
membres statiques en proposant une nouvelle fonctionnalit concernant
l'importation de package : l'import statique (static import).
permet d'appliquer les mmes rgles aux membres statiques qu'aux
classes et interfaces pour l'importation classique
import static java.lang.Math.*;
public class version1_5{
public static void main(String[] args) {
System.out.println(PI);
System.out.println(cos(0));
}
}

importation statique
s'applique tous les
membres statiques :
constantes et mthodes
statiques de l'lment
import
Packages 12

Compiler les classes dun paquetage


javac -d rpertoire-package Classe.java
L'option -d permet dindiquer le rpertoire racine o
sera rang le fichier compil
Si on compile avec l'option -d un fichier qui
comporte l'instruction package nom1.nom2, le
fichier .class est rang dans le rpertoire
rpertoire-package/nom1/nom2
Exemple: javac d classes MaClasse.java
Packages

13

Compiler les classes dun paquetage

Si on compile sans l'option -d , le fichier .class est


rang dans le mme rpertoire que le fichier .java
(quel que soit le paquetage auquel appartient la classe)
Quand on compile les classes dun paquetage avec l'option -d, on doit
le plus souvent indiquer o sont les classes dj compiles du
paquetage avec l'option -classpath :
javac -classpath rpertoire-package
-d rpertoire-package Classe.java

Exemple :
javac classpath classes d classes Maclasse.java
Packages

14

Excuter une classe dun paquetage


On lance lexcution de la mthode main() dune classe en donnant
son nom complet (prfix par le nom de son paquetage)
Par exemple, si la classe C appartient au paquetage p1.p2 :

java p1.p2.C
Le fichier C.class devra se situer dans un sous-rpertoire p1/p2
dun des rpertoires du classpath (option -classpath ou variable
CLASSPATH)
Exemples:

Java classpath classes p1.p2.c


Packages

15

Utilisation pratique des paquetages


Les premires tentatives de dveloppement avec paquetages
conduisent de grosses difficults pratiques pour compiler les classes
Ces difficults peuvent tre vites:
en respectant quelques principes simples pour le placement des
fichiers sources et classes (Voir diapositives suivantes)
en utilisant correctement les options classpath et

-d

Packages

16

Exemples de placement des fichiers .java et .class


MyJavaProgs

src

classes

p1
Test.java

doc

p1
Test.class

p2
C1.java

p2
C1.class

p3
C2.java
C3.java

p3
C2.class
C3.class

Packages

17

Packages

18

import p1.*;
import p1.p2.*;
import p1.p2.p3.*;
public class Test{
public static void main(String[] args){
System.out.println("je suis la classe Test du src" );
new C1().affiche(); new C2().affiche(); new C3().affiche(); }}

Packages

19

package p1;
public class C1{
public void affiche(){
System.out.println("je suis la classe C1 du package p1");}}

Packages

20

package p1.p2;
public class C2{
public void affiche(){
System.out.println("je suis la classe C2 du package p1.p2");}}

Packages

21

package p1.p2.p3;
public class C3{
public void affiche(){
System.out.println("je suis la classe C3 du package p1.p2.p3"); }}

Packages

22

Compilation et excution des classes du


package p1, p1.p2 et p1.p2.p3

Si on se place dans le rpertoire racine,


pour compiler :
javac d classes classpath classes
javac d classes classpath classes
javac d classes classpath classes
javac d classes classpath classes

src/p1/p2/p3/C3.java
src/p1/p2/C2.java
src/p1/C1.java
src/Test.java

-pour excuter :
java classpath classes Test
-pour gnrer la documentation :
javadoc d doc sourcepath src
subpackages p1 p1.p2 p1.p2.p3

On peut ajouter dautres rpertoires ou fichiers .jar dans le classpath

23

Classes inter-dpendantes
Si 2 classes sont inter-dpendantes, il faut les indiquer
toutes les deux dans la ligne de commande java de
compilation :
javac ... A.java B.java
ou
javac ... *.java

Packages

24

Option -sourcepath
javac peut ne pas savoir o sont les fichiers source de certaines
classes dont il a besoin (en particulier si on compile plusieurs
paquetages en mme temps)
Loption sourcepath indique des emplacements pour des
fichiers sources
Comme avec classpath, cette option peut tre suivie de fichiers
jar, zip ou des rpertoires racines pour les fichiers source (lendroit
exact o se trouvent les fichier .java doit reflter le nom du
paquetage)

Packages

25

Utilisation des fichiers source


javac recherche les classes dont il a besoin dans le
classpath
Sil ne trouve pas le fichier .class, mais sil trouve le
fichier .java correspondant, il le compilera pour obtenir le
.class cherch
Sil trouve les 2 (.class et .java), il recompilera la
classe si le .java est plus rcent que le .class

Packages

26

Exemple avec sourcepath


Situation : compiler une classe C, et toutes les classes dont cette
classe dpend (certaines dans des paquetages pas encore compils)
javac C.java ne retrouvera pas les fichiers class des
paquetages qui ne sont pas dj compils
On doit indiquer o se trouvent les fichiers source de ces classes par
loption sourcepath ; par exemple, pour compiler Test.java
C1.java, C2.java et C3.java de notre exemple

javac d classes classpath classes


sourcepath src
src/Test.java

Packages

27

Problme avec sourcepath


Si C.java a besoin dun paquetage pas encore compil
et dont les sources sont indiques par loption
sourcepath
Si ce paquetage comporte une erreur qui empche sa
compilation
Alors javac envoie un message derreur indiquant que le
paquetage nexiste pas, sans afficher de message
derreur de compilation pour le paquetage
Lutilisateur peut alors penser tort que loption
sourcepath ne marche pas
Packages

28

Ant
Pour le dveloppement dapplications complexes, il vaut
mieux sappuyer sur un utilitaire de type make
Lutilitaire Ant, trs volu, et trs utilis par les
dveloppeur Java est spcialement adapt Java (voir
cours sur Ant)

Packages

29

Recherche des classes


par la JVM

Packages

30

Chemin de recherche des classes


Les outils java et javac recherchent toujours dabord dans les
fichiers systme qui sont placs dans le rpertoire dit <javahome>, le rpertoire dont le nom commence par jre
Ces fichiers systme sont les suivants :
fichiers rt.jar dans le rpertoire jre/lib o java a t
install,
fichiers .jar ou .zip dans le sous-rpertoire jre/lib/ext
Ils regardent ensuite dans le classpath

Packages

31

Classpath

Le classpath contient par dfaut le seul rpertoire courant (il est gal
. )

Si on donne une valeur au classpath, on doit indiquer le rpertoire


courant si on veut quil y soit

Dans le classpath on indique des endroits o trouver les classes et


interfaces :
des rpertoires (les classes sont recherches sous ces
rpertoires selon les noms des paquetages)
des fichiers .jar ou .zip

Packages

32

Exemples de Classpath

Sous Windows, le sparateur est ; :


.;c:\java\mespackages;c:\mesutil\cl.jar
Sous Unix, le sparateur est :

Packages

33

Complments sur javac et


java

Packages

34

Quelques autres options de javac


-help affiche les options standard
-X affiche les options non standard
-verbose donne des informations sur la compilation
-nowarn naffiche pas les messages davertissement (tels que les
messages sur les problmes de codage de caractres)
-deprecation donne plus dinformation sur lutilisation de membres
ou classes dconseills

Packages

35

Quelques autres options de javac


-target permet dindiquer la JVM avec laquelle sera excut le
programme
-source spcifie la version de java des codes source ; par
exemple, -source 1.4 permet lutilisation des assertions du SDK
1.4
-g ajoute des informations dans les fichiers classes pour faciliter la
mise au point
-encoding spcifie le codage des caractres du code source ; par
exemple
encoding ISO-8859-1
Packages

36

Option -Xlint

Ajoute par le JDK 5


Cette option affiche des avertissements qui sont peut-tre (mais pas
ncessairement) des erreurs de programmation
Un avertissement nempche pas la gnration des .class
Par exemple, loption -Xlint:fallthrough avertit si une entre
dun switch ne se termine pas par un break
-Xlint:unchecked donne plus dinformations sur les problmes
de conversions (lis la gnricit ; voir cours sur la gnricit)
-Xlint:path avertit si un chemin est manquant (classpath,
sourcepath,)
-Xlint:serial avertit si une classe srialisable ne contient pas
de serialVersionUID (peut nuire la maintenance)
Packages

37

Option verbeuse de javac


Loption verbose affiche les noms
des classes charges en mmoire
des fichiers source compils

Packages

38

Informations pour la mise au point

Loption g de javac permet dinclure dans les fichiers classe des


informations utiles pour la mise au point des programmes ; -g
seul inclut les informations sur les fichiers source (source) et sur les
numros de ligne (lines)

On peut aussi ajouter les informations sur les variables locales


(vars)

Exemple : javac g:source,lines,vars ...

On peut enlever ces informations avec loption -g:none

Packages

39

Options de java
-Dproprit=valeur permet de donner la valeur dune proprit
utilise par le programme (voir cours sur les proprits)
-version affiche la version de java utilise et sarrte
-showversion affiche la version de java utilise et continue
-jar permet dexcuter un fichier jar (voir cours sur les fichiers jar)

Packages

40

Option verbeuse de java

Loption verbose affiche divers informations qui peuvent tre utiles


pour mettre au point les programmes

Elle affiche
les noms des classes charges en mmoire
des vnements lis au ramasse-miettes
des informations sur lutilisation des librairies natives (pas crites
en Java)

Packages

41

Unknown source

Parfois un message derreur naffiche pas la ligne qui a provoqu


lerreur mais le message Unknown source

Pour faire apparatre le numro de ligne quil faut compiler la classe


o a lieu lerreur avec loption de java -g

Packages

42

Codage des caractres

Packages

43

Voici les modifications apportes Java


pour prendre en compte les dernires
versions dUnicode

Packages

44

Le codage des caractres

En interne Java utilise le codage Unicode pour coder ses caractres


(il nutilise pas le code ASCII)

Avant la version 5, les caractres taient cods sur 2 octets avec le


type primitif char

Unicode ayant maintenant plus de 65.536 caractres (96.382 pour


Unicode 4.0), le type char ne suffit plus et tout se complique un peu

Packages

45

Unicode
Java 5 code les caractres en utilisant
Unicode version 4.0
Unicode 4.0 permet de coder jusqu
1.112.064 caractres
Les nombres associs chacun des
caractres Unicode sont nomms code
points ; ils vont de 0 10FFFF en
hexadcimal
Packages

46

Les plans Unicode


Les caractres de code 0 FFFF sont
appels les caractres du BMP (Basic
Multilingual Plane)
Les caractres europens appartiennent
tous ce plan
Les autres caractres (de code allant de
10000 10FFFF) sont appels caractres
supplmentaires
Ce sont essentiellement des caractres
asiatiques
Packages

47

Reprsentation des caractres


en Java 5
A partir de la version 5,
au bas niveau de lAPI, un caractre est
reprsent par un int
les types String, StringBuffer,
StringBuilder, char[] utilisent le
codage UTF-16 pour interprter les char
quils contiennent
Packages

48

Codage UTF-16
Les caractres du BMP sont cods par un
seul char (de 2 octets) en Java
Les caractres supplmentaires sont
cods laide de 2 units de codage
(code units en anglais) de 16 bits, appels
surrogates ( de remplacement en
franais)
Chaque unit de codage est cod par 1
char en Java
Packages

49

Surrogates
Le premier caractre surrogate a un code
compris entre \uD800 et \uDBFF (si Java
rencontre un char avec cette valeur, il sait
quil doit complter par un autre char) ; on
dit quil est dans lintervalle haut des
surrogates
Le deuxime doit avoir un code dans
lintervalle \uDC00 - \uDFFF (intervalle
bas des surrogates)
Packages

50

char depuis la version 5


Si on extrait un caractre dune String on peut
donc tomber sur un caractre surrogate et
pas sur un caractre Unicode complet
Si on veut crire un code vraiment
international, il faut maintenant viter
lutilisation directe de donnes
reprsentant un seul char et lui prfrer
lutilisation des squences de caractres
(String, StringBuffer, StringBuilder,
char[], CharSequence,...)
Packages

51

Exercice : compter les


caractres
// Les 2 derniers char ne forment
// qu'un seul caractre Unicode
String s = "\u0041\u00DF\u6771\uD801\uDC00";
int nb = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (! Character.isHighSurrogate(c)) {
nb++;
}
}
System.out.println("Nbre de caract. " + nb);
Packages

52

Compter les caractres


En fait String fournit une mthode pour
compter les caractres :
int codePointCount(int dbut,
int fin)

Pour compter tous les caractres dune


String :
s.codePointCount(0, s.length())

Packages

53

Conversion entre char et int


La classe Character qui enveloppe char a
2 mthodes static de conversion :
int toCodePoint(char high, char low)
convertit 2 char en codePoint sans

validation ; si on veut valider il faut utiliser la


mthode boolean isSurrogatePair(char
high, char low)
char[] toChars(int codePoint) convertit
un codePoint en 1 ou 2 char (il existe une
variante o char[] est pass en paramtre)
Packages

54

UTF-8
Cest un codage des caractres Unicode
sur 1, 2, 3 ou 4 octets
Les caractres ASCII (tendus avec les
caractres les plus utiliss des langues
occidentales ; ISO-8859-1) sont cods sur
1 seul octet
Ce codage peut donc tre pratique dans
les pays occidentaux comme la France
Packages

55

Autres codages
Si Java code les caractres avec UTF en
interne, lutilisateur peut souhaiter utiliser un
autre codage
Les codages disponibles dpendent de
limplmentation de Java (ils sont nombreux)
Les codages UTF-8, UTF-16, US-ASCII et
ISO-8859-1 sont requis sur toutes les
implmentations
Packages

56

Conversion entre String et


byte[]
La conversion doit indiquer le codage
utiliser
Exemples :
String s = "abc";
byte [] ba = s.getBytes("8859_1");
String t = new String(ba, "Cp1252");

Packages

57

Conversion entre String et


char[]
Pas de codage indiquer pour cette
conversion
Attention, comme pour tous les tableaux,
toString() renvoie ladresse du tableau en
mmoire et pas la traduction de char[] vers
String

Exemples :
String s = "abc";
char[] ca = s.toCharArray();
String s = new String(ca);
Packages

58

You might also like