Vous êtes sur la page 1sur 33

Le Langage Java (II)

Frederic Lang

` Magistere dInformatique
Ecole normale superieure de Lyon

` Deuxieme semestre 1998/1999

` Controles dacces : paquetages et modicateurs de visibilite

Paquetage : Ensemble de classes regroupees selon leurs fonctionnalites. Exemples : java.lang, java.util, sont des paquetage de lAPI (Application Programming Interface) de JAVA. Lutilisateur denit ses propres paquetages. Modicateur de visibilite : mot cle (public,

private, protected) qui

` ` permet de controler lacces a une classe, une variable, ou une methode, en fonction du paquetage dappartenance de la classe utilisatrice.
1

Le modicateur public

Le modicateur public a le sens suivant, selon lentite auquel il sapplique : Une classe ou une interface public est visible partout (i.e. de nimporte quelle autre classe ou interface, de nimporte quel autre paquetage). Une classe ou une interface non public nest accessible que dans le paquetage auquel elle apppartient. Un message (methode ou variable) public est visible partout ou sa classe est ` visible.
2

Les modicateurs protected et private

Les modicateurs protected et private sappliquent aux messages. Un message protected nest visible que dans les classes se trouvant dans le meme paquetage, et dans les sous-classes de sa classe. Un message private nest visible que depuis la denition de sa classe. (Invisible dans les sous-classes.)
3

Autres modicateurs

` Deja vus : abstract,

static, public, protected, et

private.
Aussi : final : Une classe final ne peut pas avoir de sous-classe. Une methode final ne peut pas etre redenie. Une variable final a une valeur qui ne peut pas etre modiee. Remarque : on denit les constantes comme static final. native : la methode est implantee dans un autre langage. synchronized : specique aux threads. Voir aussi transient, volatile.
4

LAPI de Java

API : Application Programming Interface. Cest la librairie de Java, organis ee en paquetages : java.applet : Pour denir des petites applications mobiles. Une applet est une sous classe de la classe Applet qui contient les denitions necessaires ` pour pouvoir etre envoyee a travers un reseau pour etre executee sur la machine hote. ` java.awt : Bibliotheque pour le fenetrage. (Graphisme.) java.io : Gestion des entrees et sorties. (Streams, Files, etc.) java.lang : Les classes centrales du langage. Object, String, Throwable, etc. java.net : Programmation reseau (URL, Datagram), etc. java.util : Classes utiles (Vector, Date, Hashtable).
5

Utiliser des paquetages

On peut utiliser des classes se trouvant dans des paquetages diff erents du ` paquetage de la classe courante de deux manieres : ` En donnant le nom complet de la classe a chaque utilisation.

java.util.Vector v = new java.util.Vector() ; En utilisant une clause dimport en tete de chier : import java.util.Vector ; // ou java.util.* public class MaClasse ... Vector v = new Vector() ; ...
Remarque : pas besoin de clause dimport pour java.lang.*.
6

Creer ses propres paquetages

` On peut creer ses propres packages grace a la clause package. Exemple :

package mesclasses.malib ; /* Les classes de ce fichier appartiennent a mesclasses.malib */ import ... public class A ...

Il doit exister, sous un des repertoires contenus dans la variable CLASSPATH, un repertoire de nom mesclasses/malib/.
7

Compilation et Interpretation (JDK)

JDK : Java Development Kit (Sun)

ex.java

javac

ex.class

java

Verification

Programme Java

Compilateur Java

Programme Bytecode Reseau

Interprete Java (JVM) Sortie

Bac a sable Entree

Exemple de compilation en Bytecode chier A.java :

public class A private int x ; A() x = 1; public void incremente() x++ ; public int get x() return x ;

Bytecode genere :

Method A() 0 aload 0 1 invokespecial #3 <Method java.lang.Object()> 4 aload 0 5 iconst 1


9

6 putfield #4 <Field int 9 return Method void incremente() 0 aload 0 1 dup 2 getfield #4 <Field int 5 iconst 1 6 iadd 7 putfield #4 <Field int 10 return Method int get x() 0 aload 0 1 getfield #4 <Field int 4 ireturn

