Vous êtes sur la page 1sur 170

Programmation Oriente Objet

Java
1

Table des matires


I.
1. 2. 3. 4.

Prsentation
Notion Notion Notion Notion dobjet de classe dencapsulation dhritage

II. III. IV. V.

Premier programme Java Les types primitifs de Java Les oprateurs Les instructions de contrle

VI.
1. 2. 3. 4. 5. 6. 7.

Les classes et les objets


Rgle dcriture des mthodes Notion de classe Notion de constructeur Accesseurs et modificateurs Affectation et comparaison dobjets Surdfinition ou surcharge Variables et mthodes de classe

VII.
1. 2. 3. 4. 5. 6. 7.

Les tableaux
Dclaration Dclaration avec initialisation Utilisation d'un tableau La taille d'un tableau Exercices Passage des paramtres Les tableaux d'objets

VIII. IX.

Les chanes de caractres Lhritage


3

I. Prsentation
Quest-ce que java ? Java est un langage de programmation Java est aussi une plateforme
La plateforme java, uniquement software, est excute sur la plateforme du systme dexploitation Elle est constitue de :
La Java Virtual Machine (JVM) Des interfaces de programmation dapplication (API)

Atouts de Java
Langage de programmation simple ; Orient objet ; Comporte un grand nombre dobjets prdfinis pour lutilisateur ; Neutre architecturalement ( = portabilit ) ; Distribu gratuitement !!!
5

Neutralit architecturale
Un programme Java est compil puis interprt.
MonProgramme.java

Compilateur JAVA

MonProgramme.class

Mac(JVM)

Windows(JVM)

Unix(JVM)

Historique du langage
1991 : dveloppement de OAK
Langage simple, portable et orient objets Pour la programmation de petits appareils lectromnagers Emprunte la portabilit du Pascal (VM) et la syntaxe du C++
7

Historique du langage
1995 : intgration de la JVM dans Netscape
OAK tant un nom dpos, le projet sappellera JAVA Apparition des Applets qui ont fait le succs de Java (remplacs aujourdhui par Flash)

Historique du langage
Dcembre 98 : SUN annonce une nouvelle dnomination pour ses produits Java :

Plate-forme Java 2
Version actuelle : J2SE 6

Historique du langage
Pourquoi Java ?

10

En programmation oriente objet, il y a 4 notions fondamentales :


les objets ; les classes ; l'encapsulation des donnes ; l'hritage ;

11

1. Notion dobjet
Objet = unit autonome qui a ses propres donnes et un ensemble de procdures qui agissent sur ces donnes ;

12

1. Notion dobjet
a) les donnes
Une voiture a des donnes concernant sa couleur, sa marque, En terme de programmation, les donnes sont stockes dans des variables. Si nous reprsentons plusieurs voitures, chacune aura ses propres variables. (*)
13

1. Notion dobjet
b) les comportements
Pour accder aux donnes, il faut prvoir un ensemble de comportements, ils constitueront une interface entre lobjet et les programmes. Exemples de comportement : acclrer, freiner, tourner(gauche), tourner(droite),

14

1. Notion dobjet
En jargon orient objet, on dira que : - les donnes sont les attributs dun objet ; - les comportements sont les mthodes de lobjet ;

15

2. Notion de classe
Les objets sont dfinis par des classes ; Une classe est le moule dun objet ; On peut crer plusieurs objets partir dune seule classe. (*)
16

2. Notion de classe
En jargon orient objet, on dira : un objet est une instance dune classe

17

3. Notion dencapsulation
Soit un lecteur Mp3, il nest pas ncessaire de connatre son fonctionnement interne pour pouvoir lutiliser. Lutilisateur se sert uniquement de son interface (boutons, cran, couteur,) Les objets en POO doivent fonctionner de la mme manire.
18

3. Notion dencapsulation
Lorsquun objet est parfaitement crit, lutilisateur ne peut accder directement aux donnes ; Il doit passer par les mthodes qui servent dinterface entre lobjet et ses utilisateurs ;

19

3. Notion dencapsulation

20

4. Notion dhritage
L'hritage est une technique qui permet de crer une nouvelle classe partir d'une classe existante. La sous-classe hrite des caractristiques de la classe de base. Intrt : pouvoir dfinir de nouveaux attributs et mthodes pour la sous-classe, qui viennent s'ajouter ceux et celles hrits. (*)
21

II. Premier programme JAVA


public class PremProg { public static void main (String args[]) { System.out.println ("Premier programme Java") ; } }

22

III. Les types primitifs de Java


( = types de base)

23

Les types entiers

