Académique Documents
Professionnel Documents
Culture Documents
• En langage C, nous aurions probablement utilisé une structure pour représenter une liste
participant à l'élection. Elle aurait pu être de la forme suivante :
• struct t_liste {
char nom[15];
long voix;
int sieges;};
• Notion de structure n'existe pas dans le langage Java.
• Remplacer la notion de structure par celle de classe créer une classe pour mémoriser les
informations sur une liste.
Exemple 2
public class BonjourAmis {public static void main(String[] args){
• Règles:
– 1 classe Java = 1 fichier
• Conventions:
- Nom de la classe commence par une majuscule (ex :BonjourAmis )
• Il faut traduire ce code source dans un langage que l’ordinateur (le processeur de l'ordinateur)
peut comprendre (langage natif)
• Il est d’abord traduit (compilé) dans un langage appelé « bytecode » qui est le langage d’une
machine virtuelle (JVM ; Java Virtual Machine)
JVM
• Les systèmes qui veulent pouvoir exécuter un programme Java doivent fournir une JVM
• A l'heure actuelle, tous les systèmes (UNIX, Windows, MacOS ou GNU/Linux) ont
une JVM
• Si un système possède une JVM, il peut exécuter tous les fichiers .class compilés sur n'importe quel
autre système
Avantages de la JVM
• Grâce à sa portabilité, le bytecode d'une classe (petite taille) peut être chargée depuis une
machine distante du réseau, et exécutée par une JVM locale
• Mais les techniques « Just In Time » ou « Hotspot » réduisent ce problème : elles permettent de
compiler en code natif le bytecode des fonctions, de stocker le résultat de cette compilation et
d'exécuter ce code compilé chaque fois que ces fonctions sont invoquées.
• Le but d'un compilateur JIT (Just In Time) est donc d'améliorer les performances de l'exécution du
bytecode.
• Pour les applications qui nécessitent une très grande rapidité d'exécution, on préfère encore les
langages C ou C++
Plate-forme Java
Notion d’objet
• Toute entité identifiable ( concrète ou abstraite) peut être considérée comme un objet
• Un objet réagit à certains messages qu'on lui envoie de l'extérieur ; la façon dont il réagit
détermine le comportement de l'objet
– un comportement
– un état interne
• L’état interne est donné par des valeurs de variables
• Le comportement est donné par des fonctions ou sous-programmes, appelées méthodes
• Les méthodes d’un objet correspondent aux messages qu’on peut lui envoyer : quand un
Exemples :
Objet qui reçoit le message Message envoyé par un autre objet
• objet1.decrisToi();
• employe.setSalaire(1000);
• voiture.demarrer();
• voiture.vaAVitesse(50);
Programmation orientée objet (POO)
• La POO est un paradigme: une manière de "modéliser le monde" avec des objets ayant un état
interne et un comportement, et s'échangeant des messages
• Un programme est constitué d'objets qui collaborent pour fournir les fonctionnalités que l'on
demande à l'application
• Exp:
Opérateurs
• int x = 9, y = 2;
• z = x++ / y; // z = 4 puis x = 10
• z = ++x / y; // x = 11 puis z = 5
• x += y;
– false sinon
Instructions de contrôle
if... else
• if (expressionBooléenne)
{bloc-instructions ou instruction}
else
{bloc-instructions ou instruction}
Expression conditionnelle
• expressionBooléenne ? expression1 :
expression2
• int y = (x%2 == 0) ? x+1 : x;
• est équivalent à:
int y;
if (x%2 == 0)
y = x + 1;
else
y = x;
switch
switch(expression) {
case val1: instructions;
break;
…
case valn: instructions;
break;
default: instructions;
}
• do{
bloc-instructions ou instruction
}while(expressionBooléenne)
for
while (test) {
instructions;
incrément;
}
if (tab[i] == 0) break;
if (tab[i] < 0) continue;
somme += tab[i];
} System.out.println(somme);
if (x == 7) {
System.out.println("Division par zéro!");
a = 1/(x-7);
System.out.println(a);
x++; }
Solution
x=1;
while (x<=10)
{ if (x == 7) { System.out.println("division par 0");
x++;
continue; }
a = 1/(x-7);
System.out.println(a);
x++; }
Notion de classe
• Une classe est un moule (modèle) pour créer des objets
• Les objets créés sont les instances de la classe
• Composition d’une classe:
– variables, ou champs (donnent l’état des instances)
• Quand une instance est créée, son état est conservé dans les variables d’instance
• Les méthodes déterminent le comportement des instances de la classe quand elles reçoivent un
message ; elles peuvent modifier l'état de l'objet
Classes et instances
• Une instance d’une classe est créée par un des constructeurs de la classe
qui servent à:
• Un constructeur:
automatiquement ajouté par Java permettant d’allouer l’espace mémoire pour un objet
• S’il existe au moins un constructeur créé par un utilisateur, le constructeur par défaut n’est plus
considéré
Méthodes
Types de méthode
• Une méthode ressemble à une procédure ou à une fonction dans les autres langages. Elle
se compose d’un en-tête et d’un bloc.
• Il y a des méthodes qui servent à donner accès aux variables depuis l’extérieur de la classe
: – les accesseurs (créer par l’utilisateur) pour lire les valeurs des variables
– les modificateurs pour modifier leur valeur
• Enfin, des méthodes (private) servent de « sous- programmes » utilitaires aux autres
méthodes de la classe
Paramètres d’une méthode
• Souvent les méthodes ou les constructeurs ont besoin qu’on leur passe des données
initiales sous la forme de paramètres
• On doit indiquer le type des paramètres dans la déclaration de la méthode :
setSalaire(double unSalaire) calculerSalaire(int indice, double prime)
• Quand la méthode ou le constructeur n’a pas de paramètre, on ne met rien entre les
parenthèses : getSalaire()
Exemple de méthodes
même nom mais pas le même nombre de paramètres qu’une méthode existante :
• En Java, il est interdit de surcharger une méthode en changeant le type de retour
• Par exemple, il est interdit d'avoir ces deux méthodes dans une classe :
Variables
Types de variables
• Les variables d’instances:
– sont déclarées en dehors de toute méthode
– conservent l’état d’un objet, instance de la classe
– sont accessibles et partagées par toutes les méthodes
• double prime;
• Employe e1;
• Point centre;
Affectation
• L’affectation d’une valeur à une variable est effectuée par l’instruction:
variable = expression;
• L’expression est calculée et ensuite la valeur calculée est affectée à la variable
• Exemple :
x = 3;
x = x + 1;
Initialisation d’une variable
• Une variable doit être initialisée (recevoir une valeur) avant d’être utilisée dans une
expression
• Si elles ne sont pas initialisées par le programmeur, les variables d’instance reçoivent les
valeurs par défaut de leur type (0 pour les types numériques, par exemple)
• L’utilisation d’une variable locale non initialisée provoque une erreur (pas d’initialisation
par défaut)
• On peut initialiser une variable en la déclarant
Déclaration / création
• « Employe e1; »
– déclare que l’on va utiliser une variable e1 qui référencera un objet de la classe Employe,
e1.setSalaire(1200);
...
} Création
• Par exemple:
System.out.println(c1.rayon); // affiche 10
• Remarque : le plus souvent les variables (Exp rayon) sont private et on ne peut y accéder
directement en dehors de leur classe
• Java permet plusieurs degrés d’encapsulation pour les membres (variables et méthodes)
et les constructeurs d’une classe
Mot-clé « this »
This
• Le code d’une méthode d’instance désigne
– l’instance courante, par le mot-clé this
– donc, les membres de l’instance courante en
les préfixant par « this. »
• this est optionnel pour désigner un membre de l’instance courante, lorsqu’il
n’y a pas d'ambiguïté
Exemple de this implicite
this explicite
• this est utilisé dans les cas suivants:
– pour distinguer une variable d’instance et un paramètre qui ont le même nom :
this.salaire = salaire; }
– l’objet veut passer une référence de lui même à un autre objet : salaire =
comptable.calculeSalaire(this); L’employé demande au
Comptable « calcule mon salaire »
this explicite
{nom=n; salaire=s;}
public Employe()
• Certaines variables peuvent être partagées par toutes les instances d’une classe. Ce sont les
variables de classe (mot clé: static en Java)
• Si une variable de classe est initialisée dans sa déclaration, cette initialisation est exécutée une
seule fois quand la classe est chargée en mémoire: une seule instance existe pour tous les objets de
la classe
// Constructeur
nom = n;
prenom = p;
Méthodes de classe
• Exp:
Pourquoi ?
• La méthode main() est exécutée au début du programme. Aucune instance n’est donc déjà
créée lorsque la méthode main() commence son exécution. Ça ne peut donc pas être une
méthode d’instance.
classe :
int n = Employe.calculNbEmploye()
• Les blocs static permettent d’initialiser les variables static trop complexes à initialiser dans leur
déclaration :
class UneClasse {
static {
for (int i = 0; i < 25; i++) { Ici je veux initialiser un tableau static à -1
tab[i] = -1;
...
• Ils sont exécutés une seule fois, quand la classe est chargée en mémoire
• Une variable dont le type est une classe contient une référence à un objet
• Une référence est un «pointeur caché» sur un objet créé dynamiquement en mémoire
• Lorsque l’objet n’est plus référencé, un « ramasse-miettes » (garbage collector) libère la mémoire
qui lui a été allouée
int m() {
A a1, a2;
a1 = new A();
a2 = a1;
...
}
• Que se passe-t-il lorsque la méthode m() est appelée ?
Références
int m() {
A a1,a2;
a1 = new A();
a2 = a1;}
Références
int m() {
A a1,a2;
a1 = new A();
a2 = a1;
int m() {
A a1,a2;
a1 = new A();
a2 = a1;
int m() {
A a1,a2;
a1 = new A();
a2 = a1;
Après l’exécution de la méthode m(), l’instance de A n’est plus référencée mais reste dans le tas
...le ramasse-miette interviendra à un moment aléatoire...
Ramasse-miettes
• Java ne dispose pas de mot-clés « delete » ou « free » pour libérer la mémoire allouée
dynamiquement par l’appel à « new »
– travaille en arrière-plan
• Il intervient
Les « finaliseurs »
• La méthode finalize() s'occupe de libérer les ressources nécessaires à un objet. Cette méthode est
appelée automatiquement par le ramasse-miettes lorsque l'instance n'est plus nécessaire. Cela peut
intervenir bien après la perte de l'objet.
Constantes nommées
• Le mot-clé final indique que la valeur de la variable (d'état ou locale) ne peut être
modifiée : on pourra lui donner une valeur une seule fois dans le programme (à la
déclaration ou ensuite)
• Une variable de classe static final est vraiment constante dans tout le programme ;
• Une variable d’instance (pas static) final est constante pour chaque instance ; mais elle
• Une variable d'instance final peut ne pas être initialisée à sa déclaration mais elle doit avoir
Variable final
• Si la variable référence un objet, elle ne pourra référencer un autre objet mais l’état de l’objet
pourra être modifié:
–...
– e.setSalaire(1200); // Autorisé !
– e = e2; // Interdit
• Dans certains cas, il est nécessaire de forcer le programme à considérer une expression
comme étant d’un type qui n’est pas son type réel ou déclaré
(type-forcé) expression
int x = 10, y = 3;
Casts autorisés
• Un cast entre types primitifs peut occasionner une perte de données : Par exemple, la conversion
d'un int (4 octets) vers un short (2 octets)
• Un cast peut provoquer une simple perte de précision: Par exemple, la conversion d'un long vers
un float peut faire perdre des chiffres significatifs mais pas l'ordre de grandeur
• Les affectations entre types primitifs peuvent utiliser un cast implicite si elles ne peuvent
• Exemples :
"petit"
• Le cast d'un nombre à virgule en un nombre entier tronque le nombre (ne l'arrondit pas) :
• int d = (int)1.99; // d = 1
• Un objet d’une classe peut également être converti en un objet d’une autre classe, à une
condition : les classes en question doivent être liées par le mécanisme de l’héritage
• Mis à part cette restriction, le mécanisme de conversion est identique à celui utilisé pour
• Voici un exemple de conversion d’une instance de la classe « sapin » vers la classe « arbre »
arbre »):
Sapin s ;
Arbre a ;
La classe Object
• Toutes les classes Java héritent d’une classe de base unique : la classe Object du package
java.lang. Ainsi, la classe Object est la superclasse de toutes les classes Java.
CloneNotSupportedException,
...
getClasse()
• La méthode getClasse() renvoie un objet de la classe Class qui représente la classe de l’objet.
equals()
• La méthode equals() implémente une comparaison par défaut. Sa définition dans Object compare
les références : donc obj1.equals(obj2) ne renverra true que si obj1 et obj2 désignent le même objet.
• Dans une sous classe (classe fille) de Object, pour laquelle on a besoin de pouvoir dire que deux
objets distincts peuvent être égaux, il faut redéfinir la méthode equals héritée de Object
toString()
• L'implémentation par défaut de la méthode toString() retourne une chaîne de caractère
construites à partir du nom de la classe et de la valeur de hash de l'instance:
Integer.toHexString(hashCode()); } }
...
clone ()
• Le "clonage" d'un objet pourrait se définir comme la création d'une copie de cet objet.
• Object obj1=obj2.clone();
Paquetages
Définition d’un paquetage
• Les classes Java sont regroupées en paquetages (packages en anglais)
• Ils correspondent aux « bibliothèques » des autres langages comme le langage C,
Fortran,Ada, etc...
• Les paquetages permettent :
– de réunir des classes suivant un centre d’intérêt
commun
– la protection des attributs et des méthodes
Principaux paquetages
• java.lang : classes de base de Java
• java.util : utilitaires (Vector, ArrayList,...)
• java.io : entrées-sorties
•...
import java.util.*;
• Dans beaucoup de langages une chaîne de caractère n'est qu'un tableau de caractères,
alors qu'en Java elle est considérée comme étant un objet
• Cette classe sert à créer, stocker et gérer des chaînes de caractères
• Java propose 2 classes relatives aux chaînes de caractères:
• La classe String (chaîne de caractères non modifiables)
• La classe StringBuffer (chaîne de caractères modifiables à volonté)
1.1 Constructeurs
• La classe String dispose de deux constructeurs:
– String ch1 = new String () ; // ch1 contient la reference a une chaine vide
– String ch2 = new String("hello") ; // ch2 contient la reference a une chaine contenant la
suite "hello"
– String ch3 = new String(ch2) ; // ch3 contient la reference a une chaine copie de ch2, donc
contenant "hello"1
• Les objets de type String ne sont pas modifiables mais nous avons vu qu’il était possible de les
employer pour effectuer la plupart des manipulations de chaînes. Cependant, la moindre
modification d’une chaîne ne peut se faire qu’en créant une nouvelle chaîne
• Java dispose d’une classe StringBuffer destinée elle aussi à la manipulation de chaînes, mais dans
laquelle les objets sont modifiables
1.4 La classe StringBuffer
• La classe StringBuffer possède les méthodes :
– de modification d’un caractère de rang donné : setCharAt,
– d’accès à un caractère de rang donné : charAt,
– d’ajout d’une chaîne en fin : la méthode append accepte des arguments de tout type primitif et de
type String,
– d’insertion d’une chaîne en un emplacement donné : insert,
– de remplacement d’une partie par une chaîne donnée : replace,
– de conversion de StringBuffer en String : toString.
• Exp:
class TesterStringBuffer
{ public static void main (String args[])
{ String ch = "la java" ;
StringBuffer chBuf = new StringBuffer (ch) ; // chBuf contient «la java »
chBuf.setCharAt (3, ’J’); // chBuf contient « la Java »
chBuf.setCharAt (1, ’e’) ; // chBuf contient « le Java »
chBuf.append (" 2") ; // chBuf contient « le Java 2 »
chBuf.insert (3, "langage ") ; // chBuf contient « le langage Java 2 »
}}
2. Exercice d’application
• Écrire un programme qui lit au clavier un verbe du premier groupe (il s’assurera qu’il est bien
terminé par er) et qui en affiche la conjugaison au présent de l’indicatif. On supposera qu’il s’agit
d’un verbe régulier. Autrement dit, on admettra que l’utilisateur ne fournit pas un verbe tel que
manger (dans ce cas, le programme affichera nous mangons!).
• Les résultats se présenteront ainsi :
donnez un verbe regulier du premier groupe :
dire
*** il ne se termine pas par er - donnez-en un autre : chanter
je chante
tu chantes
il/elle chante
nous chantons
vous chantez
ils/elles chantent
3. Solution
• On lira bien sûr le verbe sous la forme d’une chaîne de caractères. À l’aide de la méthode
substring, on en extrait la fin qu’on compare avec la chaîne "er".
• Les différentes personnes de la conjugaison s’obtiennent en ajoutant au verbe, privé de
ses deux derniers caractères, l’une des terminaisons voulues fournies ici par un tableau de chaînes
terminaisons. On les fait précéder d’un sujet extrait, lui aussi, d’un tableau de chaînes Cours
Programmation Avancée sujets.
public class Conjug
{ public static void main (String args[])
{ final String sujets[] =
{ "je", "tu", "il/elle", "nous", "vous", "ils/elles"} ;
final String terminaisons [] =
{ "e", "es", "e", "ons", "ez", "ent" } ;
String verbe ;
int nbLettres ;
System.out.print ("donnez un verbe regulier du premier groupe : ") ;
while (true)
{ verbe = Clavier.lireString() ;
nbLettres = verbe.length() ;
String fin = verbe.substring (nbLettres-2, nbLettres) ;
if (fin.equals("er")) break ;
System.out.print
("*** il ne se termine pas par er - donnez-en un autre : ") ;
}
String rad = verbe.substring(0, nbLettres-2) ;
int n = terminaisons.length ;
for (int i=0 ; i<n ; i++)
System.out.println (sujets[i] + " " + rad + terminaisons[i]) ; }
Chapitre 5 Conteneurs
Tableaux
Particularités sur les tableaux
• En Java les tableaux sont considérés comme des objets (dont la classe hérite de Object) :
– les variables de type tableau contiennent des références aux tableaux
– les tableaux sont créés par l’opérateur new
– ils ont une variable d’instance : length
– ils héritent des méthodes d’instance de Object
• Cependant, Java a une syntaxe particulière pour:
– la déclaration des tableaux
– leurs initialisations
Déclaration et création des tableaux
• Déclaration : la taille n’est pas fixée:
int[] tabEntiers; ou int tabEntiers[];
• Création : on doit donner la taille:
tabEntiers = new int[5];
• La taille ne pourra plus être modifiée par la suite
Faux
Utilisation d’un tableau d’objets
Employe[] personnel = new Employe[100];
personnel[0] = new Employe ();
personnel[0].setNom("BenSalah");
Juste
Copier une partie d'un tableau dans un autre
• On peut copier les éléments un à un mais la classe System fournit une méthode static plus
performante :
• public static void arraycopy (Object tab_src, int ind_1er_élém_copié, Object tab_dest, int
tab_dest_ ind_1er_élém_copié, int nb_élém_copiés)
Comparer 2 tableaux
• On peut comparer l'égalité de 2 tableaux (au sens où ils contiennent les mêmes valeurs)
en comparant les éléments un à un
• On peut aussi utiliser la méthode static à 2 arguments de type tableau
java.util.Arrays.equals(type []a, type []b)
Tableaux à plusieurs dimensions
• Déclaration: int[][] notes;
• Création:
notes = new int[30][3]; // 3 notes, 30 étudiants
• Déclaration, création et initialisation et affectation
int[][] notes = { {10, 11, 9}, {15, 8, 10} ,...}
int x = notes [1][0] ; // x= 15
Remarques importantes
• Tout accès hors des limites d’un tableau lève une exception
• Les classes « Vector » et « ArrayList » (du package java. util) sont des tableaux qui peuvent
contenir des objets de types différents et sont redimensionnable
• boolean contains(Object obj): vérifier si une instance existe dans une liste.
Classe ArrayList
• La classe ArrayList offre des fonctionnalités d’accès rapide comparables à celles d’un
tableau d’objets
• Av: cette classe offre plus de souplesse que les tableaux d’objets dans la mesure où sa
taille (son nombre d’éléments) peut varier au fil de l’exécution (comme celle de n’importe
quelle collection)
• Inconvénient: Mais pour que l’accès direct à un élément de rang donné soit possible, il est
nécessaire que les emplacements des objets (plutôt de leurs références) soient contigus en
mémoire (à la manière de ceux d’un tableau). Aussi cette classe souffrira d’une lacune
inhérente à sa nature : l’addition ou la suppression d’un objet à une position donnée
ne pourra plus se faire en O(1) mais seulement en moyenne en O(N)
Quelques méthodes de la classe ArrayList
• Boolean add(Object obj): ajouter un élément à la fin de la liste. Si l’opération est reussit elle
• int size()
Classe LinkedList
• La classe LinkedList permet de manipuler des listes dites "doublement chaînées "
• Av: Le grand avantage d’une telle structure est de permettre des ajouts ou des
suppressions à une position donnée avec une efficacité en O(1) (ceci grâce à un simple jeu
de modification de références)
• Limite: En revanche, l’accès à un élément en fonction de sa valeur ou de sa position dans
la liste sera peu efficace puisqu’il nécessitera obligatoirement de parcourir une partie de la
liste. L’efficacité sera donc en moyenne en O(N)
Tableau comparatif
Remarque
• Contrairement aux LinkedLists, les ArrayLists sont rapides en lecture, même avec
un gros volume d'objets. Elles sont cependant plus lentes si vous devez ajouter ou
supprimer des données en milieu de liste. Pour résumer à l'extrême, si vous
effectuez beaucoup de lectures sans vous soucier de l'ordre des éléments, optez
pour une ArrayList ; en revanche, si vous insérez beaucoup de données au milieu de
la liste, optez pour une Linkedlist.
Exemple : ArrayList
• Package: import java.util.ArrayList;
• Déclaration: ArrayList<Employe> maListe= new ArrayList<Employe> ();
• Utilisation:
• int long= maListe.size();
get(int i)
• La fonction suivante permet de calculer la somme des éléments d’une ArrayList d’entiers :
• public static int somme(ArrayList<Integer> liste) {
int s=0;
for (int i= 0; i < liste.size(); i++) {
s= s + liste.get(i); }
return s;
}
add(Type element)
• ajoute un élément à la fin de la liste. Pour construire la liste [2,3,5, 7, 11], on écrira donc :
ArrayList<Integer> l= new ArrayList<Integer> ();
l.add(2); l.add(3); l.add(5); l.add(7); l.add(11);
Chapitre 6 Notion d’héritage, classe abstraite et interface
Héritage
Définition
• L’héritage est un mécanisme qui facilite l’écriture des classes et permet de rendre plus compact le
code source d’un programme. Le concept est le suivant : toutes les classes font partie d’une
hiérarchie stricte. Chaque classe possède des super-classes et un nombre quelconque de sous-
classes. Les sous-classes héritent des attributs et des comportements de leurs super-classes, ce qui
permet de ne pas réécrire le code concerné
• En Java, la classe Object se trouve au sommet de la hiérarchie des classes. Toutes les classes
héritent de cette super-classe
L’utilisation de l’héritage
• Si l'on regarde le code de la classe Cercle et celui de la classe Carre, on se rend compte
immédiatement de la similitude de la plupart des champs et des comportements
• L’héritage nous permet de regrouper des champs et des comportements communs dans une
super-classe (appelons-là Forme) dont les classes Cercle et Carre vont dériver. On dit encore que les
classes Cercle et Carre héritent des champs et des méthodes de la classe Forme
• En Java, pour signifier qu’une classe hérite d’une autre on utilise le mot-clé extends. Par
exemple, si la classe Cercle hérite de la classe Forme on écrira :
class Cercle extends Forme {
...
}
Avantages de l’héritage
• L'héritage supprime, en grande partie, les redondances dans le code. Une fois la
hiérarchie de classes bien établie, on localise en un point unique les sections de code
(celles-ci restant à tous moments accessibles grâce au mot clé super)
• Il est possible de rajouter facilement une classe, et ce à moindre coût, puisque l'on peutréutiliser le
code des classes parentes
L’héritage multiple
• La forme d’héritage étudiée précédemment s’appelle « l’héritage simple ». Dans un tel
héritage, chaque classe Java a une seule super- classe directe
• Dans d’autres langages (notamment en C++), les classes peuvent avoir plusieurs super-classes.
Elles héritent alors de la combinaison des variables et des méthodes de toutes leurs super-
classes. Cela s’appelle « l’héritage multiple »
• l’héritage multiple est un mécanisme puissant mais très complexe qui alourdit souvent le
code. Pour cette raison, Java se limite à l’héritage simple. Nous verrons par la suite qu’il est possible
de simuler l‘héritage multiple sans en avoir les inconvénients grâce au concept d’interface
Remarques
• Le mot-clé «protected» permet d’affiner la visibilité des variables et des méthodes des
classes «parent» (la classe elle-même et ses filles peuvent voir ces variables/méthodes)
protected
• Il s’agit d’une forme de protection entre classe et sous-classes. Le mot-clé protected signifie
que des méthodes et des variables d’une classe donnée demeurent accessibles à toute
classe du même package (différence avec C++), mais ne sont accessibles, en dehors du
package, qu’aux sous-classes de la classe à laquelle elles appartiennent
Résumé
Polymorphisme
Principe du polymorphisme
• Un même message envoyé vers divers objets peut déclencher des actions (méthodes)
pouvant prendre des formes différentes
• Le choix de la méthode à déclencher est effectué au moment de l’exécution. On parle
de liaison dynamique
EXEMPLES
• Le polymorphisme autorise la référence et l'objet à être de types différents: Objet monObj = new
Cercle ();
• Avec le polymorphisme le type de la référence peut être du type de la superclasse de l'objet.
• Exemple : Il est possible de créer des tableaux polymorphes.
Objet [] z = new Objet [3];
z [0] = new Cercle ();
z [1] = new Rectangle();
z [2] = new Ligne();
for ( int i = 0; i < z. length ; i ++) {
z [i]. afficher(); }
• Grâce à l'héritage et au polymorphisme, une seule et même méthode peut être utilisée pour
plusieurs objets de types différents.
Classe abstraite
• Définition
• Les classes abstraites sont des classes dont le seul but est de fournir des informations
communes aux sous-classes
• Les classes abstraites n’ont pas d’instance, mais peuvent contenir tout ce qu’une classe
normale peut contenir (attributs et méthodes...)
• Une méthode abstraite est une méthode sans code devant absolument être redéfinie dans
une des sous-classes
• Une classe abstraite contient au moins une méthode abstraite et ne peut être instanciée
• Définie par le mot mot-clé « abstract »
Exemple
• Déclaration
public abstract class ObjetGraphique {
public Color couleur ;
public abstract void dessiner ( Graphics g ) ;
public void setCouleur(Color c ) { couleur = c ; }
public Color getCouleur( ) { return couleur ; }
}
• Utilisation
public class CercleGraphique extends
ObjetGraphique {
public void dessiner (Graphics g ) {
g.DrawOval( x, y, r, r ) ;
}
}
public class RectangleGraphique extends
ObjetGraphique {
public void dessiner (Graphics g ) {
g.DrawRect( x, y, l, h ) ;
}
}
Interface
Définition
• Le mécanisme de l’interface est une généralisation du concept de classe abstraite.
Plus précisément, une interface est une classe dont toutes les méthodes sont abstraites. On
n'a donc plus besoin de spécifier que les méthodes sont abstraites car elle doivent forcément l'être
• on introduit une interface non plus par le mot clé class mais par le mot interface
• bien que les interfaces bénéficient aussi du mécanisme de l’héritage, on n'hérite pas d'une
interface, mais on l'implémente. En d'autres termes, on doit forcément fournir le code de toutes les
méthodes de l'interface utilisée (sauf dans le cas d'une classe abstraite qui implémente une
interface, ou bien d'une interface dérivée d'une autre)
• On utilise le mot-clé implements (et non extends) pour signifier qu’on implémente une interface
• Une interface ne peut pas être instanciée
EXEMPLE
Remarque
abstraites et une interface réside dans le fait que l'on ne peut hériter que
d'une seule
• Les instances de la classe Error sont des erreurs internes à la machine virtuelle Java. Elles sont
rares et fatales. L'application Java s'arrête instantanément dès l'apparition d'une exception de la
classe Error.
• Les sous-classes de la classe Exception (moins graves ) sont réparties en deux catégories :
– les exceptions d’exécution (runtime) sont souvent l’effet du manque de robustesse du code. Par
exemple, l’exception NullPointerException est levée lorsqu’on manipule un objet non instancié
(oubli de l’instruction new)
– les autres exceptions correspondent à des événements anormaux échappant au contrôle du
programme. Par exemple, l’exception EOFException est levée si on essaie de lire au-delà
d’un fichier
Intercepter une exception : le mot clé throws
• Si une méthode est susceptible de lever une exception et si elle ne peut pas la traiter, elle
se doit de prévenir le système
• Pour ce faire, on utilise le mot clé throws dans la définition de la méthode. Ce mot clé
permet d'avertir le système qu'une certaine catégorie d'exception ne sera pas traitée en local (la
méthode lève seulement l’exception et ne la traite pas)
• Intérêts:
• Contraintes:
– Traitements ralentis