x>

x>

x>

x>

10

Autres outils du JDK

appletviewer : pour visionner des applets. javadoc : pour generer de la documentation (html, commentaires /* */). javap : pour desassembler les chiers bytecode. Donne une version lisible du
bytecode genere. jdb : debogueur Java.

...
11

Chargement dynamique de classes

` Pour chaque classe chargee par linterprete Java, il existe un objet correspondant, de meme nom et de classe Class, qui code la classe. ` Il est possible de charger des classes de facon dynamique, cest a dire de charger ` ` des classes a lexecution : instanciation dune nouvelle instance de Class, a partir dun nom de classe existante. La classe ClassLoader denit (et declare, car cest une classe abstraite) les methodes necessaires pour pouvoir charger dynamiquement des classes. Une Applet est une classe, chargee dynamiquement par un visionneur dapplet, qui met en uvre un objet de type ClassLoader. Le ClassLoader a la charge de verier le bytecode et peut donc refuser de charger une classe (s ecurite).
12

Exercice : la classe java.util.Vector

Vecteurs dObject. Protocole (extrait) de la classe Vector :

public public public public

Vector() ; void addElement(Object obj) ; Object elementAt(int index) ; int size() ;

` Ecrire un programme qui place un point dans un vecteur, puis r ecupere ce point pour lui appliquer la methode move.
13

Reponse :

Vector v = new Vector() ; Point p = new Point() ; Point q ; v.addElement(p) ; q = (Point) v.elementAt(v.size() - 1) ; q.move(1, 1) ;
Ici, le transtypage est necessaire pour que le compilateur accepte laffectation.

14

Exercice : Surcharge

Que se passe-t-il avec le programme suivant ?

public class A public class B extends A public class C public static int f(A unA) return 1 ; public static int f(B unB) return 2 ; public static void main(String[] argv) A unA = new A() ; B unB = new B() ; f(unA) ; f(unB) ; f((A) unB) ;

15

Reponse :

f(unA) retourne 1, f(unB) retourne 2, et f((A) unB) retourne 1. En


` dautres termes, la resolution de la surcharge est faite a la compilation, donc en fonction du type statique des arguments.

16

Exercices : heritage et surcharge

public class A public void f(A unA)

public static void main(String[] argv)

A unA = new A() ; B unB = new B() ; unA.f(unA) ; unB.f(unA) ;

System.out.println(1) ;

unA.f(unB) ; unB.f(unB) ;

class B extends A public void f(B unB)


System.out.println(2) ;

17

Reponse :

unA.f(unA), unA.f(unB), et unB.f(unA) impriment 1 sur la sortie ` standard du systeme. unB.f(unB) imprime 2.

18

public class A public void f(B unB)

public static void main(String[] argv)

A unA = new A() ; B unB = new B() ; unA.f(unA) ; unB.f(unA) ;

System.out.println(1) ;

unA.f(unB) ; unB.f(unB) ;

class B extends A public void f(A unA)


System.out.println(2) ;

19

Reponse : unA.f(unA) provoque une erreur de compilation car il ny a pas de methode ayant ce prol dans la classe A. unA.f(unB) imprime bien evidemment 1, et unB.f(unA) imprime 2. unB.f(unB) est problematique : il y a ambigute sur ` la methode a selectionner.

20

Exercice : liaison statique et liaison dynamique

public class A public int x = 1 ; public int get x()


return x ;

public static void main(String[] argv) A unAA=new A() ; A unAB=new B() ; B unBB=new B() ; unAA.x ; unAB.x ; unBB.x ; ((B) unAB).x ; unAA.get x() ; unAB.get x() ; unBB.get x() ; ((B) unAA).get x() ; ((A) unBB).get x() ;

public class B extends A

public int x = 2 ;

21

Reponse :

unAA.x, unAB.x retournent 1 car le type stratique de unAA, unAB est A


et que la liaison sur les variables est statique. Pour des raisons similaires, unBB.x, ((B) unAB).x retournent 2. La liaison sur les methodes est dynamique, cependant unAA.get x(), unAB.get x(), unBB.get x(), ((B) unAA).get x(), ((A) unBB).get x() retournent respectivement 1, 1, 1, ClassCastException, et 1. En effet, le type statique de this (implicite dans get x()) est A, par consequent get x() retourne toujours 1.

