IN101

Cours 4

I. L'héritage (caractéristique des LOO)
I.1 Relation "est une sorte de"
I.2 Différence avec "est composé de"
(exemple de mauvais héritage : Vehicule = sorte de Rectangle avec 2 Cercles en plus)
I.3 Exemple Animal/Oiseau
a) diagramme des classes
b) objets en mémoire
c) code java (extends)
I.4 Ce qui est hérité (règle: la sous-classe hérite de la super-classe les attributs et les méthodes)
I.5 Vocabulaire (une classe fille / sous-classe / classe dérivée, hérite / dérive, d'une classe mère / super-classe)
I.6 Exemples d'utilisation (compilation: type statique/déclaré, exécution: type dynamique/constaté)
conversion (cast) : TypeDérivé réfFille = (TypeDérivé)réfMère;
a) Oiseau o1 = new Oiseau();   o1.vole();    o1.mange();
b) Animal a1 = new Animal();   a1.mange();   a1.vole();
c) Animal a2 = new Oiseau();   a2.mange();   a2.vole();
   Oiseau o2 = (Oiseau)a2;     o2.vole();
d) Oiseau o3 = (Oiseau)a1;
e) Résumé : o1 = a1;   o1 = (Oiseau)a1;   a1 = o1;
Légende : erreur de compilation ou erreur à l'exécution ==> exception
I.7 Héritage unique (contrairement à C++, compensé par le mécanisme d' Interface)
I.8 Redéfinition et polymorphisme
a) Différent de (contraire à) la surcharge (même classe, même nom, signature différente); redéfinition (classe différente mais même signature, donc même nom).
b) Exemple : Dans Animal : void mange() { S.o.p( "je mache" ); }
Dans Oiseau : void mange() { S.o.p( "j'avale" ); }
a1.mange();   o1.mange();
a1 = o1;   a1.mange();   (liaison dynamique)
c) @Override
d) Soit une méthode m() déclarée à la fois dans une sous-classe et dans sa super-classe. Lorsqu'on écrit les instructions de m() dans la sous-classe, il est possible d'appeler la méthode m() de la super-classe en écrivant super.m(); et non pas simplement m(); équivalent à this.m(); qui provoquerait une récursion infinie.
I.9 Les constructeurs, super() (exception à la règle du I.4: sauf les constructeurs)
I.10 Protection
a) problème: hérité accessible
b) 3 solutions pour les attributs (la mauvaise, protected, la bonne)
c) pour les méthodes : protected
(exception à la règle du I.4: sauf les méthodes privées)
d) autre niveau de protection : (package-private) = aucun mot java
protection  la classe courante   autre classe du paquetage   sous-classe dans un autre paquetage   reste du monde 
private Oui NonNonNon
(package-private) OuiOui NonNon
protected OuiOuiOui Non
public OuiOui OuiOui
II. La classe Object
II.1 mère de toutes les classes, héritage direct ou indirect
II.2 String toString() à redéfinir
II.3 boolean equals(Object) à redéfinir :
0) paramètre Object
1) x.equals(x) retourne vrai
2) x.equals(null) retourne faux
3) x.equals(y)==y.equals(x) ==> mêmes classes
4) conversion
5) comparaison des attributs
6) et dans une sous-classe ?
II.4 void finalize() peut être redéfinie
II.5 final Class getClass() NE peut être redéfinie (voir aussi l'opérateur instanceof)
II.6 clone() : lire tutoriel
II.7 Exemple de hiériarchie de classes :
        Object <|-- ...
                |-- Number <|-- Integer
                |-- ...     |--- types entiers sur plus ou moins d'octets
                            |---- type entier de taille arbitraire
                            |-- Double
                            |--- type reel sur moins d'octets
                            |---- type reel de taille et precision arbitraires
                            |----- ...
        
- - - - - - - - - - - - - - - - - - - - non vu en cours :
III. Les types primitifs
III.1 case mémoire, pas objet
III.2 plus efficace, pas de méthodes
III.3 int, double, boolean (pas string)


--> Dernière mise à jour :