<!-- Slide number: 1 --> # L’Héritage en Java
<!-- Slide number: 2 --> Une classe Java dérive toujours d'un autre classe. Quand rien n'est spécifié, une classe hérite de la classe Object. Pour spécifier de quelle classe hérite une classe on utilise le mot-clé extends : class D extends B La classe D dérive de la classe B. On dit que le classe B est la super classe, la classe de base, ou la classe mère de la classe dérivée D, et que D dérive de B, ou que D est une sous-classe de B
<!-- Slide number: 3 --> B La classe B est la super classe La classe B est la classe mère La classe D dérive de la classe B. La classe D est une sous-classe D
<!-- Slide number: 4 --> # Visibilité depuis les classes dérivées class B{ private int a; protected int b; int c; public int d; } class D extends B { int x; void f(){ b = …; } }
int x; void f(){ b = …; } private int a; protected int b; int c; public int d;
<!-- Slide number: 5 -->
| Modificateur | Rôle | | --- | --- | | public | Une variable, méthode ou classe déclarée public est visible par tous les autres objets. En POO, aucun attribut d'une classe ne devrait être déclarée publique : il est préférable d'écrire des méthodes pour la consulter et la modifier. | | Friendly (Néant) | Si aucun modificateur n'est précisé, la classe, méthode ou variable, sera visible par toutes les classes se trouvant dans le même package. | | Protected | Si une méthode ou un attribut est déclaré protected, seules les méthodes présentes dans le même package que cette classe ou ses sous classes pourront y accéder. Une classe ne peut pas être qualifiée protected. | | private | C'est le niveau de protection le plus fort. Les composants ne sont visibles qu'à l'intérieur de la classe : ils ne peuvent être modifiés que par des méthodes définies dans la classe prévues à cet effet. Les attributs private sont lus et modifiés par les accesseurs: getters et les modificateurs: setters, qui, sont déclarés public, afin que tout le monde puisse les utiliser. |
<!-- Slide number: 6 -->
Package P2 Package P1 class C1 { public int A ; protected int B ; int C ; private int D } class C3 {
} class C4 extends C1 {
} class C2 {
} | Attribut | Classe C1 | Classe C2 | Classe C3 | Classe C4 | | --- | --- | --- | --- | --- | | A | | | | | | B | | | | | | C | | | | | | D | | | | |
<!-- Slide number: 7 -->
Publicité
Package P2 Package P1 class C1 { public int A ; protected int B ; int C ; private int D } class C3 {
} class C4 extends C1 {
} class C2 {
} | Attribut | Classe C1 | Classe C2 | Classe C3 | Classe C4 | | --- | --- | --- | --- | --- | | A | X | X | X | X | | B | | | | | | C | | | | | | D | | | | |
<!-- Slide number: 8 -->
Package P2 Package P1 class C1 { public int A ; protected int B ; int C ; private int D } class C3 {
} class C4 extends C1 {
} class C2 {
} | Attribut | Classe C1 | Classe C2 | Classe C3 | Classe C4 | | --- | --- | --- | --- | --- | | A | X | X | X | X | | B | X | X | | X | | C | | | | | | D | | | | |
<!-- Slide number: 9 -->
Package P2 Package P1 class C1 { public int A ; protected int B ; int C ; private int D } class C3 {
} class C4 extends C1 {
} class C2 {
Publicité
} | Attribut | Classe C1 | Classe C2 | Classe C3 | Classe C4 | | --- | --- | --- | --- | --- | | A | X | X | X | X | | B | X | X | | X | | C | X | X | | | | D | | | | |
<!-- Slide number: 10 -->
Package P2 Package P1 class C1 { public int A ; protected int B ; int C ; private int D } class C3 {
} class C4 extends C1 {
} class C2 {
} | Attribut | Classe C1 | Classe C2 | Classe C3 | Classe C4 | | --- | --- | --- | --- | --- | | A | X | X | X | X | | B | X | X | | X | | C | X | X | | | | D | X | | | |
<!-- Slide number: 11 --> # Remarque: Une référence à une classe dérivée peut être affectée à une référence d’une classe de base, l’inverse doit faire l’objet d’une opération de conversion de type ou cast : Exemple: class C1 { public int A ; protected int B ; int C ; private int D } class C4 extends C1 { … }
Class objC1 = new C1(); Class objC4 = new C4(); objC1 = objC4; // possible objC4 = objC1; // interdit objC4 = ( C4) objC1; // possible avec cast
<!-- Slide number: 12 --> # Redéfinition des méthodes class B { void m(){ System.out.println(" m de B"); } } class D extends B { void m(){ System.out.println( " m de D"); } } Public Static void main(String Args[]){ B b = new B( ); D d = new D( ); b.m ( ); b = d; b.m ( );
Affiche: m de B m de D
<!-- Slide number: 13 --> Remarques : Ne pas confondre la redéfinition avec la surcharge : Redéfinition : même type de retour et mêmes paramètres. Surcharge : type de retour et paramètres différents, les paramètres au moins doivent être différents. Une classe définie avec le modificateur d’accès final ne peut pas être dérivée. Une méthode définie avec le modificateur d’accès final ne peut pas être redéfinie dans les classes dérivées.
<!-- Slide number: 14 --> Véhicule
Vitesse Nombre de passagers Classe de base:
Publicité
Attributs de Véhicule Héritage Avion
Vitesse Nombre de passagers Nombre de moteurs Classe dérivée:
Attributs hérités
Attributs propres à Avion
<!-- Slide number: 15 --> Constructeur La classe dérivée doit prendre en charge la construction de la classe de base. Pour construire un Avion, il faut construire d'abord un Véhicule; Le constructeur de la classe de base (Véhicule) est donc appelé avant le constructeur de la classe dérivée (Avion). Si un constructeur de la classe dérivée appelle explicitement un constructeur de la classe de base, cet appel doit être obligatoirement la première instruction de constructeur. Il doit utiliser pour cela, le mot clé super.
<!-- Slide number: 16 --> Exemple: class A { int i; public A(int x) { i = x; // Constructeur de la classe A } } class B extends A // Héritage { double z; public B (int f, double w) // Constructeur de la classe B { super(f); // Appel explicite du constructeur de A, en 1 ère ligne. z = w; } }
<!-- Slide number: 17 --> Exercice1: Créez une classe « Person » Créez une classe « Student » et une autre classe « Teacher », les deux héritent de la classe « Person ». La classe « Student » aura une méthode publique « GoToClasses », qui affichera à l’écran « I’m going to class. ». La classe « Teacher » aura une méthode publique « Explain », qui affichera à l’écran « Explanation begins ». En plus, il aura un attribut privé « subject » de type string. La classe « Person » doit avoir une méthode « SetAge(int n) » qui indiquera la valeur de leur âge (par exemple, 15 years old). La classe « Student » aura une méthode publique « DisplayAge » qui écrira sur l’écran « My age is: XX years old ». 4. créez une autre classe de test appelée « Test » qui contiendra « Main » et: Créez un objet Person et faites-lui dire « Hello » Créer un objet Student, définir son âge à 15 ans, faites-lui dire « Hello », « I’m going to class. » et afficher son âge Créez un objet Teacher, 40 ans, demandez-lui de dire « Hello » puis commence l’explication.
<!-- Slide number: 18 --> Exercice2: Créez une classe « House », avec un attribut « surface », un constructeur qui définit sa valeur et une méthode « Display » pour afficher « Je suis une maison, ma surface est de XXX m2 » (XXX: la valeur de surface). Incluez aussi des getters et des setters pour la surface. La classe « House » contiendra une porte (Door). Chaque porte aura un attribut « color » (de type String), et une méthode « Display » qui affichera « Je suis une porte, ma couleur est bleu » (ou quelle que soit la couleur). Inclure un getter et un setter. Créez également la méthode « GetDoor » dans la classe « House ». La classe « Apartment » est une sous-classe de la classe « House », avec une surface prédéfinie de 50m2. Créez également une classe Person, avec un nom (de type String). Chaque personne aura une maison. La méthode « Display » pour une personne affichera son nom, les données de sa maison et les données de la porte de cette maison. Écrivez un Main pour créer un Apartment, une personne pour y vivre et pour afficher les données de la personne.
<!-- Slide number: 19 --> # Netographie https://waytolearnx.com/2020/04/exercices-corriges-java-les-classes-et-lheritage-partie-2.html https://www.cours-gratuit.com/cours-java/cours-complet-de-java-en-pdf https://miashs-www.u-ga.fr/prevert/Prog/Java/CoursJava/classes2.html