24

Remarque : Pour obtenir ces valeurs on peut faire appel aux constantes prdfinies Byte.MIN_VALUE, Byte.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE, etc

25

Les types flottants

26

Le type caractre

char

2 octets

code universel Unicode

27

Le type boolen

boolean

valeur logique true ou false

Exemple d'initialisation :

boolean condition ; condition = n > p ;

28

Initialisation de variable
int n = 5 ; int n ; n = 5 ; int duo = 2 * n ;

En Java, une variable doit tre initialise avant d'tre utilise (sinon erreur de compilation).

29

Les constantes
final int N = 20 ; final int N = 2 * p ; final int N ; N = Clavier.lireInt () ; // Premire affectation : OK N=N+1; // 2me affectation : erreur de compilation

30

IV. Les oprateurs

31

Oprateurs arithmtiques
+ * / % addition soustraction multiplication division modulo, reste de la division sur entiers ou flottants

32

Priorits des oprateurs (en ordre dcroissant)


+ * + / unaires % de droite gauche de gauche droite de gauche droite

Pour changer la priorit : insrer des parenthses

33

Il y a conversion implicite dans l'valuation des expressions arithmtiques ; Elle tient compte de la priorit des oprateurs ; Peut se faire condition de ne pas dnaturer la valeur initiale :
int long float double

Exemple : n * p + x ; (avec n int, p long et x float)

Oprateurs relationnels
< <= > >= == != infrieur infrieur ou gal suprieur suprieur ou gal gal diffrent
36

Oprateurs logiques
! & ^ | && || ngation et ou exclusif ou inclusif et avec court-circuit ou inclusif avec court-circuit

37

Fonctionnement des oprateurs de court-circuit (&& et ||)


La 2me condition nest value que si cest indispensable pour valuer la condition complte Exemple:
if (n!=0 && trouv==true)
// si n=0, la suite nest mme pas value => plus rapide !
38

Oprateurs dincrmentation
++ pr ou post-incrmentation

--

pr ou post-dcrmentation

Oprateur gauche de son oprande : on incrmente ou dcrmente d'abord ; Oprateur droite de son oprande : on incrmente ou dcrmente aprs ;
39

Exemples
a = ++ i ; a = i ++ ;
// // i=i+1; a=i; a=i; i=i+1;

tab[i++] = Clavier.lireInt() ;
// garnit tab[i] puis incrmente i

i ++ ; ++ i ;

// sont 2 instructions quivalentes


40

Oprateurs daffectation largie


Java permet de condenser les affectations. Exemples : a=a+b; n=n*v; devient devient a += b ; n *= v ;

41

Loprateur de CAST
Si a et b sont de type float, et n de type entier : n=a/b; donne une erreur de compilation "possible loss of precision - found float - required int"

42

Pour forcer la conversion de l'expression en entier, on utilise un oprateur nomm cast. n = (int) (a / b) ; Que pensez-vous de ceci ? n = (int) a / b ; Nouvelle erreur de compilation

Remarque : le cast (la conversion) est possible galement vers les autres types de donnes numriques

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;

Instructions valides ???

45

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;

Instructions valides ???

// oui

46

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;

Instructions valides ???

// oui // non (expression : double)

47

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ;

Instructions valides ???

// oui // non (expression : double) // non (expression : float)

48

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ; // // // //

Instructions valides ???

oui non (expression : double) non (expression : float) oui


49

Exercice
int a = 1 , b = 2 ; float f = 5.5f ; double d = 8.4 ; f=a+b; a = b * 2.5 ; a = (int) d + f ; d=a*f; f = a + (int) d ; // // // // //

Instructions valides ???

oui non (expression : double) non (expression : float) oui oui


50

Rfrences pour les logiciels


www.telecharger.com pour Textpad http://java.sun.com pour J2SE

51

V. Les instructions de contrle

52

Les alternatives
Instruction "if"
if (condition) { instr1 ; instr2 ; } else { instr3 ; instr4 ; }

53

Les alternatives
Instruction "switch"
switch (expression) { case const-1 : instr1 ; instr2 ; ; break; case const-2 : instr3 ; instr4 ; ; break; default : instr5 ; instr6 ; ; }
54

Les alternatives
Exemple
switch (mois) { case 1 : case 2 : case 3: case 4 : case 5 : case 6 : System.out.println ("Premier semestre") ; break ; case 7 : case 8 : System.out.println ("Vacances") ; break ; default : System.out.println ("Fin de l'anne") ; }

55

