Vous êtes sur la page 1sur 29

POO : JAVA

Pr Sara SEKKATE
Intelligence Articielle & Génie Informatique

2022-2023

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 1 / 26


Initialisation

Les attributs d'une classe sont initialisés par défaut:


numérique : 0
booléen : false
caractère : \u 000
référence : null

L'initialisation à des valeurs données par l'utilisateur se fait dans les constructeurs ou des
blocs d'initialisation.
Rq : Les variables locales à une méthode ne sont pas initialisées par défaut.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 2 / 26


Aectation d'objets

Pour tout type primitif :


Dans une instruction telle que int i=5; la variable contient la valeur de l'entier
Une aectation telle que i=j place la valeur de j dans i
Pour les objets :
Dans une instruction telle que :
Complexe c=new Complexe(1.5,2.5);
c désigne une référence sur un objet
Soit Complexe d = new Complexe(5.2,5.7); l'aectation d=c concerne les références et
non les objets référencés.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 3 / 26


Caractéristiques d'instance/de classe

Un attribut dans une classe peut être


Relatif à une instance particulière de la classe : change avec l'instance
Ex : Rayon de cercle
On l'appelle dans ce cas variable d'instance
Indépendant de toute instance : partagé pour toutes les instances de la classe
On l'appelle dans ce cas : variable de classe
Une variable de classe doit être déclarée static.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 4 / 26


Caractéristiques d'instance/de classe

Les méthodes peuvent être de la même façon, des méthodes d'instances ou des méthodes
de classe (déclarées static)
Les caractéristiques de classe peuvent être appelées sans création d'instance particulière
Elles peuvent être qualiées par le nom de la classe si nécessaire:
Ex: Math.PI, Math.sin(x) ...
Un constructeur ne peut être static.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 5 / 26


Héritage et polymorphisme

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 6 / 26


Relations entre classes

Il existe diérents types de relations pouvant lier des classes :


Association : Relation binaire générale exprimant que deux classes participent à une
certaine activité.
Exemple :

Une association est implémentée en utilisant les attributs et méthodes de classes


c l a s s Etudiant { c l a s s Cours {
p r i v a t e Cours [ ] c o u r s ; private Etudiant [ ] etudiants ;
} }

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 7 / 26


Relations entre classes

Agrégation/Composition : Une agrégation est une association spéciale exprimant une


relation de possession ("has a")
Exemple :

Si le composant ne peut être possédé que par un seul composite, l'agrégation est une
composition.
Dans une composition, la durée de vie du composant est liée à celle du composite.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 8 / 26


Relations entre classes

Une classe fournit un ensemble de services au monde extérieur.


Généralisation: Par généralisation, on peut dénir des classes qui orent les mêmes
services tout en ayant la possibilité de les adapter et d'ajouter de nouveaux services.
Spécialisation : par spécialisation, on peut dénir des classes qui sont des sous-types
d'une classe A.
L'ensemble des valeurs du sous-type constitue un sous-ensemble de celle de A.
Toute opération applicable aux objets de type A, le sera aux objets de type un sous-type
de A.
Un sous-type de A est une sorte de A. Cette relation est implémentée par le mécanisme
de l'héritage.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 9 / 26


Héritage

L'héritage permet de fournir des connaissances pour créer de nouveaux objets à partir
d'objets existants.
C'est un moyen de réutilisation
Terminologie :
A : Classe de base, parent, superclasse
B : Descendant, lle, sous-classe, classe dérivée
B : hérite directement de A
B : héritier direct de A
B : dérive directement de A
B :sous-type de A

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 10 / 26


Héritage

Syntaxe
class Derivee extends Parent {...}

"Derivee" hérite de "Parent" presque toutes les caractéristiques.


Elle ne peut accéder à celles qui sont déclarées "private".
Pour donner un droit d'accès héritier, on peut déclarer des caractéristiques "protected".

Une caractéristique déclarée "protected" dans une classe publique est accessible dans toute
classe du même paquetage, et dans toute sous-classe, même si elle ne se trouve pas dans le
même paquetage.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 11 / 26


Héritage

Un constructeur n'est pas héritable.


