Programmation Orientée Objet

publicité
1
Université de la Manouba
Ecole Supérieure de Commerce Electronique
Programmation Orientée Objet
(3ème + 4ème Séance)
2ème année E-Serv et E-Com
2009/2010
Réalisé par : Nabil KHEMIRI
[email protected]
2
Plan
•
•
•
•
•
•
•
•
La notion de package
La surcharge
L'héritage
super() et super
La classe Object
Les classes "enveloppe" (Wrappers)
Héritage et organisation
Le typage dynamique
3
La notion de package
4
Package (1)
•
Un package permet de regrouper des classes : bibliothèque de
classes.
•
On regroupe dans un package des classes ayant une thématique
et/ou des fonctionnalités communes.
•
un package contient des classes et des sous-packages
•
utiliser des packages améliore la sécurité d’utilisation des
classes en renforçant l’encapsulation.
5
Package (2)
6
Package (3)

Principaux packages Java:









java.lang Les classes de base et la gestion des processus
java.util Des structures de données bien pratiques
java.io La gestion des flux comme l'accès aux fichiers
java.math Calcul sur des nombres infinis
java.awt Des composants graphiques : boutons, fenêtres ...
java.applet Tout pour faire des applets java.net L'accès au réseau
IP
javax.swing Des composants graphiques sophistiqués : arbre ...
java.sql La connexion aux bases de données relationnelles en SQL
java.security Tout pour faire des transactions sécurisées
7
Package (4)
•
Importation des packages Java (toujours avant la déclaration
d’une classe):
Exemple: import java.awt.*;
•
Pour déclarer qu’une classe appartient `a un package, il faut
déclarer ce package en entête du fichier source :
package nom package.nom sous package ;
8
La surcharge
9
La surcharge

On appelle surcharge le fait d’avoir plusieurs méthodes qui ont
le même nom au sein de la même classe.

Les exemplaires de la méthode ont des paramètres différents
Ils peuvent avoir le même type de retour.


Par contre, impossible d’avoir des types de retour différents pour
les mêmes paramètres.
10
Surcharge : exemple
class Additionneur {
public static int somme(int a, int b) // 1
{
return (a+b);
}
public static int somme(int a, int b, int c) // 2
{
return (a+b+c);
}
public static float somme(float a, float b) // 3
{
return (a+b);
}
public static float somme(int a, int b) // interdit à cause de 1
{
return ((float)a+(float)b);
}
}
11
L'héritage
12
L'héritage

On peut souvent classer les objets dans des
arborescences de type de plus en plus génériques.
Mot
Adj
V_Transitif
prendre
Verbe
Nom
V_Intransitif
dormir
13
Un cas concret
 La classe Voiture représente toutes sortes de voitures
possibles.
 On pourrait définir un camion comme une voiture très
longue, très haute, etc.
 Mais un camion a des spécificités vis-à-vis des voitures :
remorque…etc.
 On pourrait créer une classe Camion qui ressemble à la
classe Voiture.
 Mais on ne veut pas réécrire tout ce qu'elles ont en
commun.
Solution
14
Vehicule
Voiture


Camion
La classe Vehicule contient tout ce qu'il y a de
commun à Camion et Voiture.
Camion ne contient que ce qu'il y a de spécifique
aux camions.
Objectif de l'héritage

On souhaite ne décrire qu'une seule fois le même
traitement lorsqu'il s'applique à plusieurs classes.




Evite de recopier (notamment les modifications).
On crée une classe plus générique à laquelle s'applique le
traitement.
Toutes les classes plus spécifiques, héritant de cette
classe, héritent de ce traitement, elles peuvent
l'exécuter.
Les classes filles contiennent d'autres traitements
plus spécifiques.
15
Usage de l'héritage (1)
•
Dans l’en-tête da la classe dérivée, le mot clé
extends sert à préciser la classe mère.
•
Une classe dérivée peut avoir une seule classe
mère.
•
Les classes avec les modificateur final ne peuvent
pas être des classes mères.
16
Usage de l'héritage: important (2)
•
•
Une classe ne peut pas être privée
private class toto {}
Une classe ne peut pas être protégée
protected class toto {}
17
Usage de l'héritage (3)




Une classe spécifique hérite des méthodes et des
attributs de sa classe mère (sauf ceux qui sont
privés).
On n'a pas besoin de les réécrire pour la classe fille.
On peut cependant redéfinir une méthode de la
classe mère dans la classe fille (de même
signature).
Le constructeur d'un objet doit toujours commencer
par appeler le constructeur de sa classe mère.
18
Usage de l'héritage: exemple (4)

Un objet de type Voiture peut utiliser toutes les
méthodes de la classe Vehicule.

Il doit disposer d’une valeur pour tous les attributs
de la classe Vehicule.

A tout moment, une méthode qui utilise un objet de
type Vehicule peut manipuler un objet de type
Voiture à la place de Vehicule.

Cette dernière propriété est le polymorphisme.
19
Exemple 1
public class EtreHumain {
public boolean sexe;
public String nom;
public String profession;
// Constructeur
public EtreHumain(boolean s, String n, String p) {
sexe = s;
nom = n;
profession = p;}
classe mère (superclass)
public void sePresenter() {
String s = (sexe) ? "homme" : "femme";
System.out.println("Mon nom est : " +nom);
System.out.println("Je suis un(e) " + s);
System.out.println("Ma profession : "
+ profession+"\n");}
}.
20
Exemple (suite)
classe dérivée (classe fille)
public class Etudiant extends EtreHumain
classe mère
{
(superclass)
int numEtudiant;
// Constructeur
public Etudiant (boolean s, String n, String p, int numE) {
super (s,n,"etudiant");
numEtudiant = numE;
appel du constructeur
}
de la classe mère
}
21
Exemple (suite)
public class ClasseMain {
public static void main(String[] args) {
EtreHumain il = new EtreHumain(true, "Ali" , "enseignant" );
il.sePresenter();
Etudiant elle = new Etudiant(false,"Alia", " etudiant ", 000963);
elle.sePresenter();
}
22
23
super() et super
La méthode super()
•
•
•
•
•
super() permet d'appeler le constructeur de la
classe mère.
C'est la première chose à faire dans la construction
d'une sous-classe.
Appeler le constructeur de la classe mère garantit
que l’on peut initialiser les arguments de la classe
mère.
On passe les paramètres nécessaires.
Si l’on n’indique pas super(), appel du constructeur
par défaut de la classe mère.
24
Le mot clef super

super. est une référence sur l'objet père.

super.Methode() permet d'appeler la
méthodeMethode() de la classe mère.
réutiliser le code de méthodes héritées.

On peut accéder à un attribut hérité en écrivant:
super.Attribut ou directement par Attribut.
25
26
super : exemple 1
27
super : exemple 2
Appel implicite du constructeur de la classe
mère : exemple
class Vehicule {
// Vehicule() {}
}
class Voiture extends Vehicule {
int
nbPortes;
double
longueur;
}
Voiture(double lg, int nbP)
{
// super();
longueur = lg;
nbPortes = nbP;
}
28
Exercice
•
Ecrire une classe Animal qui dispose d’un attribut
entier nbPattes. Cette classe dispose des méthodes
suivantes :
–
–
–
•
•
•
le constructeur, qui prend en argument un entier (le
nombre de pattes).
String toString(), qui renvoie une chaîne de caractères
contenant le nombre de pattes de l’animal.
affiche() qui affiche le nombre de pattes de l’animal
(appeler la méthode toString().
Ecrire une classe Poule qui hérite de Animal
Ecrire une classe Lapin qui hérite de Animal
Ecrire une classe Main dans laquelle la méthode
main() crée un Lapin et une Poule.
29
Corrigé (1)
•
La classe Animal :
class Animal
{
protected int nbPattes;
Animal(int nb){//constructeur
nbPattes = nb;
}
//accesseur
public int getNbPattes(){return nbPattes;}
//modifieur
public void setNbPattes(int nb){nbPattes = nb;}
public String toString() {
return "Ceci est un animal doté de " + getNbPattes() + " pattes";
}
public void affiche(){
System.out.println(toString());
}
}
30
Corrigé (2)
•
Les classes Poule et Lapin :
class Poule extends Animal
{
Poule(int nb){//constructeur
super(nb);
}
public String toString() {
return "Ceci est une poule dotée de " + getNbPattes() + " pattes";
}
}
class Lapin extends Animal
{
Lapin(int nb){//constructeur
super(nb);
}
public String toString() {
return "Ceci est un lapin doté de " + getNbPattes() + " pattes";
}
}
31
Corrigé (3)
•
La classe Main :
class Main
{
public static void main(String args[])
{
Poule a = new Poule(2);
Lapin b = new Lapin(4);
a.affiche();
b.affiche();
}
}
32
33
Héritage
et appel de méthodes
Appel de méthodes (1)
class Vehicule {
void demarrer()
{…}
}
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}

class Voiture extends Vehicule{
void demarrer()
{…}
}
Méthode appelée ici
Java commence par chercher la méthode dans la
classe de l'objet créé.
34
Appel de méthodes (2)
class Vehicule {
void demarrer()
{…}
}
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.demarrer();
}
}

class Voiture extends Vehicule{
}
Méthode appelée ici
Si la méthode n'existe pas dans la classe de l'objet
créé, il va chercher dans la classe mère.
35
Appel de méthodes (3)
class Vehicule {
void demarrer()
{…}
}
class Main {
public static void main(String args[]){
Voiture v = new Voiture();
v.super.demarrer();
}
}

class Voiture extends Vehicule{
void demarrer()
{…}
}
Méthode appelée ici
Pour appeler directement la méthode de la classe
mère, utiliser le mot clef super.
36
37
Héritage et visibilité
Héritage et visibilité
•
Une classe fille hérite des attributs et méthodes public et
protected de la classe mère.
•
Elle n’hérite pas des attributs et méthodes private.
•
Un objet d’une classe mère n’hérite pas des attributs et
méthodes de ses classes filles.
38
Visibilité : exemple
class Vehicule {
protected double
}
longueur;
class Voiture extends Vehicule {
}

…
protected int nbPortes;
On peut utiliser l’attribut longueur dans Vehicule et dans
Voiture
39
Final






Une classe déclarée final ne peut plus être étendue
Cela signifie qu'aucune autre classe ne peut en hériter
Une méthode déclarée final ne peut plus être dérivée
par des sous-classes de la classe dont elle provient.
Intérêt 1 : cela permet d'interdire la redéfinition d'une
méthode par le biais de l'héritage
Exemple : final boolean checkPassword()
Intérêt 2 : cela permet de gagner du temps à la
compilation.
Une variable ou un attribut déclarés final sont
constants => le compilateur interdit de les modifier.
40
Références
•
•
•
•
41
Arnaud Lanoix, Universit´e Nancy 2 (2006), cours Langages
Orientés Objet – Java,
http://kalysto.org/~nono/teaching/Java/04-package.pdf
Abdel Belaïd, Universit´e Nancy 2 (2009-2010), cours Java,
http://www.loria.fr/~abelaid/Enseignement/licPro/Cours5-heritage.pd
Kiss Balint, www.fsz.bme.hu/~bkiss/InfoII/
Gaetan Dussaux, Formation Java2 (2000),
http://gaetan.dussaux.free.fr/cours/java/
Téléchargement