Les rptitives
Instruction "do while"
do { srie d'instructions ; } while (condition) ; On excute 1 fois la srie d'instructions avant de vrifier la condition !!!
56

Les rptitives
Instruction "while"
while (condition) { srie d'instructions ; } On vrifie la condition avant d'entrer dans la rptitive !!!
57

Les rptitives
Instruction "for"
for ( initialisations ; condition ; incrmentations ) { srie-d'instructions ; }

58

Les rptitives
Exemple 1 int i ; for ( i = 1 ; i < 4 ; i++ ) System.out.println ( "Passage " + i) ; System.out.print ( "I vaut " + i ) ;

Que donnera l'affichage ?


59

Les rptitives
Exemple 2 int i ; for ( i = 6 ; i > 0 ; i -= 2 ) { System.out.print ( "Valeur " ) ; System.out.println ( i ) ; }

Que donnera l'affichage ?


60

Exercices
Afficher les annes jusqu'en 2500. bissextiles d'aujourd'hui

Remarque : une anne est bissextile si elle est multiple de 4 mais pas multiple de 100. Rsoudre cet exercice 1) avec for ; 2) avec while ; 3) avec do while ;
61

Les rptitives
Instruction "break"
-

Break peut tre utilise dans une rptitive pour sortir prmaturment ; Exemple : Calculer la somme de maximum 10 nombres entrs au clavier ou s'arrter avant si on entre 0

62

