Vous êtes sur la page 1sur 4

Glossaire du jour : Problème introductif … Retour sur le problème introductif …

 Héritage
 Redéfinition
 extends  Considérons deux concepts : une sphère et un ballon  Considérons deux concepts : une sphère et un ballon
 super
 Polymorphisme
 abstract
 Hypothèses :  Hypothèses :
– Une sphère a un rayon. On peut calculer sa surface. – Une sphère a un rayon. On peut calculer sa surface.
– Un ballon est une sphère ayant une couleur, une texture et – Un ballon est une sphère ayant une couleur, une texture et
une pression. Il peut être gonflé. une pression. Il peut être gonflé.

Quelques bases sur Héritage  Répondez aux questions suivantes :  Répondez aux questions suivantes :
la programmation – Un ballon a-t-il un rayon ? – Un ballon a-t-il un rayon ? Oui, car ballon ⊆ sphère

orientée objet – Peut on calculer la surface d'un ballon ? – Peut on calculer la surface d'un ballon ? Idem
– Une sphère a-t-elle une pression ? – Une sphère a-t-elle une pression ? Non, car pression  sphère

3 / 51 4 / 51
Exemple/Démo Exemple/Démo

Définition d'une sphère Définition d'un ballon Définition d'un ballon Définition d'un ballon

 Une sphère a un rayon.  Ballon = sphère + couleur + texture + pression.  Ballon = sphère + couleur + texture + pression.  Ballon = sphère + couleur + texture + pression.
 On peut calculer sa surface  Il peut être gonflé.  Il peut être gonflé.  Il peut être gonflé.
public class Ballon extends Sphere{ public class Ballon extends Sphere{ public class Ballon extends Sphere{
private String couleur; private String couleur; private String couleur;
public class Sphere { private String texture; private String texture; private String texture;
private double rayon; private double pression; private double pression; private double pression;
private double rayon; private double rayon; private double rayon; En tant que Sphere, un ballon a déjà un rayon
public Sphere (double r){ (Par héritage)
rayon=r ; public Ballon (String c, String t, double p, double r){ public Ballon (String c, String t, double p, double r){ public Ballon (String c, String t, double p, double r){
} couleur = c ; couleur = c ; couleur = c ;
texture = t ; texture = t ; texture = t ;
public double getSurface() { pression = p ; pression = p ; pression = p ;
return 4*Math.PI*rayon*rayon; rayon = r ; rayon = r ; rayon = r ;
} } } }
}
public void gonfler(double p) { public void gonfler(double p) { public void gonfler(double p) {
pression = pression + p ; pression = pression + p ; pression = pression + p ;
} } }
} !! Programme incorrect !! } !! Programme incorrect !! } !! Programme incorrect !!
5 / 51 6 / 51 7 / 51 8 / 51
Exemple/Démo Exemple/Démo Exemple/Démo Exemple/Démo

Définition d'un ballon Définition d'un ballon Bilan sur les grandes lignes de l'héritage

 Ballon = sphère + couleur + texture + pression.  Ballon = sphère + couleur + texture + pression.  Héritage = définition d'une classe par extension
 Il peut être gonflé.  Il peut être gonflé. – Définition du nouveau ou différent.
public class Ballon extends Sphere{ public class Ballon extends Sphere{ – Mot clef « extends »
private String couleur; private String couleur;
private String texture; private String texture;
 Java : héritage simple uniquement (arborescence)
private double pression; private double pression;
– toute classe descend de Object
public Ballon (String c, String t, double p, double r){ public Ballon (String c, String t, double p, double r){ – toute classe a une classe ancêtre (sauf Object)
couleur = c ;
texture = t ;
super(r) ;
couleur = c ; – une classe sans extends hérite de Object
Redéfinition de
pression = p ;
super(r) ;
Rayon : attribut privé de Sphere.
Appel du constructeur de Sphere.
texture = t ;
pression = p ;
Appel au constructeur de la classe mère :
nécessairement la première instruction du constructeur.  super :
méthodes
} }
– fait référence à la classe mère
public void gonfler(double p) { public void gonfler(double p) {
pression = pression + p ; pression = pression + p ;
} }
} !! Programme incorrect !! } Programme correct
9 / 51 10 / 51 11 / 51
Exemple/Démo Exemple/Démo Définition / Important