Il peut être appelé dans un constructeur de la sous-classe en utilisant le mot réservé
"super".
super() pour appeler un constructeur sans arguments
super(args) pour appeler un constructeur avec arguments
L'instruction "super" doit être la première instruction dans le constructeur de la
sous-classe.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 12 / 26


Héritage

Si un constructeur de la sous-classe n'appelle pas explicitement un constructeur de son


parent, il y a un appel automatique du constructeur par défaut du parent, qui doit exister.
La construction d'une instance d'une classe, commence par l'appel des constructeurs de
tous ses parents dans l'arbre d'héritage, en commençant par la racine.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 13 / 26


Redénition de méthodes

Il est dans certains cas nécessaire de modier(adapter) l'implémentation d'une méthode


héritée.
On parle de redénition ("override")

Règle
Une méthode redénie doit avoir la même signature que la méthode parente, sinon, il
s'agit d'une surcharge.
Le type de retour :
s'il est primitif, il doit être le même
s'il est "référence", il peut être une sous-classe de la classe du type de retour de la méthode
parente.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 14 / 26


Remarques

Dans la redénition d'une méthode, on peut appeler la méthode parente par


l'intermédiaire du mot "super".
super.methodeParente();
Une redénition peut augmenter la visibilité (passer de protected à public) mais ne peut la
diminuer.
Une méthode "static" est héritée mais ne peut être redénie; Si dans une sous-classe on
redénie une méthode static, la redénition masque la méthode du même nom de la classe
parente
Les attributs ne peuvent être redénis; l'existence dans la sous-classe d'un attribut de
même nom qu'un attribut de la classe parente masque ce dernier.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 15 / 26


Plymorphisme/Liaison dynamique

Un attachement peut être


aectation d'une valeur à une variable,
passer une valeur à un paramètre de méthodes,
aecter une valeur à un retour de méthode.

Dans un attachement, le type de la source doit être compatible avec le type de la cible.
Pour les types "référence", le type de la source doit être:
Le même que celui de la cible;
ou un sous-type de celui de la cible;
ou convertible en celui de la cible.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 16 / 26


Type statique/Type dynamique

Le polymorphisme d'objet conduit à distinguer deux notions de type pour chaque objet :
le type dynamique: c'est le type eectif de l'objet en mémoire. Il est déterminé une fois
pour toutes au moment de la création de l'objet avec new.
le type statique de la référence : à un endroit du code, il est utilisé pour manipuler cet
objet.
Le type statique peut varier au cours du programme, en fonction du type des références qui, au
fur et à mesure, sont utilisées pour manipuler l'objet.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 17 / 26


Problème ?

Soient

c l a s s A{ c l a s s B e x t e n d s A{
public void f (){}; public void f (){};
} }
et
A a = new B();

l'appel a.f() est-il relatif à la version f() de A ou de B ?

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 18 / 26


Règle : liaison dynamique

Ce qui détermine la version à utiliser lors de l'appel d'une méthode est le type dynamique
de l'instance cible de l'appel.
Toutefois, le contrôle de la validité de l'appel reste statique: l'appel a.f() produirait une
erreur de compilation si f() n'est pas une méthode de A.
Un appel tel que a.f(); peut exécuter diérents codes suivant le type dynamique de a.
Cette possibilité pour une entité de prendre plusieurs formes est le principe de
polymorphisme.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 19 / 26


Remarques

Si l'instruction A a = new B() est valide, il n'est pas de même de B b = a;.


Il n'y a pas de conversion implicite d'un type en son sous-type.
MAIS, si on est sûr que le type dynamique de a est B, on peut utiliser une conversion
explicite pour valider une telle aectation (conversion non sûre et peut ne pas aboutir).
b = (B) a ;
pour tester le type d'une variable : utilisation de "instanceof"
if(a instanceof B) b = (B) a ;

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 20 / 26


Le mot-clé nal

Le mot-clé nal en Java est un modicateur utilisé pour empêcher la modication d'un code ou
d'une valeur. Il est possible d'utiliser ce mot-clé dans 3 contextes :
Mot-clé nal en tant que modicateur de variable :
Mot clé nal en tant que modicateur de méthode :
Mot-clé nal en tant que modicateur de classe :

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 21 / 26