Les rptitives
int i, n, som ; for ( i=1, som=0 ; i <= 10 ; i++ ) { n = Clavier.lireInt() ; if ( n == 0) break ; // Ce break nous branche som += n ; } // ici System.out.print( "Somme des " + (i-1) + " nb = " + som) ;

63

Les rptitives
Instruction "break" avec tiquette
-

Dans le cas de rptitives imbriques, break fait sortir de la boucle la + interne ; Pour sortir de + d'un niveau, on utilisera le break avec tiquette :

64

Les rptitives
Instruction "break" avec tiquette
boucle : while () { for () { break boucle ; // Ce break nous branche } } // ici cette fois

65

Les rptitives
Instruction "continue"

continue permet de passer prmaturment au tour de boucle suivant ;

66

Les rptitives
Exemple
int i ; for ( i = 1 ; i <= 5 ; i++ ) { System.out.println (i) ; if ( i < 4 ) continue ; System.out.println ("Fin " + i) ; } System.out.println ("Fin de boucle") ;

Qu'affichera cette squence d'instructions ?


67

Les rptitives
Solution
1 2 3 4 Fin 4 5 Fin 5 Fin de boucle

68

Les rptitives
Instruction "continue" avec tiquette
-

Dans le cas de rptitives imbriques, continue concerne la boucle la + interne ; Pour descendre de + d'un niveau il y a le continue avec tiquette :

69

Les rptitives
Instruction "continue" avec tiquette
boucle : while (...) { for () { continue boucle ; // Ce continue fait poursuivre } } // la boucle ici

70

Consigne pour le laboratoire :


La classe Clavier sera utilise rgulirement Conseil : la stocker dans un dossier au choix et mentionner le chemin du dossier dans une variable d'environnement appele 'Classpath' Marche suivre : Paramtres /Panneau de configuration / Systme / Avanc / Variables denvironnement

71

Dmonstration
Nouvelle variable Classpath avec le chemin du dossier qui contient la classe Clavier et le point qui dsigne le rpertoire courant

72

VI. Les classes et les objets

73

1. Rgle d'criture des mthodes


a) Mthodes ne fournissant aucun rsultat Certaines mthodes effectuent des actions et ne renvoient pas de valeur.
74

Syntaxe
static void nom-mthode ( liste d'arguments ) { instructions ; }

Appel

nom-mthode ( arg1, arg2, ) ;

Quelques exemples :

Mthode qui affiche "Bienvenue au cours de Java".


public class Exemple1 { static void bienvenue( ) { System.out.println("Bienvenue au cours de Java") ; } public static void main (String args[]) { bienvenue( ) ; } }

Mthode qui affiche "Tu as (n) ans" en ayant reu en argument une anne de naissance.
public class Exemple2 { static void afficheAge(int anaiss) { int age = 2007 - anaiss ; System.out.println("Tu as " + age + " ans") ; } public static void main (String args[]) { afficheAge(1983) ; } }

b) Mthodes fournissant un rsultat

Mthodes qui effectuent des actions et renvoient une valeur.

78

Syntaxe static type nom-mthode (liste d'argument ) { instructions ; return ; } Appel


= nom-mthode (arg 1, arg2, ) ;

Exemple :

Mthode qui calcule la somme de 2 entiers reus en arguments.


public class Exemple3 { static int somme ( int a, int b ) { int calcul = a + b ; return calcul ; }

public static void main (String args[]) { int resultat = somme (22, 8) ; ... } } // rsultat rceptionn dans une variable...

2. Notion de classe
public class NomDeClasse { // Attributs et mthodes de la classe }

81

Exemple : soit une classe Point, destine manipuler les points d'un plan.

- Un objet de type Point sera reprsent par 2 coordonnes entires : x et y (= attributs) ;

Il disposera aussi des 3 mthodes suivantes :

- initialise : attribue les valeurs de dpart aux coordonnes du point ; - deplace : modifie les coordonnes du point; - affiche : affiche les coordonnes du point;

En notation UML, le diagramme de classe se prsenterait comme ceci :


Nom de la classe Attributs

Point - x : integer - y : integer + void initialise (integer, integer) + void deplace (integer, integer) + void affiche ()

Mthodes

class Point { private int x ; // abscisse private int y ; // ordonne public void initialise (int abs, int ord) { x = abs ; y = ord ; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Mes coordonnees:" + x + " " + y) ; } } (*)

Cette classe Point sert instancier (= crer) des objets de type Point et leur appliquer volont les mthodes disponibles ; Pour faire appel une mthode de la classe : objet.mthode()

Nous pouvons utiliser la classe Point depuis la mthode main d'une autre classe ;

public class TstPoint { public static void main (String args[]) { Point a ; a = new Point() ; a.initialise(3, 5) ; a.affiche() ; a.deplace(2, 1) ; a.affiche() ; Point b = new Point() ; b.initialise(6, 8) ; b.affiche() ; } }

Que donnera l'excution de la classe TstPoint ?

3. Notion de constructeur

Dans la classe Point, il faut toujours commencer par la mthode 'initialise' ; Peu pratique ;

89

Un constructeur automatise ce mcanisme d'initialisation ; Il est automatiquement appel lorsqu'on instancie un objet de la classe ; En Java, il porte le mme nom que la classe ;

Constructeur qui remplace la mthode 'initialise' public Point (int abs, int ord) { x = abs ; y = ord ; }

Changements dans la classe TstPoint


La commande suivante ne convient plus : Point a = new Point( ) ; Refuse par le compilateur : la cration d'un objet fait appel au constructeur. Celui prvu requiert 2 arguments, la commande devient : Point a = new Point (3, 5) ;

Autre changement

Il n'est plus ncessaire maintenant de faire appel la mthode initialise On obtient donc :

public class TstPoint { public static void main (String args[]) { Point a = new Point(3, 5) ; // Cette commande fait appel au constructeur... a.affiche( ) ; a.deplace(2, 1) ; a.affiche( ) ; Point b = new Point(6, 8) ; b.affiche( ) ; } }

Rgles concernant les constructeurs

Un constructeur ne renvoie aucune valeur, aucun type ne doit figurer devant son nom, pas mme void ; Lorsqu'une classe ne comporte pas de constructeur, Java considre un constructeur vide sans arguments ;

95

Rgles concernant les constructeurs

Un constructeur doit tre dclar 'public' ; Contrairement aux variables dclares dans un 'main', les champs d'un objet sont initialiss par dfaut : une boolenne false une donne numrique 0 un char vide
96

La cration d'un objet (commande 'new') s'effectue en 3 phases :

1) attribution de l'espace mmoire 2) appel du constructeur 3) renvoi de la rfrence de l'objet cr

4. Accesseurs et modificateurs
Java permet plusieurs types d'accs pour les attributs, mthodes et constructeurs d'une classe :
private : accessible uniquement ds la classe courante ; public : accessible dans toutes les classes ; (nant) : accessible par les classes du mme package ;
98

Protection des attributs d'un objet


Autant que possible, les attributs doivent tre 'private' ; Pour autoriser la lecture d'une variable, on lui associe un accesseur, d une mthode qui renvoie la valeur de la variable (exemple: getNom pour lire l'attribut nom) ; Pour autoriser la modification d'une variable, on lui associe un modificateur, d une mthode qui permet la modification tout en contrlant sa validit (exemple : setDate pour initialiser l'attribut date) ;

Exemple

Soit une classe 'Anne' qui contient un attribut entier 'an' ; Prvoir un constructeur qui initialise 'an' ; Prvoir un modificateur pour permettre par la suite la modification de l'attribut avec un contrle de validit (valeur comprise entre 1950 et 2007) ; Prvoir un accesseur pour permettre la lecture de son contenu ;

public class Annee { private int an; public Annee (int newAn) { an = newAn; } public void setAn (int newAn) { if (newAn >= 1950 && newAn <= 2007) an = newAn; } public int getAn () { return an; } }

public class TestAn { public static void main (String args[]) { An a ; a = new An(1987) ; System.out.println (An : + a.an); // erreur car an est private System.out.println (An : + a.getAn()); // OK car getAn() est public } }

5. Affectation et comparaison d'objets


Comme vu prcdemment, les variables de type classe contiennent des rfrences sur des objets ; Lorsqu'une affectation porte sur une variable de type classe, c'est la rfrence qui change et non l'objet lui-mme !!!

103

Exemple : Soit la classe Point qui possde un constructeur 2 arguments. Point a, b ; a = new Point (3, 5) ; b = new Point (2, 0) ; Aprs excution, on obtient en mmoire (*)

Si on veut tester si ces points sont gaux: if (a == b) // NON car on teste les adressesmmoires des objets ! If (a.getX()==b.getX() && a.getY()==b.getY()) // en supposant quon ait cr des mthodes accesseurs

Si on excute l'instruction : a=b; c'est la rfrence de a qui devient la rfrence de b ;

a et b dsignent donc le mme objet et il n'y a plus aucune rfrence vers le premier objet !!!

Il n'existe pas d'instruction qui permet de librer l'espace inutilisable car Java dispose d'un mcanisme de gestion automatique de la mmoire :

le GARBAGE COLLECTOR

Le garbage collector est une tche de la JVM qui :


travaille en arrire-plan ; libre la place occupe par les instances non rfrences ; compacte la mmoire occupe ;

Il intervient :
quand le systme a besoin de mmoire; ou, de temps en temps avec une priorit faible ;

6. Surdfinition ou surcharge
On parle de surcharge lorsque plusieurs constructeurs ou mthodes portent le mme nom ; Dans ce cas, c'est la signature de la mthode qui permet au compilateur de faire la diffrence (= nombre et type d'arguments) ;

109

Exemple 1 : Surcharge de constructeur de la classe Point.


public class Point { private int x, y ; public Point (int abs, int ord) { x = abs ; y = ord ; } public Point () { x=0; y=0; } }

// Variables encapsules // Constructeur

// 2me constructeur

Lors de l'instanciation : Point a = new Point ( ) ; // Fait appel au 2me constructeur Point b = new Point (4, 6) ; // Fait appel au 1er constructeur

Exemple 2 : Surcharge de la mthode "deplace" de la classe Point.


public void deplace ( int dx, int dy ) { x += dx ; y += dy ; } public void deplace ( int dx ) { x += dx ; } // deplace (int, int)

// deplace (int)

Lors de l'excution : Point a = new Point ( ) ; a.deplace(5) ; // Appelle deplace(int) a.deplace(2, 2) ; // Appelle deplace(int, int)

Nous avons dj rencontr la surcharge dans la classe Math

http://java.sun.com/

114

7. Variables et mthodes de classe


a)

Les attributs existent dans chacune des instances de la classe. On les appelle des variables d'instance. Soit la classe : class A { int n; float y ; }

Avec :

A a1 = new A( ) ; A a2 = new A( ) ;
115

On obtient le schma suivant : objet a1 n y n y |___| |___| |___| |___|

objet a2

116

Java permet de dfinir des variables de classe, elles n'existeront qu'en un seul exemplaire, quel que soit le nombre d'objets instances de la classe ; Il suffit de les dclarer avec l'attribut 'static' ; Exemple : classe avec un champs statique destin contenir le nombre d'objets dj crs ;
117

class Obj { public Obj() { nb++ ; System.out.println ("Il y a " + nb + " objet(s)") ; } private static int nb = 0 ; } public class TstObj { public static void main (String args[ ]) { Obj a ; a = new Obj( ) ; Obj b = new Obj( ) ; Obj c = new Obj( ) ; } Qu'affichera ce programme ? }
118

b) De manire analogue, certaines mthodes peuvent avoir un rle indpendant d'un quelconque objet ; Une telle mthode est dite mthode de classe ; Elle ne pourra agir que sur des variables de classe, puisque par nature elle n'est lie aucun objet en particulier ;

119

class Obj { public Obj( ) { nb++ ; }

// Constructeur

// Mthode de classe : statique public static int nbObj () { return nb ; } private static int nb = 0 ; }
120

public class TstObj2 { public static void main (String args[]) { Obj a = new Obj() ; Obj b = new Obj() ; Obj c = new Obj() ; System.out.print ("Nbre d'objets = " + Obj.nbObj( ) ) ; /* Ici pour faire appel la mthode nbObj, on ne mentionne pas un nom d'objet particulier car la mthode est statique... on l'appelle avec Obj.nbObj() !!! */ } }
121

Pour faire appel une variable de classe ou une mthode de classe, il n'est pas ncessaire d'instancier un objet de la classe concerne, il suffit de mentionner : NomDeClasse.VariableDeClasse ou NomDeClasse.MthodeDeClasse( ) ;

122

En notation UML, le diagramme de classe de la classe Obj se prsenterait comme ceci :

Obj -$ int nb=0 + Obj () +$ int nbObj ()

Nom de la classe Attributs

Mthodes

123

Vous avez dj, au cours des labos prcdents, manipul des variables et des mthodes statiques sans vous en rendre compte Avez-vous une ide desquelles ? (*)
124

Exercices
1) Parmi les attributs suivants de la classe Renault Espace, la version avec toutes les options possibles, distinguez ceux que vous dclareriez comme statiques des autres : vitesse nombre de passagers vitesse maximale nombre de vitesses capacit du rservoir ge prix couleur
125

2)

Une erreur s'est glisse dans le code suivant, laquelle ? class Test { int a ; Test (int b) {a=b;} } public class PrincipalTest { public static void main (String args[]) { Test unTest = new Test ( ) ; } }
126

3)

Une erreur s'est glisse dans le code suivant, laquelle ? class Test { int a ; int c ; public Test (int b) {a=b;} public static int getC() { return c ; } } public class PrincipalTest { public static void main (String args[]) { Test unTest = new Test (5) ; } }
127

VII. Les tableaux


En Java, ce sont des objets ; Il faut donc utiliser des mthodes pour y accder ; Le 1er lment a pour indice 0 ;

128

1. Dclaration
type nom-du-tableau [ ] ; type [ ] nom-du-tableau ; // Pas de dimension !!!

Les lments d'un tableau peuvent tre de type primitif ou de type objet ; Exemples : int tab[ ] ; Point tabPoints[ ] ;

129

On cre un tableau comme on cre un objet : avec l'oprateur "new"

int tab[] ; tab = new int [5] ;

/* rfrence un tableau de 5 entiers */

On peut excuter les 2 instructions en 1 fois : int tab[ ] = new int [5] ;

2. Dclaration avec initialisation


int tab1[] = {1, 8, 5, 6} ; int tab2[] = {n, n+2} ; char tab3[] = {'a', 'b', 'c'} ;
// tableau de 4 entiers // tableau de 2 entiers // tableau de 3 caractres

La notation {} ne peut tre utilise que lors de la dclaration, par la suite il faut initialiser les lments un par un

131

3. Utilisation d'un tableau


tab[0] = 15 ; tab[2]++ ;
// place 15 dans le 1er lt // incrmente le 3me lt // affiche le 5me lt

System.out.print (tab[4]) ;

Remarque : Si la valeur de l'indice est incorrecte, on obtient une erreur d'excution ;


132

4. La taille d'un tableau


La variable 'length' retourne le nombre d'lments d'un tableau ; Exemple : Parcours d'un tableau
for (i = 0 ; i < tableau.length ; i++) { }

Remarque : on crit tableau.length sans parenthses car length est un champs public de l'objet tableau et non une mthode
133

5. Exercices
Que donne l'excution du code suivant ?
public class Affectation { public static void main (String args[]) { int i ; int t1[] = {1, 2, 3} ; int t2[] = new int[5] ; for (i=0 ; i<5 ; i++ ) t2[i] = 2*i ; t2 = t1 ; for (i=0 ; i<t2.length ; i++) System.out.println (t2[i]) ; } }
134

Quelles sont les erreurs commises ici ?


public class Erreurs { public static void main (String args[]) { final int n = 10 ; int t1[] = { 1, 3, 5 } ; int t2[] ; t2 = { 5, 8, 3 }; float t3[] = { 2, 3.5, 4 } ; double t4[] = { 2, 3.5 , 4, n++ } ; } }

6. Passage des paramtres


a) Lorsqu'on transmet une variable de type primitif en argument, on envoie en fait une copie de la valeur de la variable (=passage par valeur) :
public class TransmPrimitif { public static void main(String[] args) { int i = 5 ; modifVariable(i) ; System.out.println("Aprs la procdure : " + i) ; } static void modifVariable(int k) { System.out.println("Avant la modif : " + k) ; k = 10 ; System.out.println("Aprs la modif : " + k) ; } }
136

Laffichage donnera :

Avant la modif : 5 Aprs la modif : 10

(k est garnie avec la valeur reue en argument)

(on a modifi le contenu de la variable locale k qui est dtruite en sortant de la procdure)

Aprs la procdure : 5 (la variable dorigine na pas boug)

137

b)

Lorsqu'on transmet un tableau en argument, on envoie la rfrence du tableau (= son adresse), la mthode agit alors directement sur le tableau concern et non sur une copie (=passage par rfrence) public class TransmReference { public static void main(String[] args) { int t[] = {4,8} ; modifTab(t); // On envoie l'adresse du tableau... System.out.println(t[0]) ; } static void modifTab (int tab[]) { tab[0] = 3 ; System.out.println(tab[0]) ; } }
138