Exemple
Rappel : surcharge de méthodes Nouveau : redéfinition de méthodes Précision sur l’encapsulation
Les véhicules
 private empêche l’accès des attributs dans les classes filles.  On veut représenter et traiter des véhicules
 Surcharge : une classe contenant plusieurs méthodes  Dans une classe héritée :
– 2 types de véhicules :
– avec le même nom, mais … – remplacement de la définition d'une méthode public class Sphere {
private double rayon;
public class Ballon extends Sphere{
// … • Véhicule
// … • Véhicule à moteur à explosion (VAMEX)
– avec nombre et/ou types des paramètres différents // Redéfinition de toString
 Mise en œuvre : public String toString() { public String toString() {  Informations :
 Les méthodes surchargées cohabitent. }
return "Sphère de rayon "+rayon;
}
return "Ballon de rayon "+getRayon();
– Pour tous les véhicules : Marque, Année de fabrication
– Même signature (type de retour, nom et paramètres) } }
– VAMEX : Marque, Année de fabrication, Cylindrée (cm3)
public class Ballon extends Sphere{
private double pression;  Traitements:
private final double PRESSION_MAX;  On peut lui préférer protected qui l’autorise.
// … public class Sphere { public class Ballon extends Sphere{
– Calculer l’âge (= année actuelle – année de fabrication)
private double rayon; // … public class Sphere { public class Ballon extends Sphere{
// … protected double rayon; // … – Donner le type du véhicule (véhicule ou VAMEX ?)
public void gonfler(double p) { // Redéfinition de toString // …
Pression = pression + p ; public String toString() { public String toString() { // Redéfinition de toString – Afficher toutes les informations du véhicule
} return "Sphère de rayon "+rayon; return "Ballon de rayon "+getRayon(); public String toString() { public String toString() {
} } return "Sphère de rayon "+rayon; return "Ballon de rayon "+rayon; • Véhicule générique : Type, Marque, Année
public void gonfler() { } } } }
Pression = PRESSION_MAX ; } } • VAMEX : Type, Marque, Année, Cylindrée
}
}
 VAMEX : calculer une taxe
