Professional Documents
Culture Documents
Introduction Java
Frdric Voisin
Bibliographie: Anne Tasso: Le livre de Java, premier langage (3me dition), Eyrolles 2006. C. Delannoy: Programmer en Java (Java 5 et 6), Eyrolles, 2007 C. S. Horstmann et G. Cornel : Au cur de Java 2 (JDK 5.0), Vol. 1 Notions Fondamentales Campus Press 2005
Le Marketing Java
Moderne: objet, typ Fiabilit: vrifications dynamiques lexcution (ex: indices de tableaux), gestion transparente de la mmoire alloue (pointeurs) Portable: multi-plateformes (O.S., architectures) Largement disponible ( gratuit ), normalis Multi-usages via de nombreuses bibliothques: IHM, graphique, rseaux, audio, vido, Compatible avec tlchargement dynamique de code (applet, Web) trs mode actuellement : dveloppement multi plateformes (PCs, Internet/Intranet, PDA, PocketPC, mobiles,.) Moins mode (mais aussi utile): au cur de la norme J2EE qui dcrit de nombreux services (JDBC, JSP, )
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 2
IFIPS-FC- 09-10
Un cousin: JavaCard, version restreinte et spcialise pour applications sur cartes puces !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 4
IFIPS-FC- 09-10
javac (sun)
Sun Java (JVM+JRE) Mac Java (JVM+JRE) Windows Java (JVM+JRE) Navigateur Java (JVM+JRE) excution sur une (autre) plateforme arbitraire
6
javac (Linux)
(.class)
javac (windows)
Entres
Module objet
Module objet
Module objet
+ Rapide lexcution, fiable (plus de contrles) excutable - Difficult la mise au point - Problme de diffusion du code: que diffuser ? Les modules source : oblige avoir un compilateur rsultats Les modules objets : trop spcifiques
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 7
Librairies
Entres
Interprte + librairies
- Lent: les instructions sont analyses chaque fois ! - Moins sr en gnral: moins de contrles ou doptimisations + Plus rapide mettre au point + Plus simple de diffuser le code: il suffit davoir un interprteur pour lO.S. et larchitecture
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 8
rsultats
Modules source
Entres
Compilateur (javac)
Module objet
JVM + JRE
Module objet
rsultats
On compile mais dans un format indpendant de lO.S. et de larchitecture, et on interprtera les modules objets
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 9
IFIPS-FC- 09-10
10
IFIPS-FC- 09-10
11
IFIPS-FC- 09-10
12
IFIPS-FC- 09-10
13
Correspondance entre noms de classes (publiques) et noms de fichiers respecter ! Une classe (publique) par fichier !
IFIPS-FC- 09-10
14
Par rapport au langage C: La classe doit tre contenue dans un fichier Accueil.java La fonction main est incluse dans une classe Un seul argument, obligatoire, pour main, de type String[] Le type de retour de main est void Syntaxe dappel dune fonction: destinataire.nom(paramtres)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 15
Compilation / Excution
Unit de base = la classe Un nom de classe dbute par une Majuscule
public class MaClasse { liste non ordonne de attributs dinstances attributs de classe mthodes dinstances mthodes de classes } Mthode : lquivalent des fonctions/procdures
Pas de fonctions et des types sparment comme en C, mais des classes qui regroupent attributs et mthodes ! Tout est toujours dans une classe ! Un fichier peut dbuter par des directives de paquetages
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 16
java Nom-Classe
la JVM recherche dans Accueil.class une fonction den-tete public static void main (String[] args) et lexcute Si une telle mthode nexiste pas = erreur au lancement !
Exception in java.lang.NoSuchMethodError: main
Toute classe avec une telle mthode peut servir lancer une excution.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 17
lnumration des valeurs est faite par indice croissant On ne gre plus lindice de dpart (0), lindice de fin (args.length-1), lincrmentation Moins de chances de se tromper On doit rappeler le type de lobjet manipul (ici String) v parcourt les valeurs, pas les indices !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 19
IFIPS-FC- 09-10
20
Unique structure de donnes : les tableaux ! Le reste correspond des classes (prdfinies)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 21
maVariable peut directement stocker une valeur de type T Exemples: int i, j; int v = 3; // dclarations sans initialisations // dclaration avec initialisation
C maVariable ; o C est une classe maVariable ne peut pas stocker un objet de classe C mais une rfrence sur un objet de classe C. Lobjet doit tre allou par ailleurs. Plusieurs rfrences peuvent dsigner le mme objet Exemples: Point2D p = new Point2D Point2D p; // p ne rfrence rien ! Point2D(); p2 = new Point2D(); // dclaration et initialisation p3 = p2; // p2 et p3 rfrencent le mme objet
Frdric Voisin - Introduction Java 22
IFIPS-FC- 09-10
Mme rgle que pour les classes: monTableau est une rfrence sur un tableau, mais pas directement un tableau. Le tableau doit tre explicitement allou. la dimension du tableau nest pas donne lors de la dclaration, mais lors de lallocation du tableau ! la dimension du tableau peut tre une expression int t[3]; // incorrect ! int[] t; // correct mais t ne rfrence rien t[2] = 5; // syntaxiquement correct mais erron int[] t = new int[3]; // correct t[2] = 5; // correct Point2D[] t2 = new Point2D[3]; // correct t2 reprsente un tableau de rfrences sur des instances de Points2D et non pas directement un tableau dinstances Point2D t2[2] = new Point2D();
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 23
non static : sadressent une instance // cre une reprsentation de linstance en question public String toString(){ particulire return "(" + x + ", " + y + ")" ; } public double abscisse() { return x; } public double ordonne() { return y; }
IFIPS-FC- 09-10
25
Point2D (2/3)
Un constructeur est une mthode qui a le nom de la classe et pas de type de retour. Il sert initialiser les objets, leur cration. Lappel est automatique. On peut dfinir plusieurs constructeurs qui diffrent par leurs paramtres.
public Point2D(double monX, double monY) { x = monX; y = monY; } public Point2D() { x = 0.0; y = 0.0; }
// utilise des valeurs par dfaut
Point2D (3/3)
private static Point2D theOrigin = new Point2D(0.0, 0.0); public static Point2D getOrigin() { return new Point2D(Point2D.theOrigin.x, Point2D.theOrigin.y); } } // fin de la classe Point2D
non static : chaque point a ses propres attributs x et y. static : il existe un unique attribut theOrigin, rattach la classe. non static : symetrique() est applicable un objet, pas une classe. ex: Point2D.theOrigin.abscisse() static : getOrigin(), est applicable la classe.
Il manque une mthode pour tester lgalit de deux instances de Point2D: deux points sont gaux sils ont mmes coordonnes! On verra plus tard comment la programmer
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 27
public class TestePoint2D { public static void main(String[] args) { Point2D p = new Point2D(12.0, 23.0); Similaire mais System.out.println(p.toString()); application du p.move(-5.0, 2.0); second System.out.println(p.toString()); constructeur Point2D p2 = new Point2D(); Point2D p3 = new Point2D(12.0, 23.0); Point2D p4 = new Point2D(12.0, 23.0); System.out.println(p3.symetrique().toString()); p4.retourne(); System.out.println(p4.toString()); p2 = Point2D.getOrigin(); System.out.println(p2.toString()); } } On ne dit pas do vient Point2D : pas de #include la C.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 28
new Point2D(12.0, 23.0): Cration dune instance, application du constructeur, renvoi de la rfrence
Cercle (2/2)
// pow (power): puissance . Mthode static de Math. // sqrt (square root) : racine carre public boolean appartient(Point2D p) { double dx = Math.pow(p.abscisse() centre.abscisse(),2.0); double dy = Math.pow(p.ordonnee() centre.ordonnee(),2.0); return Math.sqrt(dx + dy) <= rayon; } } // Fin de Cercle Deux erreurs classiques : double dx = Math.pow(p.x centre.x,2.0); // KO ! double dx = pow(p.abscisse() centre.abscisse(),2.0); // KO !
IFIPS-FC- 09-10
30
Pile :
appels de mthodes, paramtres, var. locales,
Tas :
instances
Ce qui a une dure de vie limite et connue est stock dans la pile et gr automatiquement (allocation/libration) Ce qui a une dure de vie non dtermine est stock sur le tas, allou explicitement et libr implicitement (en Java)
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 31
IFIPS-FC- 09-10
32
23 12 7 -5
33
miette
le systme gre un ramasse-miettes pour les objets qui ne sont plus rfrencs
-3 7 -5
2 monC = monC3;
monC3 monC2 monC
IFIPS-FC- 09-10
34
if (monC == monC2) // galit de rfrences: true if (monC == monC4) // false On a souvent besoin dune autre galit (equals) : if (monC4.equals(monC2)) { } Par dfaut, == et equals concident, mais chaque classe pourra redfinir equals si besoin Pour les valeurs, seul loprateur == existe ! Mme problme de choix entre affectation ou copie dobjets (clonage) !
IFIPS-FC- 09-10
35
1
3.0 5.0 7.0
4 5.0 5
2.0
2
p2
c p
36
25 13
? ? ?
maTable
37
25 13
t2 = t; // OK (en Java; pas en C ou C++) ! // t2 rfrence maintenant un tableau de // 2 entiers. int[3] t; // incorrect syntaxiquement int t[3]; // aussi incorrect Pour accder la dimension (courante), utilisez t.length
12 6 -1
t2
IFIPS-FC- 09-10
38
IFIPS-FC- 09-10
39
Exemple:
ArrayList<Point2D> liste = new ArrayList<Point2D>(); liste.add(new Point2D(3.0, 5.0); liste.add(new Point2D()); for(Point2D p : liste) { } // parcours de toute la collection
Les variables static sont accessibles laide du nom de la classe ou de lintrieur des mthodes (classes ou instances) de la classe final pour dire quun attribut ne change pas de valeur (constante) En gnral, les attributs ne sont pas public
IFIPS-FC- 09-10
41
dans le corps de la mthode : on peut accder aux attributs dfinis par la classe. on peut dsigner le receveur du message par this on peut omettre this pour laccs aux attributs ou aux mthodes : x est quivalent this.x f() est quivalent this.f()
IFIPS-FC- 09-10
42
IFIPS-FC- 09-10
43
Les constructeurs
syntaxe : pas de type de retour (mme pas void) le nom de la mthode est celui de la classe Ils servent initialiser les instances la cration: lappel new lance automatiquement le constructeur correspondant aux paramtres fournis. Erreur la compilation si aucun constructeur nest appelable (visibilit, paramtres), compte-tenu des constructeurs existants si une classe ne dfinit pas de constructeur, le systme fournit un constructeur par dfaut, sans argument si une classe dfinit au moins un constructeur, il nexiste plus de constructeur par dfaut implicite (mais on peut dfinir un constructeur sans paramtre qui en tiendra lieu!)
IFIPS-FC- 09-10
44
Classes et Hritage
Dfinir une nouvelle classe par extension ou spcialisation dune classe existante, en nen donnant que ce qui diffre. class SousClasse extends SuperClasse { + gnrale SuperClasse }
+ spcifique, + riche
SousClasse
les instances de SousClasse sont vues comme tant aussi des instances de SuperClasse, utilisables partout o on attend une instance de la super-classe
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 46
IFIPS-FC- 09-10
47
Un attribut ou une mthode private de la super-classe nest pas visible des sous-classes : il est prsent mais pas rfrenable par les mthodes de la sous-classe. Les membres rfrenables par les sous-classes sont ceux qui ont une visibilit public ou protected. Lhritage est une relation transitive !
IFIPS-FC- 09-10
48
IFIPS-FC- 09-10
49
IFIPS-FC- 09-10
50
Pour quune mthode de la sous-classe en redfinisse une autre, elle doit conserver la mme liste de paramtres.
IFIPS-FC- 09-10
52
Hritage et typage
Partout o on attend une Figure, on peut utiliser un Cercle :
public void f(Figure fig) { fig.effacer(); fig.move(12, 24); // correct, toujours dfini fig.dessiner(); Cercle c = new Cercle(); c.move(12, 24); // correct, toujours dfini fig = new Cercle();// correct, mais pour le compilateur // fig reste toujours une Figure arbitraire ! fig.rayon = 12; // KO c = fig; // KO ! que vaut c.rayon si fig tait une figure arbitraire ? } f( new Cercle() ); f( new Rectangle() ); // OK !
Ces conversions implicites vers Figure sont acceptes silencieusement par le compilateur et ne peuvent pas chouer !
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 53
Diagramme
ArrayList<ObjGraph> elements dessiner() ajouter(ObjGraph) supprimer(ObjGraph)
Cercle
Rectangle
dessiner()
dessiner()
IFIPS-FC- 09-10
55
Exemple 2 (suite)
Diagramme d = new Diagramme(); Point2D p = new Point2D(0,0); d.ajouter(new Cercle(p, Math.Pi)); d.ajouter(new Rectangle(p, 3.0, 5.0)); Diagramme d2 = new Diagramme(); d2.ajouter(d); d2.ajouter(new Cercle(p, 5.0)); d2.dessiner(); public void dessiner() { for(ObjGraph o: elements) { o.dessiner(); } } // dans Diagramme // quelle dessiner() ??
Exemple 2 (fin)
La classe ObjGraphique (de mme que Figure) ne sert qu donner un cadre (type) commun aux sous-classes et dclarer les mthodes qui devront tre redfinies (notion de classes et mthodes abstraites) Rien nempche une classe abstraite davoir aussi des mthodes concrtes Dynamiquement, il nexiste que des instances des classes concrtes (Diagramme, Cercle, Rectangle) On na pas besoin de savoir la classe relle de lobjet sur lequel on travaille, du moment quil dispose des bonnes mthodes
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 57
La visibilit protected
public class C { protected int val; private int v2; } public class C2 extends C { public void f(C arg, C2 arg2) { this.val = 1; // OK (val est protected) this.val2 = 0; // KO (val2 est private) arg2.val = 1; // OK (val est protected, arg2 de classe C2) arg.val = 1; // KO (arg est de classe C, pas C2) } }
IFIPS-FC- 09-10
58
Hritage et constructeurs
Les constructeurs ne sont pas hrits mais il existe un protocole pour effectuer les initialisations en cascade en remontant la hirarchie de classes dans Figure:
protected Figure(Point2D p) { origine = p; }
dans Rectangle:
public Rectangle(Point2D p, double long, double larg) { super(p); // Premire instruction ! longueur = long; largeur = larg; }
Mthodologiquement un constructeur ne devrait soccuper que des attributs dfinis son niveau.
IFIPS-FC- 09-10 Frdric Voisin - Introduction Java 59
IFIPS-FC- 09-10
60
IFIPS-FC- 09-10
61
Hritage ou Composition
Il existe deux moyens de rutiliser une classe :
par hritage (Cercle hrite de Figure) par composition : avoir comme attribut un objet dune autre classe, comme Point2D qui est utilise dans Figure.
Les deux moyens ont des usages diffrents ! Autre exemple: dfinition de points colors :
???
Couleur laCouleur; }
62
Hritage ? Seulement si
on veut rendre accessibles toutes les mthodes (non protected) de la super-classe les structures sont compatibles (nombre et type des champs)
IFIPS-FC- 09-10
63
IFIPS-FC- 09-10
64
IFIPS-FC- 09-10
65
IFIPS-FC- 09-10
67
class Point2D public boolean equals(Object P) public boolean equals(Point2D P) class PointColore public boolean equals(Object P) public boolean equals(Point2D P) public boolean equals(PointColore P)