Académique Documents
Professionnel Documents
Culture Documents
L1 IRT
Année Académique 2020-2021
Chapitre 3
Héritage
3.1 Héritage
Le principe
Quand on dispose d’une classe c, on a la possibilité de l’agrandir (ou de l’étendre)
en créant une deuxième classe c0. On dit dans ce cas que c0 hérite de c, ou encore
que c est la classe mère et c0 la classe fille. Par exemple, considérons les deux classes
suivantes :
package heritage ;
package heritage ;
package heritage ;
Notes bien que comme la classe mère possède une méthode getX, la classe fille la
possède aussi. Et l’attribut x de tout instance de la classe mère est aussi un attribut
de toute instance de la classe fille.
En java, une classe ne peut avoir qu’une seule classe mère. Dans d’autres langages
(comme le C++) cela est permis, mais pour des raisons de fiabilité, Java l’interdit.
Object
Une des propriétés induites par le polymorphisme est que l’interpréteur Java
est capable de trouver le traitement à effectuer lors de l’appel d’une méthode
sur un objet. Ainsi, pour plusieurs objets déclarés sous la même classe (mais
n’ayant pas la même classe réelle), le traitement associé à une méthode donné
peut être différent. Si cette méthode est redéfinie par la classe réelle d’un objet
(ou par une classe située entre la classe réelle et la classe de déclaration), le
traitement effectué est celui défini dans la classe la plus spécifique de l’objet et
qui redéfinie la méthode.
3.2 Polymorphisme
Considérons l’exemple suivant :
package heritage ;
On remarque d’une part que o référence un objet de la classe fille de son type. Cela
s’appelle le polymorphisme. D’autre part, si l’on souhaite effectuer des opérations
spécifiques aux objets de la classe fille, il est nécessaire d’effectuer un cast.
3.4 Interfaces
L’héritage multiple est interdit en Java. Les interfaces sont un moyen de résoudre
en partie le problème.
package heritage ;
interface Saluer
{ public void direBonjour () ;
}
System . out .
println("Bonjour") ; }
} class
Hello implements Saluer
{ @Override public
void direBonjour ()
{
System . out .
println("Hello") ; }
} class
GutenTag implements Saluer
{ @Override public
void direBonjour ()
{
System . out .
println("Guten tag") ; }
} public
class ExempleInterface
{ public static void main(String [ ] args)
{
Saluer s = new
Bonjour() ; s .
direBonjour () ; s =
new Hello () ; s .
direBonjour () ;
ArrayList<Saluer> arrayList = new ArrayList<Saluer >() ;
arrayList . add(new Bonjour () ) ;
arrayList . add(new Hello () ) ;
arrayList . add(new GutenTag () ) ;
for (Saluer saluer :
arrayList) saluer . direBonjour
} () ; }
Vous remarquez que la méthode Saluer est implémentée par les trois classes Bonjour,
Hello et GutenTag, qui contiennent trois façons différentes de programmer la
méthode public void saluer().
Le polymorphisme permet de mettre dans une référence de type Saluer tout objet
dont le type hérite de Saluer.
On peut voir une interface comme un contrat :
— Toute sous-classe d’une interface se doit d’implémenter toutes les méthodes
qui y sont déclarées.
— En échange, il devient possible d’utiliser le polymorphisme, et donc d’utiliser
le même code avec des objets de types différents.
La restriction interdisant l’héritage multiple en Java ne s’applique pas aux interfaces.
Une classe peut implémenter plusieurs interfaces.
package heritage;
/∗
∗ Nombre dedevises pour 1$ .
∗/
public abstract double getCours () ;
public Livres(Devise d) {
setSomme(d);
}
return “Livres”;
public Euros(Devise d)
{
setSomme(d) ;
}
public Dollars(Devise d)
{
setSommet(d);
}
return 1.0;
}
return "Dollars" ;
}