13 / 51 Discussions 14 / 51 15 / 51 16 / 51
Définition / Important Exemple/Démo
générales
Exemple Exemple Exemple Représentation d'une classe
Les véhicules (sans héritage) Les véhicules (sans héritage) Les véhicules (sans héritage) Rappels de première année
public class Vehicule { public class VAMEX { public class Vehicule { public class VAMEX { public class Vehicule { public class VAMEX {

private String marque; private int annee; private String marque; private int annee ; private int cylindree; private String marque; private int annee; private String marque; private int annee ; private int cylindree; private String marque; private int annee; private String marque; private int annee ; private int cylindree; Zone 1 : Nom de la classe
public Vehicule( int uneAnnee, public VAMEX( int uneAnnee, String uneMarque, int uneCylindree){ public Vehicule( int uneAnnee, public VAMEX( int uneAnnee, String uneMarque, int uneCylindree){ public Vehicule( int uneAnnee, public VAMEX( int uneAnnee, String uneMarque, int uneCylindree){
String uneMarque){ marque = uneMarque; String uneMarque){ marque = uneMarque; String uneMarque){ marque = uneMarque;
marque = uneMarque; annee = uneAnnee; marque = uneMarque; annee = uneAnnee; marque = uneMarque; annee = uneAnnee; Zone 2 : Liste des attributs.
annee = uneAnnee; cylindree= uneCylindree; annee = uneAnnee; annee = uneAnnee;
} } }
Duplication }
cylindree= uneCylindree;
}
Duplication }
cylindree= uneCylindree;
Notation :
<visibilité> <nom> : <Type>
public String who(){ public String who(){ public String who(){ public String who(){ public String who(){ public String who(){

}
return ("Je suis un véhicule");
}
return ("Je suis un VAMEX");
}
return ("Je suis un véhicule");
}
return ("Je suis un VAMEX");
}
return ("Je suis un véhicule");
}
return ("Je suis un VAMEX");
Zone 3 : Liste des méthodes.
Notation :
public String toString(){ public String toString(){ public String toString(){ public String toString(){  Solution inefficace: public String toString(){
public String toString(){
<visibilité> <nom> (<paramètres>) : <TypeRetour>
return (who() + " - marque " + marque return (who() + " - marque " + marque + return (who() + " - marque " + marque return (who() + " - marque " + marque + return (who() + " - marque " + marque
return (who() + " - marque " + marque +
+ " construit en " + annee); "construit en " + annee + " de + " construit en " + annee); "construit en " + annee + " de Attributs et de méthodes
+ " construit en " + annee); dupliquées
"construit en " + annee + " de
} cylindrée" + cylindree + " cm3"); } cylindrée" + cylindree + " cm3"); } cylindrée" + cylindree + " cm3");
} } }
public int age(){ public int age(){  Problème très pénalisant pour les applications réelles:
public int age(){
Calendar cal = Calendar.getInstance(); public int age(){ Calendar cal = Calendar.getInstance(); public int age(){ Calendar cal = Calendar.getInstance();
public int age(){ 4 visibilités possibles (2 seulement au programme) :
return cal.get(Calendar.YEAR) - annee; Calendar cal = Calendar.getInstance(); return cal.get(Calendar.YEAR) - annee; Calendar cal = Calendar.getInstance(); Si on veut gérer de nouveaux
return cal.get(Calendar.YEAR) - annee; véhicules (motos,
Calendar cal = Calendar.getInstance();
} return cal.get(Calendar.YEAR) - annee; } return cal.get(Calendar.YEAR) - annee; } return cal.get(Calendar.YEAR) - annee; Visibilité Notat ion Remarques
} } } } } bateaux, avions, etc.
} ), comment faire ?
publ i c +
public double taxe(){ public double taxe(){ public double taxe(){
package Parfois noté ~. Hors programme
return (cylindree*0.1+50); return (cylindree*0.1+50); return (cylindree*0.1+50);
} } } pr ot ect ed #
} } }
pr i vat e -

17 / 51 18 / 51 19 / 51 20 / 51
Exemple/Démo Exemple/Démo Exemple/Démo

Exemple Exemple Exemple Exemple


Les véhicules … modélisation orientée objet Les véhicules Les véhicules Les véhicules … exemple d’utilisation
public class Vehicule { public class VAMEX extends Vehicule { public class Vehicule { public class VAMEX extends Vehicule {
Object  Un VAMEX est un véhicule particulier. public class Principale {
protected String marque; protected int cylindree; protected String marque; protected int cylindree;
….
protected int annee; protected int annee; public static void main(String[] args) {
toString()
 Un Vehicule a une marque, une année de public VAMEX( int uneAnnee, String uneMarque, public VAMEX( int uneAnnee, String uneMarque,
equals(Object o) fabrication. Il peut afficher ses public Vehicule( int uneAnnee, int uneCylindree){ public Vehicule( int uneAnnee, int uneCylindree){ VAMEX b = new VAMEX( 2009, "Peugeot", 1500);
…. type/informations et calculer son âge. String uneMarque){ super(uneAnnee,uneMarque); String uneMarque){ Attribut supplémentaire
super(uneAnnee,uneMarque);
marque = uneMarque; cylindree= uneCylindree; protected : Les classes filles auront
marque = uneMarque; cylindree= uneCylindree;
if( ( b.taxe() > 0 ) & ( b.age() > 20 )) System.out.println( "Injuste !" );
annee = uneAnnee; } accès
annee à ces attributs
= uneAnnee; }
 Un VAMEX a donc aussi une marque, une } } }
Vehicule }
# marque : String année de fabrication et peut aussi public String who(){ public String who(){
public String who(){ return ("Je suis un VAMEX"); public String who(){ return ("Je suis un VAMEX");
# annee : int afficher ses type/informations et calculer return ("Je suis un véhicule"); } return ("Je suis un véhicule"); } Nouvelle méthode Méthode héritée
+ who() : String son âge mais en plus il a une cylindrée et } } Redéfinition de méthodes
Redéfinitions de méthode
public String toString(){ public String toString(){
+ toString() : String peut calculer sa taxe public String toString(){ return (who() + " - marque " + marque + public String toString(){ return (who() + " - marque " + marque +
+ age() : int return (who() + " - marque " + marque "construit en " + annee + " de return (who() + " - marque " + marque "construit en " + annee + " de
+ " construit en " + annee); cylindrée" + cylindree + " cm3"); + " construit en " + annee); cylindrée" + cylindree + " cm3");
} } } }
Attribut supplémentaire
VAMEX public int age(){ public double taxe(){ public int age(){ public double taxe(){
Calendar cal = Calendar.getInstance(); return (cylindree*0.1+50); Calendar cal = Calendar.getInstance(); return (cylindree*0.1+50);
# cylindree : int return cal.get(Calendar.YEAR) - annee; } return cal.get(Calendar.YEAR) - annee; }
+ who() : String Méthodes redéfinies } } } } Nouvelle méthode
} }
+ toString() : String
+ taxe() : double
Nouvelle méthode

21 / 51 22 / 51 23 / 51 24 / 51
Exemple/Démo Exemple/Démo Exemple/Démo Exemple/Démo

this : référence vers l'objet courant (Rappel) super : pareil, vers la classe mère super : quelques particularités particulières

