POO Moncours
POO Moncours
POO Moncours
1. Définition de classe
Exemple :
Rouler ()
méthode
En Java, une propriété devient un champ et une méthode devient une fonction.
Exemple :
En POO les objets communiquent entre eux par l’envoi des messages. Un objet peut envoyer
de message à lui-même ou à un autre objet.
L’état d’un objet peut changer lorsque cet objet invoque une de ses méthodes.
4. Concept de POO
Un langage est de type orienté objet lorsqu’il utilise les concepts suivants :
-classe
-objet
-Encapsulation
-Agrégation
-Héritage et le polymorphisme.
En POO, les données et les fonctions sont regroupées dans un module appelé classe ; ce qui
rend la maintenance facile par rapport à la programmation procédurale dans laquelle les
données au lieu d’être regroupées par classe avec leurs fonctions, sont groupées ensemble, de
même que les fonctions sont le sont aussi. Autrement, les données et les fonctions ne sont pas
modularisées dans des classes, mais sont mélangées ensembles.
Dans la programmation procédurale, les données de chaque entité ne sont pas structurées
ensemble avec leur fonction. Ce qui rend la maintenance difficile.
Généralités
1. Premier programme :
Par convention en Java le nom des classes commence par une lettre majuscule.
Pour exécuter :
Exercice1
Exercice 2
2 – Le bytecode
Bytecode Résultat
Code
La compilation d’un code en java ne donne pas un code binaire comme en C mais un
bytecode.
JVM (Java Virtual Machines). Java est un langage portable sur différentes plateformes.
Autrement une fois compilé ; le bytecode est interprété sur différentes plateformes par le JVM
(Java Virtual Machine).
1 – Type entier :
2 – Type flottant :
3 – Type caractère :
4– Type booléen :
True
False
Exemple : Boolean a ;
Page 5 sur 46
5 – Déclaration de constante :
final int N ;
N = 18 ;
N++ ; //erreur
final int p = 30 ;
LES INSTRUCTIONS DE
CONTROLES DE JAVA
int i;
if (i < 4) continue;
System.out.println(“Après la boucle”);
1 – Exemple :
private int x, y ;
x = abs ;// x = 4
y = ord ;// y = 7
Page 7 sur 46
}
public void deplace (int dx, int dy)//(2,1)
{
x += dx ;//x = 6
y += dy ;//y = 8
}
public void affiche ()
{
« a » est un pointeur sur l’objet crée donc en java « a » est une référence sur l’objet créé
parce que « a » contient l’adresse de l’objet.
Par abus de langage on dit parfois que a est un objet (réellement l’objet est : new Point()).
Un membre public peut être utilisé directement dans n’importe quelle autre classe.
Page 8 sur 46
2 – Le constructeur
Un constructeur est généralement utilisé pour donner de valeur initiale à l’objet créé. En java
un constructeur porte le même nom que la classe et n’a pas de type de retour. Un constructeur
est une méthode particulière.
Exemple :
package rectangle;
public class Rectangle {
private int L, l;
package rectangle;
public class TestRectangle {
public static void main(String[] args){
Rectangle rec = new Rectangle(4, 5); constructeur
rec.affichage();
System.out.println("Aire = " +rec.aire());
System.out.println("Perimetre = " +rec.perimetre());
}
Un constructeur par défaut est un constructeur sans argument. Lorsqu’il n’y a aucun
constructeur dans la classe pour créer un objet le compilateur nous fournit un constructeur par
défaut.
Page 9 sur 46
4 – Utilisation de this :
Exemple:
package rectangle;
public class Rectangle {
private int larg, l;
package rectangle;
public class TestRectangle {
public static void main(String[] args){
Rectangle rec = new Rectangle(4, 5) ;
rec.affichage();
System.out.println("Aire = " +rec.aire());
System.out.println("Perimetre = " +rec.perimetre());
}
5 – Surcharge ou surdéfinition :
6 – Encapsulation :
a – Accesseur :
b – Mutateur :
Un mutateur modifie l’état d’un objet c’est-à-dire modifie la valeur de certains de ces champs.
Exemple:
Exemple :
b = a ; b fait référence à l’objet sur lequel pointe a par conséquent l’objet de la référence b
n’est plus utilisé ( il est détruit par les ramasse-miette : garbage collector).
Exercice :
Page 12 sur 46
Banque
-Solde
- …. Test
- ….
- ….
?Créditer( ?)
?Débiter( ?)
?Afficher( ?)
1- Constructeur
2- Accesseur, mutateur
3- This
9 – La notion de clone :
class Point
{
private int x, y ;
public Point(int abs, int ord)
{
x = abs ;
y = ord ;
}
public Point copie () // renvoie une référence à un Point
{
Point p = new Point(x, y) ;
p.x = x ;
p.y = y ;
return p ;
}
-------------------------
}
------------------------
Point a = new Point(7,3) ;
Point b = a.copie() ;
-------------------------
Remarque :
On peut définir des champs qui au lieu d’exister dans chacune des instances de la
classe, n’existent qu’en un seul exemplaire pour toutes les instances d’une même classe.
On parle alors de champ de classe ou champ statique.
De même on peut définir des méthodes de classe ou méthodes statique qui peuvent
être appelés indépendamment de tout objet de classe.
a – champ de classe :
Class A
{
int n; a1.n a2.n
float y; ------------- -------------
}
a1.y a2.y
A a1 = new A() ;//objet1
A a2 = new A() ;//objet2
Class B
{
static int n;
float y; b1.n =b2.n
}
B b1 = new B() ;//objet1 b1.y b2.y
B b2 = new B() ;//objet2
Les champs de classe n’existent qu’en un seul exemplaire quel que soit le nombre d’objets de
la classe. En fait ce champ existe indépendamment de tout objet de sa classe.
b - Méthode de classe :
Une méthode de classe ne pourra en aucun cas agir sur un champ statique. Une méthode serait
déclarée statique lorsqu’on ne veut pas créer un objet avant de l’utiliser. On ne peut pas
utiliser this à l’intérieur d’une méthode statique.
class Obj
{
public Obj()
{
Page 14 sur 46
Java permet d’introduire dans la définition d’une classe un ou plusieurs blocs d’instructions
précédées du mot static. Les blocs d’initialisation statique présente un intérêt lorsque
l’initialisation des champs statiques ne peut être faite par une simple expression.
class A
{ private static int t[] ;
..........................................
static
{ .....................................
int nE1= sc.nextInt() ;
t = new int[nE1] ;
for (int i=0 ; i<nE1 ; i++)
t[i] = i ;
}
..............................;
}
class Util
{
public static void Echange (int a, int b) // ne pas oublier static
{
System.out.println ("début Échange : " + a + " " + b) ;
int c;
c = a;
a = b;
b = c;
System.out.println ("fin Échange : " + a + " " + b) ;
}
}
avant appel : 10 20
debut Échange : 10 20
fin Échange : 20 10
apres appel : 10 20
class Point
{
public Point(int abs, int ord)
{
x = abs ; y = ord ;
}
public void permute (Point a) // méthode d’Échange les coordonnées
// du point courant avec celles de a
{
Point c = new Point(0,0) ;
c.x = a.x ; //5
c.y = a.y ; //6 // copie de a dans c
a.x = x ; //1
a.y = y ; //2 // copie du point courant dans a
x = c.x ;
y = c.y ; // copie de c dans le point courant
}
Page 16 sur 46
12- Appel d’un constructeur au sein d’un autre constructeur de la même classe :
13- Récursivité :
C’est quand une méthode appelle elle -même.
On parle d’objet membre lorsque le champ d’une classe est une référence à un objet. C’est
une composition ou une agrégation particulière.
Exercice :
Une classe CompteEpargne appelée Compte et une classe Banque ayant :
Un objet membre de type compte
Un constructeur qui appelle en son sein un autre constructeur de Banque
Champ de classe
Méthode de classe
Méthode de copie des valeurs d’un objet
Test pour tester Banque.
Une classe est dite interne lorsque sa définition est située à l’intérieure de la définition
d’une autre classe.
Exemple :
class A
{
------------------
------------------
Class B
{
-----------------
-----------------
}
-------------------
-------------------
}
Remarque:
Un objet d’une classe interne est toujours associé, au moment de son instanciation,
à un objet d’une classe externe dont on dit qu’il lui a donné naissance.
Un objet d’une classe interne à toujours accès aux champs et méthodes même
privée de l’objet externe lui ayant donné naissance.
Un objet de classe externe à toujours accès aux champs et méthodes même privée
d’un objet de classe interne dont il a donné naissance.
Une classe interne ne peut pas contenir de membre static
Exercice :
Créer une classe Banque ayant une classe interne Compte. Tester la classe Banque.
19- Package :
Page 18 sur 46
Exemple :
En important un package :
package dos3;
import dos2.A;
import dos2.dos1.*;//ou import dos2.dos1.B ou encore import dos2.dos1.C
classD
{
-------------
-------------
}
LES TABLEAUX
int tab[]={18,3,-5,0,16,23,56};
tab[3]=0;
Exemple :
2- Affectation de tableau :
3- Champ length :
class Util
{
static void raz(int t[]) //un tableau en argument n’a pas de taille
{
for(int i = 0; i < t.length; i++)
{
t[i] = 0;
}
}
static void affiche(int t[])
{
for (int i = 0; i < t.length; i++)
{
System.out.println(t[i] + " ");
}
}
}
Exercice :
Complétez le code en écrivant une fonction qui retourne l’inverse du tableau.
a- Exemple
Ces 3 déclaration sont les mêmes
int t[][];
int []t[];
int [][]t;
t est une référence à un tableau dans lequel chaque élément est lui-même une référence à un
tableau entiers.
Page 21 sur 46
b- Initialisation :
T[1][1] = 11
double t[];
for (double v:t)
{
System.out.println(v); //le tableau sera parcouru en lecture par la variable
}
for (int i = 0; i < t.length; i++)
{
System.out.println(""+ t[i]) ;
}
Héritage et Polymorphisme
Page 22 sur 46
1- Exemple :
Classes filles ou
Rectangle classes dérivées Cercle
-longu : double -ray : double
-larg : double +calculerDiamètre()
+calculerDiagonale()
+ public
- private
# protected
La classe mère est une classe généralisée, celle de la classe fille est une classe spécialisée.
On vérifie la compatibilité en utilisant le verbe être (exemple : le rectangle est une figure).
2- Implémentation :
{
super.calulerSurface();
System.out.println(" " +Math.PI*Math.pow(ray,2));
}
public void calculerDialetre()
{
System.out.println("Le diamètre de " +nomFig+ "est : " +2*ray);
}
}
public class Test
{
public static void main (String args [])
{
Figure [] tab = new Figure[3];
Rectangle r1 = new Rectangle("Rectangle", 5.0, 2.0);
Cercle c = new Cercle("Cercle", 3.0);
Rectangle r2 = new Rectangle("Rectangle", 4.0, 1.0);
tab[0] = r1;
tab[1] = c;
tab[2] = r2;
for (int i = 0; i < tab.length; i++)
{
tab[i].calculerPerimetre();
tab[i].calulerSurface();
}
r1.calculerDiagonale();
c.calculerDiametre();
}
}
3- Commentaire :
On utilise extends pour signifier que la classe fille dérive de la classe mère.
Chaque classe doit construire son objet.
On utilise le mot clé super pour appeler le constructeur de la classe mère.
super doit être la première instruction dans le constructeur de la classe fille.
Lorsque la fonction existe dans la classe mère et que son corps ou sa définition
est modifié dans la classe fille on parle de redéfinition ou overwriting
Dans la classe fille la fonction redéfinie masque celle de la classe mère
Une méthode polymorphe doit exister dans la classe mère et doit être redéfinie dans les
classes filles.
4- Classe abstraite :
Une classe abstraite est une classe qu’on ne peut pas instancier.
Dès qu’une classe comporte au moins une méthode abstraite elle est abstraite.
Une méthode abstraite doit obligatoirement être déclarée public.
Exemple :
{
super.calulerSurface();
System.out.println(" " +(longu * larg));
}
5- Interface :
Une interface est constituée de méthode sans corps et quelques fois de constante.
Exemple :
6- La super-classe objet :
En réalité il existe une classe nommée objet dont dérive implicitement toute classe simple.
Une classe dérivée d’une classe non abstraite ne peut pas être déclarée abstraite et ou contenir
des méthodes abstraites.
Exemple :
En anglais on parle de wappers. Elles permettent de manipuler les types primitifs comme des
objets. Plus précisément il existe des classes nommées Boolean, Character, Byte Integer,
Short, Long, Float, Double qui encapsulent les valeurs du type primitif correspondant
(boolean, char, byte, short, long, int, float, double).
Exemple :
double x = 5.34;
Double y = new Double(x);
x = y.doubleValue();
Java permet de définir ponctuellement une classe sans lui donner de nom.
A a;
a = new A()
{
/*champs et méthodes qu'on introduit dans la
classe anonyme dérivée de A*/
};
class A
{
public void affiche()
{
System.out.println("je suis A");
}
}
Exercice :
Page 30 sur 46
Chaines de
caractères et type
énumérés
1- Introduction :
String a, b, c;
c = new String(b); //c ref à une chaîne, copie de b donc contenant Bonjour
String a, b, c;
a = "bonjour";
b = "bonsoir";
c = a;
a = b;
b = c;
4- Méthode charAt() :
Permet d’accéder à un caractère de rang donné d’une chaîne.
String b = "claude";
b.charAt(0); //"c"
b.charAt(2); //"a"
5- Concaténation :
L’opérateur + est défini lorsque ces deux opérandes sont des chaînes.
Exemple :
String a, b, c;
a = "EUSEBIO ";
b = "Claude";
c = a + b; //c = "EUSEBIO Claude"
6- L’opérateur += :
String a = "bonjour"
int n;
n = mot.indexOf('t'); // n = 2
n = mot.lastIndexOf('t'); // n = 24
n = mot.indexOf("ti"); // n = 2
n = mot.lastIndexOf("ti"); // n = 12
n = mot.indexOf('x'); // n = -1
8- Comparaison de chaînes :
Deux chaînes de valeurs différentes ont toujours des références différentes. En deux
chaînes de mêmes valeurs ne correspondent pas nécessairement à un seul et même objet.
== , != pour comparer les références avec la méthode equals. C’est une redéfinition de
equals dérivée de l’objet. Elle compare le contenu de deux chaînes.
String a = "EUSEBIO";
Page 32 sur 46
String b = "Claude";
a.equals(b); // false
a.equals(a); // true
9- CompareTo :
chaine1.compareTo(chaine2) ;
Elle fournit :
String a = "abalo";
String b = "mami";
a.compareTo(b); // négatif
String ch = "bonjour";
Extraction de sous-chaîne
String a = "anticonstitutionnellement";
c.toUpperCase() ; // CONSTITUTION
String a = "\n\t des séparateurs avant, pendant \t\n et après \n\t "
Page 33 sur 46
String temp:
int i, j;
int n = tab.length;
if (tab[i].compareTo(tab[j])>0)
temp = tab[i];
tab[i] = tab[j];
tab[j] = temp;
System.out.println(tab[i]);
}
Page 34 sur 46
Exercice :
Reprendre et comprendre l’exo d’application de Tableaux de chaînes.
int n = 427;
ou
String ch = Integer(n).toString;
String a = "3567";
int n = Integer.parseInt(a);
int n = Double.parseDouble(a);
String ch = "bonjour";
char mot[];
mot = ch.toCharArray();
Page 35 sur 46
System.out.println(chBuf);
chBuf.setCharAt(3,'J');
chBuf.setCharAt(1,'e');
chBuf.append("_2");
chBuf.insert(3, "langage_");
1- Threads :
Une classe pourra bénéficier des threads (c-à-d un objet de cette classe pourra
devenir un thread) si :
La première méthode est la plus simple. Nous verrons plus tard la raison d'existence de la
seconde.
Le lancement d'un thread se fait par la méthode start() qui à son tour appelle la
méthode run(). Lorsqu'on sort de run() l'exécution du thread est terminée. Notre
classe qui hérite de Thread devra redéfinir cette méthode run() en y incluant les
instructions qu'on désire voir s'exécuter.
Note : la classe Thread se trouve directement importée car elle appartient au package par
défaut java.lang.
Il s'agit dans cet exemple de simuler la course entre un lapin et une tortue. Pour
cela nous allons créer deux objets lapin et tortue qui héritent de Thread et qui
s'exécutent en parallèle. Ce qu'ils font c'est de compter jusqu'à 10, le premier qui
termine gagne la course.
On définit une classe Competiteur qui hérite de Thread. Le constructeur qui accepte
comme argument une chaîne de caractères, le fait passer au constructeur de la
classe mère qui associe ainsi la chaîne au nom du nouvel objet de type Thread.
C'est dans la fonction run() qu'est simulée la course : à chaque fois que notre thread
avance d'un pas on le fait dormir un certain temps aléatoire en faisant passer comme
argument à la méthode sleep un entier aléatoire représentant le nombre de
millisecondes à dormir.
On donne le départ à nos deux compétiteur (qui sont des threads) en invoquant pour
chacun sa méthode start().
Notez qu'à chaque nouvelle exécution de notre programme une nouvelle séquence
de course apparaît du fait du temps aléatoire qu'on génère.
e1.start() ;
e2.start() ;
e3.start() ;
private int nb ;
this.attente = attente ;
try
System.out.print (texte) ;
sleep (attente) ;
}
Page 39 sur 46
private int nb ;
this.texte = texte ;
Page 40 sur 46
this.nb = nb ;
this.attente = attente ;
try
System.out.print (texte) ;
Pour terminer notons qu'on peut arrêter un thread par sa méthode stop().
Resumé
Les threads sont des processus légers ou petits programmes partageant entre eux les
mêmes ressources. Ce sont plusieurs petits programmes qui s’exécutent. Ils tournent
indépendamment les uns des autres. Pour implémenter les threads on peut :
Le lancement d’un thread se fait par la méthode start qui à son tour appelle la méthode run.
Lorsqu’on sort de run l’exécution du thread est terminée. La classe fille qui hérite de threads
devra redéfinir cette méthode run en y incluant les instructions qu’on désire voir s’exécuter.
Math.random = [0,1[
3- Exception :
try
{
// bloc de code pouvant générer l'exception
}
catch(TypeException e1) { // traitement approprié }
catch(TypeException e2) { . . . }
.
Page 42 sur 46
.
.
finally { . . . }
Si une exception est générée dans les instructions du bloc try elle est alors
interceptée par le bloc catch correspondant (on sait qu'un catch est destiné à
capturer un certain type d'exception d'après la classe de l'exception
mentionnée après ce catch) s'il existe.
Le bloc finally est éxécuté dans tout les cas et en dernier.
Note : Dans Java le traitement des exceptions est obligatoire, toute section de code
susceptible de générer des exceptions devra être munie des blocs try et catch
correspondants.
Donnons un exemple.
class TestException
{ public static void main(String args[ ])
{ int tab[ ]=new int[10];
try
{ for(int i=0;i<=10;i++)
tab[i]=i;
}
catch(ArrayIndexOutOfBoundsException e)
{ System.out.println("depassement de la taille du tableau");
}
}
Lorsque i devient égale à 10 notre bloc try génère une exception de type
ArrayIndexOutOfBoundsException qui sera capturée par le bloc catch
correspondant pour afficher un message d'erreur.
Exemple :
try
{
x/y
}
catch(ArithmeticException e)
{
System.out.println("division par zero impossible");
}
Page 43 sur 46
Exception Personnalisée
Le premier mot clé : throws
Ce mot clé permet de dire à une instruction Java (condition, déclaration de variable...)
ou à une classe entière qu'une exception potentielle sera gérée par une classe -souvent
une classe personnalisée- mais ce peut être la classe Exception elle-même. Ce mot clé
est suivi du nom de la classe qui va gérer l'exception. Ceci a pour but de définir le type
d'exception qui risque d'être générée par l'instruction, ou la classe qui précède le mot
clé throws.
package javaapplication1;
package javaapplication1;
package javaapplication1;
}
}
}
package javaapplication1;
} catch (NombreHabitantException e) {
System.out.println(e.getMessage());
} finally {
System.out.println("\n--------------------------------------------");
System.out.println("Voici le code qui est toujours exécuté ! ! ! ");
System.out.println("--------------------------------------------\n");
}
System.out.println(v.toString());
}
Page 46 sur 46
Fin du Cours