7. Les tableaux d'objets


Rappel : un tableau est un objet Il faut l'intancier avec la commande 'new' Lorsque l'on cre un tableau de type primitif, il suffit donc d'instancier le tableau (d initialiser la rfrence vers le tableau). Lorsqu'on cre un tableau d'objets, il faut non seulement instancier le tableau, mais aussi chacun de ses lments qui sont en ralits des pointeurs !
139

public class TabPoint { public static void main (String args[]) { Point t1[]; // dclaration du tableau t1 = new Point[3]; // cration du tableau t1[0] = new Point(2,7); // cration des 3 points t1[1] = new Point(4,21); t1[2] = new Point(11,3); for (i=0 ; i<t1.length ; i++) t1[i].affiche() ;// affichage des 3 points } }
140

VIII. Les chanes de caractres


En Java, une chane de caractres est un objet ; Java propose plusieurs classes apparentes aux chanes de caractres : la classe String = chanes de caractres non modifiables ; la classe StringBuffer = chanes de caractres modifiables volont ;
141

La classe String

Cette classe comporte 11 constructeurs et plus de 40 mthodes ;

142

Dclaration :
String prnom = new String ("Cline") ;

ou
String prnom = "Cline" ;

143

Comparaison :
String prnom = new String ("Hugo") ; String autrePrnom = new String ("Hugo") ; if (prnom == autrePrnom) System.out.println ("Vrai") ; else System.out.println ("Faux") ; Qu'affichera cette squence d'instructions ?

144

Pour vrifier l'galit entre 2 chanes :


if (prnom.equals(autrePrnom)) System.out.println ("Prnoms identiques") ; else System.out.println ("Prnoms diffrents") ;

145

IX. L'hritage
Principe : rcuprer du code existant pour le modifier en partie avant de le rutiliser ; Pourquoi ? Pour raccourcir les temps dcriture et de mise-au-point dune application ;

146

L'hritage permet de dfinir une classe drive partir d'une classe existante ; La classe drive hrite des champs et mthodes de la classe de base ; Pas d'hritage multiple en Java : une classe peut hriter d'une seule autre ;

1. Gnralisation - spcialisation
Le mot-cl extends indique la classe-mre :
class Voiture extends Vehicule { } class Velo extends Vehicule { } class VTT extends Velo { }

On dit quune classe-fille (ou sous-classe) spcialise sa classe-mre (ou super-classe) ; Tandis quune classe-mre gnralise sa classefille ;
148

Que peut faire une sous-classe ?

La classe qui hrite peut :


Ajouter des mthodes, des variables et des constructeurs ; Surcharger des mthodes ; Redfinir des mthodes ;

Exemple : la classe Point


class Point { private int x, y ; public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }

Exemple : la classe Point


class Point { private int x, y ; public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }
-

Imaginons que nous ayons besoin d'une classe Pointcol, destine manipuler des points colors d'un plan ; Elle disposera des mmes fonctionnalits que Point et une mthode "colore" charge de dfinir la couleur ;

- Elle hritera donc de Point ;

Exemple : la classe Point


class Point { private int x, y ; public void initialise (int a, int b) { x=a;y=b; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affiche () { System.out.println ("Je suis en " + x + " " + y) ; } }
} class Pointcol extends Point { private byte couleur ; public void colore (byte couleur) { this.couleur = couleur ; }

Nous pouvons maintenant dclarer des variables de type Pointcol : public class TestPointcol // Classe utilisant Pointcol { public static void main (String args[]) { Pointcol pc = new Pointcol() ; pc.initialise (3, 5) ; // Mthode de la classe de base pc.colore ((byte)3) ; // Mthode de la sous-classe pc.deplace (2, -1) ; pc.affiche() ; } }

Remarque
Si on veut ajouter Pointcol une mthode affichec fournissant la fois les coordonnes du point et sa couleur, ceci ne sera pas permis :
public void affichec () { System.out.println ("Je suis en " + x + " " + y) ; System.out.println ("Ma couleur est " + couleur) ;}

Remarque
Pour crire la mthode affichec, on peut s'appuyer sur la mthode affiche de Point :

public void affichec () { // Equivalent this.affiche() ; affichec() ; System.out.println ("Ma couleur est " + couleur) ; }

155

Exercices
1) On dispose de la classe suivante :
class Point { public void initialise (int x, int y) { this.x = x ; this.y = y ; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public int getX() { return x ; } public int getY() { return y ; } private int x, y ; } Ecrire la classe PointA, drive de Point disposant d'une mthode affiche pour afficher les coordonnes d'un point.

2) On dispose de la classe suivante :


class Point { public void setPoint (int x, int y) { this.x = x ; this.y = y ; } public void deplace (int dx, int dy) { x += dx ; y += dy ; } public void affCoord () { System.out.println ("Coordonnees : " + x + " " + y) ; } private int x, y ; } Ecrire la classe PointNom, drive de Point permettant de manipuler des points dfinis par 2 coordonnes et un nom (char). On y prvoira les mthodes suivantes : . . setPointNom pour dfinir les coordonnes et le nom d'un objet de type PointNom ; affCoordNom pour afficher les coordonnes et le nom d'un objet de type PointNom ;

2. Hritage et constructeurs

Si un constructeur d'une classe drive n'appelle pas le constructeur de sa classe de base, c'est le constructeur sans argument de celle-ci qui sera d'abord excut, puis celui de la classe drive ;

158

Exemple 1
class Mere { public Mere() { System.out.println ("Constructeur mre") ; } } class Fille extends Mere { // Pas d'appel explicite : appel par dfaut public Fille() { System.out.println ("Constructeur fille") ; } } public class TestFille { public static void main (String args[]) { Fille a = new Fille() ; } }

Qu'affichera l'excution du programme ?

Si un constructeur d'une classe drive appelle un constructeur de sa classe de base, il doit obligatoirement s'agir de la premire instruction du constructeur et ce dernier est dsign par le mot-cl super ;

160

Exemple 2
class Mere { private String prenom ; public Mere(String prenom) { this.prenom = prenom ; } } class Fille extends Mere { public Fille(String nom) { super (nom) ; // Appel explicite du constructeur System.out.println ("Constructeur fille") ; } } public class TestFille { public static void main (String args[]) { Fille a = new Fille("Cline") ; } }

Exemple 3 On dispose de la classe suivante :


class Point { public Point (int x, int y) { this.x = x ; this.y = y ; } public void affCoord() { System.out.println ("Coordonnees : " + x + " " + y) ; } private int x, y ; }

Ecrire le code de la classe PointNom, drive de Point, qui disposera d'un constructeur pour dfinir les coordonnes et le nom d'un objet de type PointNom.

Solution
class PointNom extends Point { public PointNom (int x, int y, char nom) { super (x, y) ; this.nom = nom ; } public void affCoordNom() { System.out.print ("Point de nom " + nom + " ") ; affCoord() ; } private char nom ; }

3. Modificateurs de visibilit
Rappel
Une classe possde 2 degrs de visibilit : - public : - (nant) : accessible partout ; accessible par les classes du package ;

164

3. Modificateurs de visibilit
Un attribut ou une mthode possdent 4 degrs de visibilit : public : accessible partout ; (nant) : accessible par les classes du package ; protected : accessible par les classes du package et les classes drives ;

private : accessible uniquement dans sa propre classe ;

165

4. Redfinition et surcharge

Surcharge = plusieurs mthodes qui portent le mme nom mais qui ont une signature diffrente ; Elles peuvent se trouver dans la mme classe ou dans une classe et ses descendantes ;

166

public class A { public void methodeX(int i) { } }

Surcharge public class B extends A { public void methodeX(double i) { } } B possde 2 mthodes

Redfinition = possibilit de redfinir dans une sous-classe une mthode qui existe dj dans la super-classe (mme signature) ; L'interprteur cherche la mthode invoque partir de la classe concerne et remonte jusqu' la premire rencontre ;

public class A { public void methodeX(int i) { } }

Surcharge public class B extends A { public void methodeX(double i) { } } B possde 2 mthodes

Redfinition public class C extends A { public void methodeX(int k) { } } C possde 1 seule mthode

Exemple

On considre 2 classes lies par hritage :


class Employe { } class Representant extends Employe { }

La classe reprsentant redfinit la mthode calculSalaire dj dcrite pour un employ ; Lien vers le programme