3
Chapitre I : Programmation classique en Java : Rappel
4
Chapitre I : Programmation classique en Java : Rappel
import java.io.*;
class Test
{
Code source public static void main (String [] args)
{
System.out.println("java et la programmation OO");
}
}
1) Compilation
Fichier compilé
1000 1100 1010 0000 1001 1110 1000 0110 0010 0000
ou bytecode
…..
Lecture du fichier local ou
à distance
2) Interprétation
Sun Mac PC
Figure I.1 : Cycle d’exécution d’un programme Java
5
Chapitre I : Programmation classique en Java : Rappel
6
Chapitre I : Programmation classique en Java : Rappel
4. Types
En Java, les types peuvent être classés en deux catégories :
types primitifs (prédéfinis ou élémentaires), et types par
référence (ou classes d’objet).
7
Chapitre I : Programmation classique en Java : Rappel
class classes_objet
{
public static void main (String [] args)
{
Integer un = new Integer(1);
int i = un.intValue();
boolean a = un instanceof Integer ;
System.out.println(i);
System.out.println(a);
}
}
Cet exemple affiche :
1
true
Remarque : Java ne dispose pas de type pointeur.
5.1. Variables
La déclaration d’une variable consiste à associer un type à un
identificateur. La syntaxe générale est : <type> variable ;. Par
exemple, pour déclarer une variable entière i et une variable
booléenne test on écrira : int i ; boolean test ;
Il est possible d’initialiser une variable lors de sa déclaration :
int i = 4 ;
5.2. Constantes
Il est possible de simuler l’utilisation des constantes à l’aide
du mot clé final. Une variable déclarée final ne peut plus être
modifiée une fois qu’elle a été initialisée. Par exemple : final
int x =5 ;
8
Chapitre I : Programmation classique en Java : Rappel
6. L’affectation
Syntaxe générale est : <variable> = <valeur> ;. Le symbole
d’affectation en Java est donc ‘=’. Par exemple i = 2 + 3 ; met
la variable i à 5. Les formes suivantes sont aussi permises :
int a , b = 56 ; // a, b deux valeurs entières avec b initialisée à 56
a = (b = 12)+8 ; // b prend la valeur 12 et a prend la valeur 20
a = b = c = d =8 ; // affectation multiple : a, b, c, d prennent la valeur 8
On dispose du raccourci : x = y = z = 2 ;
9
Chapitre I : Programmation classique en Java : Rappel
10
Chapitre I : Programmation classique en Java : Rappel
Par exemple, si on a :
int a = -1;
a = a >>> 24;
donne en forme binaire :
11111111111111111111111111111111 -1
>>>24
00000000000000000000000011111111 255
La table de vérité des opérateurs bit level est la suivante :
Tableau I.7 : Opérateurs bit level
p q ~p p&q p|q p^q
1 1 0 1 1 0
1 0 0 0 1 1
0 1 1 0 1 1
0 0 1 0 0 0
On peut utiliser les opérateurs arithmétiques binaires avec des
valeurs logiques, qui sont des valeurs sur 1 bit.
11
Chapitre I : Programmation classique en Java : Rappel
12
Chapitre I : Programmation classique en Java : Rappel
13
Chapitre I : Programmation classique en Java : Rappel
14
Chapitre I : Programmation classique en Java : Rappel
15
Chapitre I : Programmation classique en Java : Rappel
class Inst_while 0
while (condition) { 1
{bloc C’est la boucle Tant que public static void main (String [] args) 2
d’instructions} { int i =0; 3
while (i<5) 4
l’instruction
{
while
System.out.println(i);
do {bloc i++;
Équivalente à Répéter en
d’instructions} }
algorithmique
while (condition) }
}
class Inst_switch Erreur
{
switch
Les blocs sont délimités public static void main (String [] args)
(expression)
par deux instructions case. {
{
Lorsqu’une égalité est int i =5;
case valeur1 :
trouvée, le bloc switch (i*2)
instructions1 ;
l’instruction d’instruction {
case valeur2 :
switch correspondant est exécuté, case 1 : System.out.println("Un");
instructions2 ;
ainsi que tous les blocs break;
…
suivants. Pour qu’un seul case 2 : System.out.println("Deux");
default :
bloc soit exécuté, il faut break;
instructions ;
utiliser explicitement default :
}
l’instruction break. System.out.println("Erreur");
}
}}
16
Chapitre I : Programmation classique en Java : Rappel
17
Chapitre I : Programmation classique en Java : Rappel
9. Chaîne de caractères
En Java, les chaînes de caractères sont des objets. Ce sont des
instances de la classe String. Les chaînes de caractères
peuvent être initialisées à une valeur quelconque.
La déclaration d’une chaîne de caractères peut être de deux
manières :
1. Directement : String y = "bonjour" ;. Ou bien String y ; y
= "bonjour" ;
2. Par le mot clé new qui permet d’instancier une classe,
c’est-à-dire de créer une instance de cette classe : String y
= new String("bonjour") ;
Les chaînes de caractères existent aussi sous forme littérale. Il
suffit de placer la chaîne entre guillemets comme dans
l’exemple suivant : "Bonjour !".
Les chaînes de caractères disposent de l'opérateur + qui
permet de concaténer deux chaînes ; += est aussi valable pour
les chaînes de caractères. Par exemple, suite à la déclaration
précédente de S, l’instruction S+= " Ahmed" ; renvoie
"bonjour Ahmed" à S.
La méthode length retourne la longueur d’une chaîne de
caractères. La méthode equals permet de comparer la chaîne
de caractères avec une autre :
class Type_String
{
public static void main (String [] args)
{
String x = "Ali" ;
System.out.println("bonjour " + x) ;
System.out.println(x.length()) ;
if (! x.equals("Ahmed")) System.out.println("deux personnes
differentes " ) ;
}
}
Le programme affiche :
bonjour Ali
3
deux personnes differentes
18
Chapitre I : Programmation classique en Java : Rappel
19
Chapitre I : Programmation classique en Java : Rappel
20
Chapitre I : Programmation classique en Java : Rappel
21
Chapitre I : Programmation classique en Java : Rappel
22
Chapitre I : Programmation classique en Java : Rappel
13. Exercices
Exercice 1 :
Ecrire le programme Java permettant de calculer la somme
des 100 premiers entiers et le produit des 10 premiers entiers
avec une seule classe (un seul fichier Java).
Exercice 2 :
Reprendre l’exercice 1, mais cette fois-ci en séparant les
calculs (somme et produit) dans deux méthodes différentes.
Exercice 3 :
Reprendre l’exercice 1, mais cette fois-ci avec deux classes
définies dans deux fichiers Java indépendants. Les méthodes
dans une classe et l’affichage dans la deuxième.
Exercice 4 :
Le programme Java suivant permet de lire un entier au
clavier :
import java.io.*;
public class LectureEntier {
public static void main (String [] args) {
// On commence par déclarer un objet lecteur sur le clavier
// Le clavier est associé à la variable System.in
// Un InputStreamReader (lecteur sur un flux) est créé dessus
// Puis on ajoute une couche BufferedReader nécessaire pour lire des
informations par ligne
23
Chapitre I : Programmation classique en Java : Rappel
24
Chapitre I : Programmation classique en Java : Rappel
Exercice 8 :
Reprendre l’exercice précédent, mais cette fois-ci en utilisant
des boucles for imbriquées.
Exercice 9 :
Ecrire un programme Java qui détermine et affiche la plus
grande valeur des éléments d’un tableau. On complétera le
programme suivant :
public class Valeurmax {
public static void main(String[] args) {
// Définition d’un tableau de 10 entiers
int [] Tableau = {5, 3, 12, 4, 7, 9, 1, 8, 19, 2};
}
}
Exercice 10 :
Ecrire un programme Java permettant de trier, ensuite afficher
un tableau d’entiers contenant les éléments : {8, 5, 7, 9, 2, 1,
12, 6}. Utiliser l’algorithme de tri par sélection.
Exercice 11 :
Reprendre l’exercice précédent, mais cette fois-ci il faut
définir une classe TriEntiers permettant de trier des entiers
stockés dans un tableau. L’en-tête de la méthode de tri est le
suivant :
public void TriTableauEntiers(int [] Tableau)
Tester votre programme à l’aide du programme TestTriEntiers
suivant :
public class TestTriEntier {
public static void main(String[] args) {
int [] Tableau = {12, 3, 1, 4, 9, 5, 2, 8, 3, 6};
TriEntiers Tri = new TriEntiers();
Tri.TriTableauEntiers(Tableau);
for (int i = 0; i < Tableau.length; i++)
System.out.println(Tableau[i] + " ");
}
}
Exercice 12 :
Définir en Java une classe TriStrings contenant une fonction
permettant de trier des chaînes de caractères. On utilisera la
25
Chapitre I : Programmation classique en Java : Rappel
int Produit = 1;
// calcul du produit des 10 premiers entiers
for (int i = 1; i <= 10; i++)
Produit = Produit * i;
// affiche le résultat à l'écran
System.out.println("Le produit = " + Produit);
}
}
Solution 2 :
class Calcul {
26
Chapitre I : Programmation classique en Java : Rappel
27
Chapitre I : Programmation classique en Java : Rappel
}
}
Le fichier TestCalcul.java est comme suit :
class TestCalcul {
public static void main(String[] args) {
Calcul c = new Calcul();
System.out.println("La somme = " + c.S());
System.out.println("Le produit = " + c.P());
}
}
Solution 4 :
import java.io.*;
public class Readln {
// Fonction de lecture d’une chaîne de caractères
public static String unstring()
{
BufferedReader lecteurClavier=new BufferedReader(new
InputStreamReader(System.in));
String valeur = "";
String chaineLue;
try {
chaineLue = lecteurClavier.readLine();
valeur = chaineLue;
} catch (Exception e) {
System.out.println("Erreur d'E/S " + e.getMessage());
}
return valeur;
}
// Fonction de lecture d’un byte
public static byte unbyte()
{
BufferedReader lecteurClavier=new BufferedReader(new
InputStreamReader(System.in));
byte valeur = 0;
String chaineLue;
try {
chaineLue = lecteurClavier.readLine();
valeur = Byte.parseByte(chaineLue);
} catch (Exception e) {
System.out.println("Erreur d'E/S " + e.getMessage());
}
return valeur;
}
// Fonction de lecture d’un short
28
Chapitre I : Programmation classique en Java : Rappel
29
Chapitre I : Programmation classique en Java : Rappel
30
Chapitre I : Programmation classique en Java : Rappel
return valeur;
}
}
Solution 5 :
Solution avec la structure if..else
class ValAbs
{
public static void main (String [] args)
{
Readln Lire = new Readln();
float x;
System.out.println("Entrez un nombre : ");
x = Lire.unfloat();
if (x < 0) System.out.println("|x| = " + (-x) );
else System.out.println("|x| = " + (x) );
}
}
Solution avec la structure ?:
class ValAbs
{
public static void main (String [] args)
{
Readln Lire = new Readln();
float x;
System.out.println("Entrez un nombre : ");
x = Lire.unfloat();
System.out.println("|x| = " + (x<0 ? -x : x) );
}
}
Solution 6 :
class ApplicationParfaits
{
public static void main (String [] args)
{
Readln Lire = new Readln();
int compt = 0, n, k, somdiv, nbr;
System.out.println("Combien de nombres parfaits : ");
n = Lire.unint();
nbr = 2;
while (compt != n)
{
somdiv = 1;
k = 2;
31
Chapitre I : Programmation classique en Java : Rappel
32
Chapitre I : Programmation classique en Java : Rappel
}
}
}
Solution 8 :
Code Java avec deux boucles for imbriquées :
class ApplicationComptPremiers2
{
public static void main (String [] args)
{
Readln Lire = new Readln();
int divis, nbr, n, compt = 1;
boolean Est_Premier;
System.out.print("Combien de nombres premiers : ");
n = Lire.unint();
System.out.println(2);
for (nbr = 3; compt<n ; nbr+=2)
{
Est_Premier = true;
for (divis = 2; divis<=nbr/2; divis++)
if (nbr % divis == 0)
{
Est_Premier = false;
break;
}
if (Est_Premier)
{
compt++;
System.out.println(nbr);
}
}
}
}
Solution 9 :
public class Valeurmax {
public static void main(String[] args) {
// Définition d'un tableau de 10 entiers
int [] Tableau = {5, 3, 12, 4, 7, 9, 1, 8, 19, 2};
int max = Tableau[0];
for (int i=1 ; i < 10; i++ )
if (max < Tableau[i]) max = Tableau[i];
System.out.println("La valeur maximale du tableau = "+ max);
}}
33
Chapitre I : Programmation classique en Java : Rappel
Solution 10 :
public class TriTab {
public static void main(String[] args) {
int [] T = {8, 5, 7, 9, 2, 1, 12, 6};
int x=0;
for (int i=0; i<7; i++)
for (int j=i+1; j<=7; j++)
if (T[i]>T[j])
{
x = T[i];
T[i] = T[j];
T[j] = x;
}
for (int i=0; i<=7; i++) System.out.println(T[i]);
}}
Solution 11 :
public class TriEntiers {
public void TriTableauEntiers(int [] Tableau) {
int x=0;
for (int i=0; i<7; i++)
for (int j=i+1; j<=7; j++)
if (Tableau[i]>Tableau[j])
{
x = Tableau[i];
Tableau[i] = Tableau[j];
Tableau[j] = x;
}
}
}
Solution 12 :
public class TriChaines {
public void TriTableauChaines(String [] Tableau) {
String x="";
for (int i=0; i<4; i++)
for (int j=i+1; j<=4; j++)
if (Tableau[i].compareTo(Tableau[j]) > 0)
{
x = Tableau[i];
Tableau[i] = Tableau[j];
Tableau[j] = x;
}
}}
34
Chapitre II : Programmation Orientée Objet : Concepts de base
1. Introduction
La programmation orientée objet (POO) signifie que l’on
organise le logiciel comme une collection d’objets dissociés
comprenant à la fois une structure de données et un
comportement, à la différence de la programmation
conventionnelle dans laquelle la structure de données et le
comportement sont faiblement associés. La programmation
orientée objet est caractérisée par un ensemble de concepts
tels que l’objet, la classe, l’encapsulation, l’héritage et le
polymorphisme.
2. La notion d'objet
Un objet est une entité informatique qui modélise un élément
du monde réel. Cette entité permet alors de regrouper les
principales caractéristiques d’un élément du monde réel
(taille, couleur, ...).
La difficulté de cette modélisation consiste à créer une
représentation abstraite, sous forme d'objets, des entités ayant
une existence matérielle (chien, voiture, ampoule, ...) ou bien
virtuelle (temps, espace ...).
Un objet est caractérisé par plusieurs notions:
Les attributs : Il s'agit des données caractérisant
l'objet. Ce sont des variables stockant des informations
d'état de l'objet.
Les méthodes (appelées parfois fonctions membres) :
Les méthodes d'un objet caractérisent son
comportement, c'est-à-dire l'ensemble des actions
(appelées opérations) que l'objet peut réaliser. Ces
opérations permettent de faire réagir l'objet selon des
invocations extérieures (ou d'agir sur les autres objets).
De plus, les opérations sont fortement liées aux
35
Chapitre II : Programmation Orientée Objet : Concepts de base
3. La notion de classe
On appelle classe la définition de la structure d'un objet, c'est-
à-dire la déclaration de l'ensemble des objets qui ont des
mêmes caractéristiques. En réalité, on dit qu'un objet est une
instanciation d'une classe. On parle donc d'objet ou d'instance
(éventuellement d'occurrence).
Une classe est composée de deux parties:
Les attributs (parfois appelés données membres) : il
s'agit des données représentant l'état de l'objet.
Les méthodes (parfois appelées fonctions membres) :
il s'agit des opérations applicables aux objets.
Si on définit la classe voiture, les objets Peugeot 406, Renault
18 seront des instanciations de cette classe.
36
Chapitre II : Programmation Orientée Objet : Concepts de base
Bicyclette
Taille de cadre
Abstraction Taille de roues Attributs
Vitesse
Conduire
Méthodes
Polygone
Abstraction
Arrête
Couleur de fond Attributs
Dessiner
Méthodes
4. Héritage
37
Chapitre II : Programmation Orientée Objet : Concepts de base
classe fils à sa classe mère par la phrase "est un" (en anglais
"is a").
Animal
Herbivore Carnivore
Omnivore
Figure II.35: Exemple d’héritage multiple
5. Encapsulation
5.1. Le concept d'encapsulation
L'encapsulation est un mécanisme consistant à rassembler les
données et les méthodes au sein d'une structure en cachant
l'implémentation de l'objet, c'est-à-dire en empêchant l'accès
aux données par un autre moyen que les méthodes proposées.
L'encapsulation permet donc de garantir l'intégrité des
données contenues dans l'objet.
38
Chapitre II : Programmation Orientée Objet : Concepts de base
6. Polymorphisme
39
Chapitre II : Programmation Orientée Objet : Concepts de base
40
Chapitre III : La Programmation Orientée Objet en Java
1. Introduction
La programmation orientée objet permet de mettre en œuvre
des programmes organisés en ensembles d’objets coopérants.
Chacun représente une instance d’une certaine classe.
2. Classes et Objets
L’écriture d’un programme Java consiste à écrire un ensemble
de classes comportant des attributs et des méthodes qui
peuvent instancier des objets d’autres classes et appeler leurs
méthodes. Dans ce qui suit, nous allons expliquer la notion de
classe et d’objet en Java.
2.1. Classe
La définition d’un nouveau type de données, d’une façon
générale, se fait en Java en utilisant les classes. Une classe
comporte des attributs et des méthodes. En Java, on ne peut
écrire des algorithmes que comme méthodes d’une classe.
On peut dire que : Classe = attributs + Méthodes.
Pour définir la classe Triangle avec 2 attributs et une méthode
surface(), on peut écrire :
class Triangle
{ // Attributs de la classe
double hauteur ; // hauteur du triangle
double base ; // base du triangle
// Méthode calculant la surface du triangle
double surface()
{
return base * hauteur / 2 ;
}
}
41
Chapitre III : La Programmation Orientée Objet en Java
2.2. Objet
Pour instancier un objet d’une classe, on fait un appel
explicite à l’opérateur new en précisant la classe à instancier.
Un objet est donc une instance d’une classe.
Format général : <nomClasse> reference = new
<nomClasse>() ;
L’appel de new a deux effets :
Il crée un objet de type <nomClasse>.
Il retourne la référence (adresse) de cet objet.
Cette référence doit être mémorisée dans une variable
(reference) pour pouvoir accéder à l’objet créé.
Pour créer un objet Triangle on met :
Triangle t ; // Déclaration d’une variable t
t = new Triangle (); // Création d’un objet Triangle
Il est possible de mettre directement : Triangle t = new
Triangle ();
L’accès à un élément (attribut ou méthode) se fait en écrivant
le nom de la référence à côté du nom de l’élément, séparés par
un point. Pour initialiser l’objet t créé au-dessus avec une
hauteur 3 et une base 4, on peut écrire :
t.hauteur = 3 ; t.base = 4 ; // Accès aux attributs via la référence
Remarque : dans la littérature, le concept objet est souvent
utilisé avec une ambiguïté. Il est utilisé pour indiquer une
instance, ou bien pour indiquer la classe elle-même. Dans ce
cours, on utilise le concept objet pour indiquer l’instance.
42
Chapitre III : La Programmation Orientée Objet en Java
43
Chapitre III : La Programmation Orientée Objet en Java
hauteur = x ;
base = y ;
}
double surface()
{
return base * hauteur / 2 ;
}
}
Après avoir compilé la classe Triangle précédente, et dans le
même répertoire, nous allons écrire le programme
Java Triangle_Calcul comme suit :
class Triangle_Calcul
{
public static void main (String [] args)
{
Triangle t = new Triangle(3,9);
System.out.println("Avec h = " + t.hauteur + " et b = "+ t.base +"
Surface = " + t.surface());
}
}
Le programme Java au-dessus affiche :
Avec h = 3.0 et b = 9.0 Surface = 13.5
Il est possible de définir un programme Java qui fait appel à
une classe interne et une autre externe comme c’est le cas
dans l’exemple suivant :
class TriangleRectangle_Calcul
{
static class Rectangle
{
double longueur ;
double largeur ;
Rectangle (double x, double y)
{
longueur = x ;
largeur = y ;
}
double surfaceR()
{
return longueur * largeur ;
}
}
44
Chapitre III : La Programmation Orientée Objet en Java
{
Triangle t = new Triangle(3,9);
System.out.println("SurfaceT = " + t.surface());
4. Classes imbriquées
On a vu au-dessus un programme Java, qui est enfin de
compte une classe, faisant appel à une classe interne. C’est un
cas particulier des classes imbriquées. Plus généralement, on
peut dire qu’une classe peut être un attribut dans une autre
classe. Définissons par exemple la classe TriangleRectangle
comme suit :
class TriangleRectangle
{
double hauteur ;
double base ;
class Rectangle
{
double longueur ;
double largeur ;
45
Chapitre III : La Programmation Orientée Objet en Java
{
hauteur = x ;
base = y ;
}
double surfaceT()
{
return base * hauteur / 2 ;
}
5. Héritage en Java
Java permet de définir la relation d’héritage entre les classes.
Soit par exemple la classe Triangle définie comme suit :
class Triangle
{
double hauteur ;
double base ;
Triangle (double x, double y)
{
hauteur = x ;
base = y ;
}
46
Chapitre III : La Programmation Orientée Objet en Java
double surface()
{
return base * hauteur / 2 ;
}
}
Il est donc possible de définir la classe TriangleMMSS
héritant la classe Triangle en utilisant le mot clé extends, et
cela comme suit :
class TriangleMMSS extends Triangle
{
double TTDD ;
TriangleMMSS (double x, double y, double z)
{
super(x , y) ;
TTDD = z ;
}
double perimetre ()
{
return base + TTDD * 2 ;
}
}
Remarques :
La classe TriangleMMSS a hérité implicitement les
attributs hauteur et base, ainsi que la méthode
surface() de la classe mère Triangle.
On commence généralement le constructeur d’une
sous-classe par un appel du constructeur de sa classe
mère. Cela se fait par l’instruction super(). On passe à
super() les paramètres nécessaires à l’appel du
constructeur de la classe mère. En général, ces
paramètres constituent un sous-ensemble des
paramètres du constructeur de la sous-classe. Si le
constructeur de la classe mère d’une classe n’est pas
appelé explicitement, c’est le constructeur sans aucun
paramètre qui est appelé (constructeur par défaut).
Il est possible de définir des méthodes abstraites, par
le mot clé abstract, d’une classe générique. Cela
implique que toutes les classes qui héritent de cette
classe générique devront spécifier concrètement ces
méthodes. Une classe peut être aussi définie comme
abstraite ; dans ce cas elle ne peut être que héritée et
47
Chapitre III : La Programmation Orientée Objet en Java
6. L’encapsulation en Java
Java permet de définir des droits d’accès sur les éléments
(attributs et méthodes) d’une classe par les mots clés
suivants :
public : les éléments publics sont accessibles sans
aucune restriction. Les éléments publics d’une classe
sont hérités par ses sous-classes.
protected : les éléments protégés ne sont accessibles
que depuis la classe elle-même, les sous-classes qui en
héritent et les classes du même package. En Java, un
package dénote un regroupement de classes.
Notamment, les classes définies dans le même
répertoire appartiennent au même package.
private : les éléments privés ne sont accessibles que
depuis la classe elle-même. Les éléments privés d’une
classe ne sont pas hérités par ses sous-classes.
48
Chapitre III : La Programmation Orientée Objet en Java
49
Chapitre III : La Programmation Orientée Objet en Java
7. Polymorphisme en Java
On a dit qu’une classe peut posséder de zéro à plusieurs
constructeurs. C’est lors de l’instanciation que le compilateur
détermine le constructeur à utiliser. Par exemple, soit la classe
Triangle définie comme suit :
class Triangle
{
double hauteur = 5 ;
double base = 2 ;
Triangle (double x, double y)
50
Chapitre III : La Programmation Orientée Objet en Java
{
hauteur = x ;
base = y ;
}
Triangle (double x)
{
hauteur = x ;
}
double surface()
{
return base * hauteur / 2 ;
}
}
Et soit le programme Java suivant :
class Triangle_Affiche
{
public static void main (String [] args)
{
Triangle t1 = new Triangle(9,3);
System.out.println("Surface = " + t1.surface());
51
Chapitre III : La Programmation Orientée Objet en Java
double base = 2 ;
double surface(double x, double y)
{
hauteur = x;
base = y;
return base * hauteur / 2 ;
}
double surface()
{
return base * hauteur / 2 ;
}
}
Dans la classe Triangle on vient de définir la méthode
surface() deux fois ; chacune avec un nombre différent de
paramètres.
On définit ensuite le programme Java comme suit :
class Triangle_Affiche
{
public static void main (String [] args)
{
Triangle t1 = new Triangle();
System.out.println("Surface = " + t1.surface(9,3));
52
Chapitre III : La Programmation Orientée Objet en Java
{
double hauteur ;
double base ;
Triangle(double x, double y)
{
hauteur = x ;
base = y ;
}
double surface()
{
return base * hauteur / 2 ;
}
}
On définit ensuite la classe TriangleMMSS comme suit :
class TriangleMMSS extends Triangle
{
double TTDD ;
TriangleMMSS (double x, double y)
{
super(x, y) ;
}
double perimetre ()
{
return base + TTDD * 2 ;
}
double surface ()
{
TTDD = 9.12 ;
return base * hauteur / 2 ;
}
}
Remarques :
Dans la classe TriangleMMSS, on vient de redéfinir la
méthode surface() héritée de la classe mère Triangle.
Il était possible de redéfinir la classe surface() comme
suit :
class TriangleMMSS extends Triangle
{
double TTDD ;
TriangleMMSS (double x, double y)
{
super(x, y) ;
53
Chapitre III : La Programmation Orientée Objet en Java
}
double perimetre ()
{
return base + TTDD * 2 ;
}
double surface ()
{
TTDD = 9.12 ;
return super.surface() ;
}
}
Le mot-clé super permet de désigner l’objet père de l’objet
courant. Il est donc utilisé pour appeler une méthode d’un
objet de la classe mère lorsqu’elle n’a pas la même définition
au niveau de la sous-classe.
Enfin, on définit le programme Java suivant :
class TriangleMMSS_Affiche
{
public static void main (String [] args)
{
TriangleMMSS t = new TriangleMMSS(9,3);
System.out.println("Surface = " + t.surface());
System.out.println("Perimetre = " + t.perimetre());
System.out.println("TTDD = " + t.TTDD);
}
}
Le programme Java au-dessus affiche :
Surface = 13.5
Perimetre = 21.24
TTDD = 9.12
54
Chapitre III : La Programmation Orientée Objet en Java
55
Chapitre III : La Programmation Orientée Objet en Java
SurfaceT = 13.5
SurfaceR = 132.0
56
Chapitre III : La Programmation Orientée Objet en Java
57
Chapitre III : La Programmation Orientée Objet en Java
Triangle ()
{
}
static double surface(double x, double y)
{
hauteur = x ;
base = y ;
58
Chapitre III : La Programmation Orientée Objet en Java
59
Chapitre III : La Programmation Orientée Objet en Java
Triangle
T Objet de type Triangle
alloué avec new
double surface()
{
return base * hauteur / 2 ;
}
}
Dans le constructeur de la classe on a this.hauteur indique
l’attribut hauteur de l’objet courant, par contre hauteur (à
droite de l’affectation) correspond au paramètre du
constructeur. De même que pour this.base et base.
60
Chapitre III : La Programmation Orientée Objet en Java
10. Exercices
61
Chapitre III : La Programmation Orientée Objet en Java
62
Chapitre III : La Programmation Orientée Objet en Java
63
Chapitre III : La Programmation Orientée Objet en Java
Nombre de pièces : 5
Existence d'une piscine : false
Impôt = 740.0 DA
2. Le calcul de l’impôt d’une habitation à usage
professionnel est également différent de celui d’une
habitation. Il se calcule en fonction de la surface occupée
par le bâtiment et du nombre d’employés travaillant dans
l’entreprise. On compte 1000 DA supplémentaires par
tranche de 10 employés.
Question 3 : Définir la classe HabitationProfessionnelle qui
hérite de la classe Habitation en utilisant l’en-tête suivant :
class HabitationProfessionnelle extends Habitation {
...
}
Ajouter l’attribut NbEmployes de type entier. Redéfinir les
méthodes Impot et Affiche. La méthode Affiche doit afficher,
en plus des attributs proprietaire, adresse et surface, l’attribut
NbEmployes.
Question 4 : Tester votre programme à l’aide du code donné
comme suit :
// Classe TestHabitationProfessionnelle permettant de tester la classe
HabitationProfessionnelle
class TestHabitationProfessionnelle {
public static void main (String [] args){
double I;
// création d'un objet de type HabitationProfessionnelle
HabitationProfessionnelle HP = new
HabitationProfessionnelle("Ahmed", "Oran", 2500, 130);
// calcul de l'impôt
I = HP.Impot();
// affichage des attributs de la classe HabitationProfessionnelle
HP.Affiche();
// affichage de l'impôt
System.out.println("Impôt = " + I + " DA");
}
}
Le programme doit afficher :
Propriétaire : Ahmed
Adresse : Oran
Surface : 2500.0
Nombre d'employés : 130
64
Chapitre III : La Programmation Orientée Objet en Java
Impôt = 18000.0 DA
Exercice 3 : Gestion des habitations d’une commune.
65
Chapitre III : La Programmation Orientée Objet en Java
66
Chapitre III : La Programmation Orientée Objet en Java
67
Chapitre III : La Programmation Orientée Objet en Java
68
Chapitre III : La Programmation Orientée Objet en Java
69
Chapitre III : La Programmation Orientée Objet en Java
70
Chapitre III : La Programmation Orientée Objet en Java
71
Chapitre III : La Programmation Orientée Objet en Java
return 3;
}
else
{
ImpairCourant+=2;
return ImpairCourant;
}
}
public boolean IlEnReste()
{
if (ImpairCourant < 99) return true;
else return false;
}
}
Définition de la classe Main :
class Main
{
public static void main (String[]args)
{
Impair nb = new Impair();
System.out.println(nb.Premier());
while (nb.IlEnReste()) System.out.println(nb.Suivant());
}
}
Solution 2 :
Casier()
{
AppelPremier = false;
for (int i=0; i<MaxT; i++) Tiroir[i] = 0 ;
}
public int Premier()
{
NumTCourant = 0;
AppelPremier = true;
72
Chapitre III : La Programmation Orientée Objet en Java
return Tiroir[0];
}
public int Suivant()
{
if (AppelPremier)
{
NumTCourant = 1;
AppelPremier = false;
return Tiroir[1];
}
else
{
NumTCourant+=1;
return Tiroir[NumTCourant];
}
}
public boolean IlEnReste()
{
if (NumTCourant < MaxT-1) return true;
else return false;
}
public void Range(int k, int i)
{
if (i<MaxT)Tiroir[i] = k;
else System.out.println("Indice hors de limites");
}
}
Définition de la classe Main :
class Main
{
public static void main (String[]args)
{
Casier Cs = new Casier();
for (int i=0; i<Cs.MaxT; i++) Cs.Range(i*i,i);
System.out.println(Cs.Premier());
while (Cs.IlEnReste()) System.out.println(Cs.Suivant());
int somme = Cs.Premier();
while (Cs.IlEnReste()) somme+=Cs.Suivant();
System.out.println("Somme = " + somme);
}
}
Solution 3 :
73
Chapitre III : La Programmation Orientée Objet en Java
class Syracuse
{
private int TermeCourant;
private int TermeInitial;
private boolean AppelPremier;
Syracuse(int U0)
{
TermeInitial = U0 ;
AppelPremier = false;
}
public int Premier()
{
AppelPremier = true;
TermeCourant = TermeInitial;
return TermeInitial ;
}
public int Suivant()
{
if (AppelPremier)
{
TermeCourant = TermeSyracuse(TermeInitial);
AppelPremier = false;
return TermeCourant;
}
else
{ TermeCourant = TermeSyracuse(TermeCourant);
return TermeCourant;
}
}
public boolean IlEnReste()
{
if (TermeCourant != 1) return true;
else return false;
}
public int TermeSyracuse(int Un)
{
if ((Un%2)==0) return Un/2;
else return 3*Un + 1;
}
}
Définition de la classe Main :
class Main
{
public static void main (String[]args)
{
74
Chapitre III : La Programmation Orientée Objet en Java
75
Chapitre III : La Programmation Orientée Objet en Java
{
TermeInitial = U0 ;
AppelPremier = false;
}
public int Premier()
{
AppelPremier = true;
TermeCourant = TermeInitial;
return TermeInitial ;
}
public int Suivant()
{
if (AppelPremier)
{
TermeCourant = TermeSyracuse(TermeInitial);
AppelPremier = false;
return TermeCourant;
}
else
{
TermeCourant = TermeSyracuse(TermeCourant);
return TermeCourant;
}
}
public boolean IlEnReste()
{
if (TermeCourant != 1) return true;
else return false;
}
public int TermeSyracuse(int Un)
{
if ((Un%2)==0) return Un/2;
else return 3*Un + 1;
}
}
Définition de la classe Main :
class Main
{
public static void main (String[]args)
{
System.out.println("Première suite : ");
Syracuse Cr1 = new Syracuse(17);
Cr1.Affiche();
76
Chapitre III : La Programmation Orientée Objet en Java
77
Conclusion Générale
La programmation classique sépare les données des
traitements, rendant ainsi difficile la mise en place de
contrôles, destinés à garantir la cohérence et l’intégrité des
données. L’utilisateur peut en effet accéder directement aux
données, sans utiliser les fonctions mises à sa disposition. La
programmation orientée objet a été introduite afin de remédier
à ces inconvénients en regroupant au sein d’une même unité,
dite objet, les données et les traitements.
En conclusion, la programmation orientée objet a deux
avantages principaux: (1) contrôler l'accès aux données, et (2)
permettre la modification des objets sans avoir d'incidence sur
les programmes des utilisateurs.
Java est un langage de programmation supportant les éléments
de la programmation orientée objet. Dans ce support du cours
nous avons présenté ce langage. Nous avons aussi présenté les
notions de base de programmation orientée objet. Nous avons
évidemment montré comment implémenter les notions
orientées objet en Java.
Nous espérons, avec ce support, doté l’étudiant d’un esprit
orienté objet, et le mettre sur les railles pour la maîtrise du
langage Java.
Java met encore à la disposition des développeurs une API
(Application Programming Interface) très riche, lui permettant
de faire de très nombreuses choses. Ce langage propose à peu
près tout ce dont on a besoin directement dans le JDK. De
plus il existe d’autres API pour des fonctionnalités qui
viendraient à manquer au JDK.
En plus des API, la notion des Plugins (modules d’extension)
offerte par les éditeurs Java, donnent à ce langage beaucoup
d’avantages : rapidité, sécurité, fiabilité, portabilité,
robustesse et richesse des API.
Java, notamment via ses éditeurs Eclipse et NetBeans, offre
des plugins intégrés, tels que ADT (Android Development
78
Tools), pour la programmation mobile. Java est le principal
langage utilisé pour développer des applications pour le
système d'exploitation libre Android de Google pour les
appareils Mobiles. Nous espérons, dans le futur, préparer un
support de cours sur la ″Programmation Mobile en Java″,
destiné aux étudiants de la première année Master, 1ier
semestre, Option : Systèmes d’information, au centre
universitaire Salhi Ahmed de Naâma, Algerie.
79
Références bibliographiques additionnelles
Vous pouvez lire encore :
80
Annexe
Le suivant est le programme officiel de la matière
Programmation Orientée Objet, de la 2ième année Licence
Informatique, Option : Systèmes Informatiques (SI), Semestre
3, issu du canevas proposé par le Comité Pédagogique
National du Domaine mathématiques et informatique.
Intitulé de la Matière : Programmation
Orientée Objet (POO)
Semestre : 3
Objectifs de l’enseignement : Ce cours a pour objectif
l'introduction des concepts de base du langage Java. Il traite
spécialement les thèmes tels que: Technologie orientée objet,
encapsulation, héritage, polymorphisme, translation
dynamique. Le cours développe les notions de base du
langage en particulier: les classes, les objets, les constructeurs,
les méthodes et les variables d'instances, les sous-classes, les
interfaces et l'héritage multiple, les packages et la notion de
visibilité en java, les méthodes et les variables de classe, et les
classes abstraites.
L'étudiant est censé avoir acquis les compétences suivantes :
1- L'essence de la programmation objet en java
2- Lire et comprendre des programmes en java
3- Ecrire la solution d'un problème en java
4- Ecrire des applications sophistiquées (utilisation de
structures de données avancées)
Connaissances préalables recommandées : Connaissance
du langage C souhaitée
Contenu de la matière :
1. Introduction à la Programmation Orienté Objet
a. Notions de base
b. Historique
c. Utilisation des TAD
2. Les classes
81
a. Déclaration des classes
b. Les constructeurs et destructeurs
c. Les méthodes d’accès
d. Encapsulation
3. Héritage et polymorphisme
a. Généralités
b. Surcharge et redéfinition
c. Héritage : Références
d. Polymorphisme
e. Les classes abstraites
4. Interface et implémentation
a. Principe
b. Application
5. Interface graphique et Applet
a. Composants, gestionnaire d’affichage
b. Mise en page
c. Gestion des événements et écouteur
d. Applet
Mode d’évaluation : Continu et Examen
Références :
1. Le site officiel de Sun Microsystems : fr.sun.com/
2. Le livre Penser Java : bruce-
eckel.developpez.com/livres/java/traduction/tij2/
3. Conception objet en java avec bluej de david
barnes. pearson education france
4. Java outside in de Bill Campbell. Cambridge University
press
82