Le mot-clé nal

Le mot-clé nal en Java est un modicateur utilisé pour empêcher la modication d'un code ou
d'une valeur. Il est possible d'utiliser ce mot-clé dans 3 contextes :
Mot-clé nal en tant que modicateur de variable : lorsqu'il est utilisé avec une variable, il
est spéciquement destiné à empêcher l'utilisateur de modier la valeur. Une variable
déclarée nal, une fois initialisée, sa valeur ne peut être changée.
Mot clé nal en tant que modicateur de méthode :
Mot-clé nal en tant que modicateur de classe :

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 21 / 26


Le mot-clé nal

Le mot-clé nal en Java est un modicateur utilisé pour empêcher la modication d'un code ou
d'une valeur. Il est possible d'utiliser ce mot-clé dans 3 contextes :
Mot-clé nal en tant que modicateur de variable :
Mot clé nal en tant que modicateur de méthode : Une méthode déclarée nal ne peut
être redénie. Ce qui signie que même une sous-classe peut appeler la méthode nal de
la classe parente sans aucun problème, mais elle ne peut la redénir.
Mot-clé nal en tant que modicateur de classe :

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 21 / 26


Le mot-clé nal

Le mot-clé nal en Java est un modicateur utilisé pour empêcher la modication d'un code ou
d'une valeur. Il est possible d'utiliser ce mot-clé dans 3 contextes :
Mot-clé nal en tant que modicateur de variable :
Mot clé nal en tant que modicateur de méthode :
Mot-clé nal en tant que modicateur de classe : il empêche la classe d'être héritée par
une autre classe.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 21 / 26


La classe "Object"

Classe racine de la hiérarchie des classes Java.


Toute classe hérite directement ou indirectement de la classe Object.
Si le développeur ne précise pas de classe parente dans la déclaration d'une classe, alors la
classe hérite implicitement de Object.
La classe Object fournit des méthodes communes à toutes les classes.
Les méthodes dénies dans "Object" sont héritées par toute classe.
Certaines de ces méthodes doivent être redénies dans les classes lles pour fonctionner
correctement.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 22 / 26


Des méthodes de la classe "Object"

public boolean equals(Object obj)

En Java, l'opérateur == sert à comparer les références mais pas les objets.
L'implémentation par défaut de equals fournie par Object compare les références entre
elles. L'implémentation par défaut est donc simplement :

p u b l i c boolean equals ( Object obj ) {


r e t u r n ( t h i s == o b j ) ;
}

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 23 / 26


Des méthodes de la classe "Object"

public int hashCode()

Fournie pour l'utilisation de certains algorithmes, notamment pour l'utilisation de table de


hachage.
Le principe est d'associer un entier à un objet.
Deux objets diérents doivent normalement avoir deux hashcodes diérents (non imposé).
Deux objets égaux doivent avoir le même code.
Donc : chaque fois que "equals" est redénie, il en sera de même de "hashCode".

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 24 / 26


Des méthodes de la classe "Object"

public String toString()

Retourne une chaîne représentant l'objet.


Appelée automatiquement chaque fois qu'une référence sur un objet apparaît dans un
contexte "chaîne de caractères".
Exemple
System.out.println(refObj);
Par défaut l'implémentation de la méthode toString dans la classe Object retourne le type
de l'objet suivi de @ suivi du code de hachage de l'objet.
Il sut de redénir cette méthode pour obtenir la représentation souhaitée.

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 25 / 26


Des méthodes de la classe "Object"

public nal Class<?> getClass()

Retourne le type dynamique de l'instance cible.


L'exemple ci-après, ache le nom complet (c'est-à-dire en incluant son package) de la
classe d'un objet :

V e h i c u l e v = new V e h i c u l e (" C h e v r o l e t " ) ;


System . out . p r i n t l n ( v . g e t C l a s s ( ) . getName ( ) ) ;

Pr S.SEKKATE (IAGI) POO : JAVA 2022-2023 26 / 26

Vous aimerez peut-être aussi