22

Paquetages et modicateurs de visibilite

Relever les erreurs de compilation de lensemble de classes suivant :

package p1 ; class A public int w = 0 ; protected int x = 1 ; return 2 ; private int m()

class B extends A ... A unA = new A() ; p2.C unC() = new C() ; int x = unA.w + unA.x + unA.m() + w + x + m() ; ...

23

package p2 ; import p1 ; class A public class C extends B


... A unA = new A() ; B unB = new B() ; p1.A unAA = new p1.A() ; int y = unAA.x + x + unB.x ; ...

24

Pour la correction de cet exercice, voir les denitions de public, protected, et private.

25

Exercice : modicateurs final et static

Quelle est la difference entre les variables suivantes ?

public public public public public public public public

int x1 = 1 ; static int x2 = 1 ; final int x3 = 1 ; final static int x4 = 1 ; int m1() return 1 ; static int m2() return 1 ; final int m3() return 1 ; final static int m4() return 1 ;

Quelle est la difference entre les methodes suivantes ?

26

` x1 designe une variable dinstance initialisee a 1. x2 est une variable partagee par ` lensemble des instances de la classe (variable de classe), initialis ee a 1. x3 est ` une variable dinstance initialisee a 1 dont la valeur ne pourra pas changer au cours de lexecution (constante dinstance), et x4 est une constante de classe. m1() est une methode dinstance, m2() est une methode dinstance sur laquelle ` le mode de liaison est statique. Labsence de reference a this permet de denir cette methode comme statique, ainsi que le fait quon ne souhaite pas la redenir dans une sous classe : en dautres termes, toute methode static est final, et ` par consequent m4() est equivalente a m2(). m3() est simplement une methode que lon ne souhaite pas redenir dans les sous-classes.

27

Exercice

On souhaite disposer des classes Homme, Femme, Garcon, Fille, de telle sorte que Homme et Femme partagent un protocole commun, lie au fait quil sagit dhumains adultes (ils ont par exemple tous deux un code de securite sociale, mais seul lhomme a un champ moustache), que Garcon et Fille aient un ` protocole commun denfants, que Femme et Fille ait un protocole commun li e a leur feminite, et que tous aient un protocole commun dhumain.
28

Le schema suivant est seulement une proposition. Il peut y avoir un grand nombre de choix (quels protocoles sont denis par des interfaces, des classes abstraites, des classes ?) La seule contrainte est quune classe ou une classe abstraite ne peut heriter que dune seule classe ou classe abstraite.
Humain

Masculin

Feminin

Adulte

Enfant

Homme

Femme

Garcon

Fille

extends implements

class or abstract class interface

29

Ecrire dans une classe auxiliaire, une methode Humain

instHumain(int

age, boolean masc) qui cree une instance adaptee dhumain en fonction de son age et de son sexe.

getClassOf(Humain h) qui utilise le mecanisme des exceptions pour renvoyer la classe de linstance de h.

Ecrire une methode String

30

public Humain instHumain(int age, boolean masc)

if (age < Humain.majorite) if (masc) return new Garcon(age) ; else return new Fille(age) ; else if (masc) return new Homme(age) ; else return new Femme(age) ; public String getClassOf(Humain h) if (h.get age() >= Humain.majorite) try

Homme ho = (Homme) h ; return "Homme" ;

catch (ClassCastException e)

return "Femme" ;

else try

Garcon g = (Garcon) h ; return "Garcon" ;

catch (ClassCastException e)

return "Fille" ;

31

Remarque 1 : on peut supposer que les constructeurs Homme(int

age),

Femme(int age), etc. sont susceptibles de lancer une exception lorsque age est en dessous (ou au dessus) de Humain.majorite. Dans ce cas, il faut
` ` penser a rattraper cette exception, ou a la declarer dans lentete. Remarque 2 : la constante Humain.majorite est denie dans linterface

Humain : public final static int majorite = 18 ;

32