 Désigne un attribut (ou méthode) de la classe courante (1)  Caractérisation de la « partie parente » de l'objet
 Dans un constructeur, c’est toujours super en 1er
– Dans le constructeur d’un descendant, si on souhaite utiliser super
 Permet de chaîner les constructeurs surchargés (2) – Accès à une définition masquée par l'héritage (redéfinition) pour faire appel au constructeur de l’ancêtre, cet appel doit se
(1) super.methode(.., ..) // accès à la méthode avant redéfinition faire forcément en 1er.
public class Sphere {
private double rayon; – Accès aux constructeurs du parent  Constructeur par défaut
public Sphere (double rayon){ (2) super(.., ..) : appel à un constructeur du parent – Si et seulement si il n’y a pas de constructeur dans une classe,
java ajoute automatiquement un constructeur sans
(1) // Levée d'homonymie : public class Ballon extends Sphere{
this.rayon=rayon ; paramètre qui initialise tous les attributs à 0 ou à null.
private String couleur;
} private String texture; => Si un constructeur est défini, ce constructeur sans paramètre
public class Sphere { private double pression; n’est pas rajouté par java et donc n’existe plus.
Super et this : /** Constructeur par défaut : private double rayon; public Ballon (String c, String t,
double p, double r){
* si pas de taille, création d'une sphère de rayon 1. */ public Sphere (double rayon){  Appel à super() automatiquement
même concept ! public Sphere (){
// Chaînage des constructeurs : }
this.rayon=rayon ;
// Appel du constructeur parent
(2) super(r) ;
couleur = c ; – Dans le constructeur d’un descendant, si aucun constructeur
(2) // ...
this(1); texture = t ; ancêtre n’est appelé via super, java ajoute super() en tête de
public String toString() { pression = p ;
} return "Sphère de rayon "+rayon; chaque constructeur.
}
} } => S’il n’y a pas de constructeur sans paramètre dans la classe
public String toString() {
}
(1)}
return super.toString()+" (Ballon)"; ancêtre, une erreur de compilation apparaît.
// ...
26 / 51 Discussions 27 / 51 28 / 51
} Définition / Important Définition / Important
générales

Exemple de hiérarchie et d'usages de this et Exemple de hiérarchie et d'usages de this et Exemple de hiérarchie et d'usages de this et Exemple de hiérarchie et d'usages de this et
super super super super
public class Vehicule { public class VAMEX extends Vehicule { publicLevée de l'ambiguité
class Vehicule { entre Appel
public duVAMEX
class constructeur
extends supérieur
Vehicule { public class Vehicule { public class VAMEX extends Vehicule { public class Vehicule { public class VAMEX extends Vehicule {

private String marque; private int cylindree;


attribut et paramètre
private String marque;
(Constructeur de Vehicule)
private int cylindree; private String marque; private int cylindree; private String marque; private int cylindree;
private int annee; private int annee; private int annee; private int annee;
public VAMEX( int uneAnnee, String uneMarque, public VAMEX( int uneAnnee, String uneMarque, public VAMEX( int uneAnnee, String uneMarque, public VAMEX( int uneAnnee, String uneMarque,
public Vehicule( int annee, int uneCylindree){ public Vehicule( int annee, int uneCylindree){ public Vehicule( int annee, int uneCylindree){ public Vehicule( int annee, int uneCylindree){
String marque){ super(uneAnnee,uneMarque); String marque){ super(uneAnnee,uneMarque); String marque){ super(uneAnnee,uneMarque); String marque){ super(uneAnnee,uneMarque);
this.marque = marque; cylindree= uneCylindree; this.marque = marque; cylindree= uneCylindree; this.marque = marque; cylindree= uneCylindree; this.marque = marque; cylindree= uneCylindree;
this.annee = annee; } this.annee = annee; } this.annee = annee; } this.annee = annee; }
} } } }
public Vehicule (String uneMarque){ public String who(){ public Vehicule (String uneMarque){ public String Appel
who(){ de la méthode toString public Vehicule (String uneMarque){ public String who(){ public Vehicule (String uneMarque){ public String who(){
this(2019,uneMarque); return ("Je suis un VAMEX"); this(2019,uneMarque); return ("Je suis un VAMEX"); this(2019,uneMarque); return ("Je suis un VAMEX"); this(2019,uneMarque); return ("Je suis un VAMEX");
} } de la classe parent. } }
} } } }
3
public String who(){ public String toString(){ public String who(){ public String toString(){ public String who(){ public String toString(){ public String who(){ public String toString(){
return ("Je suis un véhicule"); return super.toString()+" de return ("Je suis un véhicule"); return super.toString()+" de return ("Je suis un véhicule"); return super.toString()+" de return ("Je suis un véhicule"); return super.toString()+" de
Chainage des constructeurs
}
}
cylindrée" + cylindree + " cm3"; }
}
cylindrée" + cylindree + " cm3"; }
}
cylindrée" + cylindree + " cm3"; } 2 }
cylindrée" + cylindree + " cm3";

public String toString(){ public String toString(){ public String toString(){ public String toString(){ 1
return (who() + " - marque " + marque public double taxe(){ return (who() + " - marque " + marque public double taxe(){ return (who() + " - marque " + marque public double taxe(){ return (who() + " - marque " + marque public double taxe(){
+ " construit en " + annee); return (this.cylindree*0.1+50); + " construit en " + annee); return (this.cylindree*0.1+50); + " construit en " + annee); return (this.cylindree*0.1+50); + " construit en " + annee); return (this.cylindree*0.1+50);
} } } } } } } }
} } } } } } } }
utilisation d’attributs
public class TestVehicule { (this {est facultatif ici)
public class TestVehicule public class TestVehicule { public class TestVehicule {
public static void main(String[] a){ public static void main(String[] a){ public static void main(String[] a){ HolyComputer$ java TestVehicule public static void main(String[] a){
VAMEX v = new VAMEX(2017,"Renault",2000); VAMEX v = new VAMEX(2017,"Renault",2000); Que va t’il s’afficher sur le terminal ? VAMEX v = new VAMEX(2017,"Renault",2000); Je suis un VAMEX – marque Renault construit en VAMEX v = new VAMEX(2017,"Renault",2000);
System.out.println(v); System.out.println(v); System.out.println(v); 2017 de cylindree 2000 cm3. System.out.println(v);
} } } }
} 29 / 51 } 30 / 51 } 31 / 51 } 32 / 51
Exemple/Démo Exemple/Démo Exemple/Démo Exemple/Démo
this / super : un bilan Polymorphisme : un objet a plusieurs types Polymorphisme : un objet a plusieurs types
Object Object
…. ….
 this : référence vers l'objet courant + toString() + toString()
+ equals(Object o) + equals(Object o)
– Appel d'un constructeur surchargé …. ….

this(..)
String Vehicule String Vehicule
– Levée des ambigüités de noms …. # marque : String …. # marque : String
…. # annee : int …. # annee : int
this.monAttribut ou + who() : String + who() : String
this.maMethode() // Objectivement peu utile + age() : int
Quel est le type de o ? + age() : int

 super : référence vers l'objet courant, interprété – Object ?


VElectrique VAMEX VElectrique VAMEX
comme son parent Polymorphisme # puissance: int # cylindree : int
– Vehicule?
– Vamex?
# puissance: int # cylindree : int
+ who() : String + who() : String + who() : String + who() : String
– Accès aux constructeurs du parent + taxe() : double + taxe() : double + taxe() : double + taxe() : double
– Camion?
super(…)
public class UtilisationVehicules { public class UtilisationVehicules {
Camion Camion
– Accès aux méthodes avant redéfinition public static void main(String[] a){ public static void main(String[] a){
VAMEX v = new Camion(2017,"Renault",5000,1.5) ; # poids : int VAMEX v = new Camion(2017,"Renault",5000,1.5) ; # poids : int
super.maMethode() Object o = v; Object o = v;
+ who() : String + who() : String
String s = v; String s = v;
} + taxe() : double } + taxe() : double
} }
33 / 51 35 / 51 36 / 51
Définition / Important Exemple/Démo Exemple/Démo

Polymorphisme : un objet a plusieurs types Type statique vs type dynamique Type statique vs type dynamique Type statique vs type dynamique
Object public class UtilisationVehicules {
La méthode la plus spécifique est toujours celle appelée La méthode la plus spécifique est toujours celle appelée
public static void main(String[] a){
…. VAMEX v = new Camion(2017,"Renault",5000,1.5);
+ toString() Object o = v;
+ equals(Object o) String s = v;
…. }
}
VAMEX v1 ; // Type statique de v1 : VAMEX VAMEX v1 ; // Type statique de v1 : VAMEX
String
 Distinction : VAMEX v2; // Type statique de v2 : VAMEX VAMEX v2; // Type statique de v2 : VAMEX
Vehicule
…. # marque : String
# annee : int
– Type statique : type de déclaration d'une variable
….
– Type dynamique : type d'instanciation de l'objet v1 = new VAMEX (2016,"Saab",2000); // Type dynamique de v1 : VAMEX v1 = new VAMEX (2016,"Saab",2000); // Type dynamique de v1 : VAMEX
+ who() : String
Quel est le type de v ? + age() : int
(type réel, à l'exécution) v2 = new Camion (2017,"Renault",5000,1.5); // Type dynamique de v2 : Camion v2 = new Camion (2017,"Renault",5000,1.5); // Type dynamique de v2 : Camion

– Object ?
VElectrique VAMEX
 Exemple: System.out.println(v1.who()) ; System.out.println(v1.who()) ; Je suis un VAMEX
– Vehicule?
# puissance: int # cylindree : int – Type statique de v : VAMEX System.out.println(v2.who()) ; System.out.println(v2.who()) ; Je suis un Camion
– Vamex? + who() : String + who() : String
– Camion? + taxe() : double + taxe() : double – Type dynamique v : Camion
– Type statique de o : Object Remarque :
public class UtilisationVehicules {
Camion Si redéfinition, la méthode la plus spécialisée est appelée.
public static void main(String[] a){ – Type dynamique o : Camion
VAMEX v = new Camion(2017,"Renault",5000,1.5) ; # poids : int Elle est choisie par rapport au type dynamique (type réel).
Object o = v;
String s = v;
+ who() : String – v et o sont interprétables en Camion, VAMEX, Vehicule et
} + taxe() : double Object
}
37 / 51 38 / 51 39 / 51 40 / 51
Exemple/Démo Définition / Important Exemple/Démo Exemple/Démo

… c’est ce qu’on appelle le polymorphisme Petit problème … Petit problème …


Vehicule Vehicule Vehicule
# marque : String # marque : String # marque : String
On peut appeler la méthode who() sur tous les # annee : int # annee : int # annee : int
Ça marche ? NON

+ who() : String  + who() : String  + who() : String
véhicules sans se soucier de leur type dynamique. + age() : int + age() : int + age() : int
Compilation Error: cannot find method taxe()
 La méthode s’adapte automatiquement
VElectrique VAMEX VElectrique VAMEX VElectrique VAMEX
au type dynamique. # puissance: int # cylindree : int # puissance: int # cylindree : int La méthode taxe n’existe # puissance: int # cylindree : int
-> Unification des traitements + who() : String + who() : String + who() : String + who() : String + who() : String + who() : String
+ taxe() : double + taxe() : double + taxe() : double + taxe() : double pas pour le type Vehicule + taxe() : double + taxe() : double

Vehicule[] myTab = new Vehicule[50]; Camion


Vehicule[] myTab = new Vehicule[50];
Camion
Vehicule[] myTab = new Vehicule[50];
Camion
# poids : int # poids : int # poids : int
myTab[0] = new VAMEX( 2005, "Ford", 1500 ); + who() : String + who() : String + who() : String
+ taxe() : double myTab[0] = new VAMEX( 2005, "Ford", 1500 ); + taxe() : double myTab[0] = new VAMEX( 2005, "Ford", 1500 ); + taxe() : double
myTab[1] = new Camion( 2009, "Scania", 4200, 2.5 ); myTab[1] = new Camion( 2009, "Scania", 4200, 2.5 ); myTab[1] = new Camion( 2009, "Scania", 4200, 2.5 );
myTab[2] = new Velectrique( 2013, "Renault", 66 )
myTab[3] = new Velectrique( 2012, "Toyota", 70 )
myTab[2]
myTab[3]
=
=
new
new
Velectrique( 2013, "Renault", 66 )
Velectrique( 2012, "Toyota", 70 )
myTab[2]
myTab[3]
=
=
new
new
Velectrique( 2013, "Renault", 66 )
Velectrique( 2012, "Toyota", 70 )
Classes abstraites
myTab[4] = new Camion( 1997, "MAN", 5500, 3.8 ); myTab[4]
myTab[5]
=
=
new
new
Camion( 1997, "MAN", 5500, 3.8 );
VAMEX( 2005, "Peugeot", 1200 );
myTab[4]
myTab[5]
=
=
new
new
Camion( 1997, "MAN", 5500, 3.8 );
VAMEX( 2005, "Peugeot", 1200 );
en Java
myTab[5] = new VAMEX( 2005, "Peugeot", 1200 );
for(int i=0; i<myTab.length; i++) for(int i=0; i<myTab.length; i++)
for(int i=0; i<6; i++) System.out.println( myTab[i].taxe()); System.out.println( myTab[i].taxe());
System.out.println( myTab[i].who());

41 / 51 42 / 51 43 / 51

Classes et méthodes abstraites Classes et méthodes abstraites Vehicule


# marque : String
Bilan sur les classes et méthodes abstraites Bilan sur les classes et méthodes abstraites
# annee : int
+ who() : String
Pour résoudre ce problème de compilation, on ajoute la méthode taxe
Ça marche ?

 + age() : int  Si une classe contient des méthodes "abstract", elle est  Syntaxe UML
dans la classe Vehicule. + taxe() : double Classe abstraite en italique
alors une classe "abstract"
 Comme on ne peut pas produire son implémentation, on la définie Maintenant, oui ! Vehicule
comme abstraite. VElectrique VAMEX – On ne peut pas créer d’objets à partir d’une classe # marque : String
 Et cela empêche la création d’objets de # puissance: int # cylindree : int # annee : int
 Comme elle possède une méthode abstraite, la classe devient la classe Véhicule ce qui correspond à + who() : String + who() : String
abstraite. + who() : String Méthode abstraite en italique
abstraite. la logique de notre modélisation. + taxe() : double + taxe() : double + age() : int
– Une méthode abstraite n’a pas d’implémentation + taxe() : double
public abstract class Vehicule {
Camion – L’implémentation d’une méthode abstraite est réalisée
protected String marque; La classe est abstraite: elle ne produira # poids : int
protected int annee; jamais d’objets (erreur à la compilation). Vehicule[] myTab = new Vehicule[50]; + who() : String dans les classes dérivées. VElectrique VAMEX
+ taxe() : double # puissance: int # cylindree : int
public Vehicule( int uneAnnee, myTab[0] = new VAMEX( 2005, "Ford", 1500 ); + who() : String + who() : String
String uneMarque){ Vehicule A =Vehicule( 2005, "Nakamura" ) + taxe() : double + taxe() : double
myTab[1] = new Camion( 2009, "Scania", 4200, 2.5 );
marque = uneMarque;
annee = uneAnnee;
Error: Vehiculeisabstract; cannot be instantiated
myTab[2] = new Velectrique( 2013, "Renault", 66 )
 Finalement, une classe abstraite permet de définir dans
} myTab[3] = new Velectrique( 2012, "Toyota", 70 ) une classe de base des fonctionnalités communes à Par nature, les méthodes abstraites
Camion
# poids : int
public String who(){ myTab[4] = new Camion( 1997, "MAN", 5500, 3.8 ); toutes ses descendantes, tout en leur imposant de sont redéfinies chez les descendants. + who() : String
return ("Je suis un véhicule"); Méthode abstraite: myTab[5] = new VAMEX( 2005, "Peugeot", 1200 ); + taxe() : double
} •Aucune implémentation (pas de corps) redéfinir certaines méthodes. Leur présence dans les diagrammes
(...)
•Impose l’implémentation dans les for(int i=0; i<myTab.length; i++) UML des descendants n’est donc pas
classes dérivées System.out.println( myTab[i].taxe()); obligatoire.
public abstract double taxe();
}
45 / 51 46 / 51 47 / 51 48 / 51
Bilan sur l’héritage et polymorphisme Bilan sur l’héritage et polymorphisme

 Héritage : classe mère (ou ancêtre) et classes filles  3 niveaux de visibilité public / private / protected
L’héritage permet de mettre en commun des caractéristiques public : accès possible pour tout le monde
et des traitements entre différents types d’objets. private : accès restreint à la classe courante
proctected : accès pour la classe courante et ses descendants
 extends
 Polymorphisme : un objet a plusieurs types
classeA extends classeB signifie que classeA hérite des
attributs/méthodes de classeB mais peut en avoir en plus. type statique à la déclaration
classeA est une spécialisation de classeB. type dynamique à l’exécution
la méthode la plus spécifique est toujours appelée
 super
Bilan sur l’héritage super permet d’appeler les méthodes de l’ancêtre.
abstract
et le polymorphisme

Si et seulement si aucun constructeur n’est ajouté dans une
classe, java ajoute automatiquement un constructeur sans Une classe est abstraite si elle possède une méthode abstraite.
paramètre. Une classe abstraite ne peut pas être instanciée.
Dans le constructeur d’un descendant, si aucun constructeur Une méthode abstraite est vide
ancêtre n’est appelé via super, java ajoute super() en tête de Son implémentation est faite dans les classes dérivées
chaque constructeur.
50 / 51 51 / 51

Vous aimerez peut-être aussi