Cours 4I. L'héritage (caractéristique des LOO)- différence avec "est composé de" (doit avoir un sens ==> technique de conception, pas de programmation) b) objets en mémoire c) code java (extends) I.4 Héritage unique entre classes (contrairement à C++, compensé par le mécanisme d' Interface) mais transitivité I.5 Ce qui est hérité (règle: la sous-classe hérite de la super-classe les attributs et les méthodes) I.6 Exemples d'utilisation et conversion (cast) : b) Transport t1 = new Transport(); t1.roule(); t1.vole(); c) Transport t2 = new Avion(); t2.roule(); t2.vole(); Avion a2 = (Avion)t2; a2.vole(); a2.roule(); d) Avion a3 = (Avion)t1; e) Résumé : a1 = t1; a1 = (Avion)t1; t1 = a1; Légende : erreur de compilation ou erreur à l'exécution ==> exception - TypeDérivé réfFille = (TypeDérivé)réfMère; - compilation: type statique/déclaré, exécution: type dynamique/constaté La redéfinition (sous-classe donc classe différente, même nom, paramètres identiques, type retourné compatible ==> identique ou sous-classe ) est différente de (contraire à) la surcharge (même classe, même nom, paramètres différents, peu importe le type retourné) b) Exemple : Dans Avion : public void freine() { S.o.p( "Inverser les reacteurs" ); } t1.freine(); a1.freine(); t1 = a1; t1.freine(); (liaison dynamique) d) Si la méthode freine() de la classe Avion a besoin d'appeler la méthode freine() de la classe Transport pour éviter la duplication de code, il faut écrire super.freine(); et non pas simplement freine(); équivalent à this.freine(); qui provoquerait une récursion infinie. - 1ère version : public Avion( final int pRo2, final boolean pCo2, final int pRe2 ) { this.aNbRoues=pRo2; this.aEstComplet=pCo2; this.aNbReacteurs=pRe2; } - 2ème version : public Avion( final int pRo2, final boolean pCo2, final int pRe2 ) { super( pRo2, pCo2 ); this.aNbReacteurs=pRe2; } super(...); doit forcément être la 1ère instruction du constructeur. public Avion() { super(); } (forcément 1ère instruction, comme pour super();) ⇒ Règle générale : Tout appel de constructeur ne peut être écrit que comme première instruction d'un autre constructeur. Raison évidente : le constructeur doit porter le même nom que la classe ! - si ∃ dans Transport un constructeur sans paramètre (éventuellement fourni par Java), alors constructeur non obligatoire dans les sous-classes Inconvénient : toutes les classes du même paquetage peuvent aussi y accéder. ⇒ NON Avantage : sécurité maximale, accès ≠ modification. Inconvénient : on doit définir un accesseur, et éventuellement un modificateur. ⇒ OUI
b) déjà redéfinie dans toutes les classes du JDK c) à redéfinir dans toute nouvelle classe (si on veut pouvoir l'afficher) d) appelée automatiquement à chaque conversion en String et notamment dans un System.out.println( ); b) déjà redéfinie dans toutes les classes du JDK c) à redéfinir dans toute nouvelle classe (si on veut pouvoir faire des comparaisons) d) signature OBLIGATOIRE (pas equals( Avion pA ) sinon ce n'est pas une redéfinition) e) propriétés : 2) x.equals(x) retourne vrai (réflexivité) 3) x.equals(y)==y.equals(x) (symétrie) ==> x et y de même classe (appelée automatiquement par le GC avant la destruction de l'objet) b) déjà redéfinie dans les classes du JDK qui le nécessitent c) à redéfinir si nécessaire dans une nouvelle classe t2 instanceof Avion && t2 instanceof Transport && t2 instanceof Object == true null instanceof AnyClass retourne toujours false anyNonNullReference instanceof Object retourne toujours true Object <|-- ...
|-- ... <|-- JComponent <|-- JTextComponent
|-- ... |--- JEditorPane (editeur de texte)
|--- JTextArea (zone multilignes)
|--- JTextField (zone monoligne)
Lire le poly :
|
Dernière mise à jour :