Inheritance: extends, super, and overriding · Héritage : extends, super, et overriding
Inheritance: building on a class
- Inheritance lets one class reuse another class's fields and methods.
- The class you build on is the superclass (parent); the new class is the subclass (child).
- A subclass is-a kind of its superclass: a
Dogis anAnimal.
Héritage : construire sur une classe
- L'héritage permet à une classe de réutiliser les champs et méthodes d'une autre classe.
- La classe sur laquelle on construit est la superclasse (parent) ; la nouvelle classe est la sous-classe (enfant).
- Une sous-classe est-un type de sa superclasse : un
Dogest unAnimal.
extends and super
- Write
class Dog extends Animalto makeDoga subclass ofAnimal. Dogautomatically gets every public method ofAnimal, likegetName().- The subclass constructor calls the superclass constructor first with
super(...).
extends et super
- Écrivez
class Dog extends Animalpour faire deDogune sous-classe deAnimal. Doghérite automatiquement de toutes les méthodes publiques deAnimal, commegetName().- Le constructeur de la sous-classe appelle d'abord le constructeur de la superclasse avec
super(...).
public class Main {
public static void main(String[] args) {
Dog d = new Dog("Rex");
System.out.println(d.getName()); // Rex (inherited from Animal)
System.out.println(d.speak()); // Woof (Dog's own version)
}
}
class Animal {
private String name;
public Animal(String name) { this.name = name; }
public String getName() { return this.name; }
public String speak() { return "some sound"; }
}
class Dog extends Animal {
public Dog(String name) {
super(name); // run Animal's constructor
}
public String speak() { // override Animal's speak()
return "Woof";
}
}
Overriding a method
- A subclass can override an inherited method: give it the same signature, a new body.
Dog'sspeak()replacesAnimal'sspeak()forDogobjects.- Methods it does not override (like
getName()) are still inherited unchanged.
Redéfinir une méthode
- Une sous-classe peut redéfinir une méthode héritée : lui donner la même signature et un nouveau corps.
Dog'sspeak()remplaceAnimal'sspeak()pourDogobjets.- Les méthodes qu'elle ne redéfinit pas (comme
getName()) sont héritées inchangées.
super.method() — extend, don't replace
- Sometimes you want the parent's work plus a little more.
- Inside an override,
super.describe()runs the superclass version of the method. - Then you add to its result instead of rewriting it from scratch.
super.method() — étendre, ne pas remplacer
- Parfois, vous voulez le travail du parent plus un peu plus.
- Dans une redéfinition,
super.describe()exécute la version de la superclasse de la méthode. - Ensuite, vous ajoutez à son résultat au lieu de tout réécrire depuis zéro.
public class Main {
public static void main(String[] args) {
Bird b = new Bird("Tweety");
System.out.println(b.describe());
// I am an animal named Tweety, and I can fly
}
}
class Animal {
private String name;
public Animal(String name) { this.name = name; }
public String describe() { return "I am an animal named " + this.name; }
}
class Bird extends Animal {
public Bird(String name) { super(name); }
public String describe() {
return super.describe() + ", and I can fly"; // reuse, then add
}
}
is-a: a subclass fits where its superclass is expected
- Because a
Dogis anAnimal, you can writeAnimal a = new Dog("Spot");. - The variable's type is
Animal, but the object is really aDog. - This "is-a" rule is what makes the next lesson — polymorphism — possible.
is-a : une sous-classe s'intègre là où sa superclasse est attendue
- Parce qu'un
Dogest unAnimal, vous pouvez écrireAnimal a = new Dog("Spot");. - Le type de la variable est
Animal, mais l'objet est réellement unDog. - Cette règle "is-a" rend possible la leçon suivante — le polymorphisme.
Common mistakes
super(...)must be the first line of a subclass constructor.- Add
@Overrideso the compiler catches a wrong signature.
Erreurs courantes
super(...)doit être la première ligne d'un constructeur de sous-classe.- Ajoutez
@Overridepour que le compilateur détecte une mauvaise signature.
Now you try
- Each task gives you a finished
Animalsuperclass. Write or complete the subclass below it. - A hidden Harness builds your object and checks both inherited and new behaviour.
- Press Run to compile, then Check answer. Your code runs on the server, so even the first run is fast.
À vous maintenant
- Chaque exercice vous donne une superclasse
Animalterminée. Écrivez ou complétez la sous-classe en dessous. - Un Harness caché crée votre objet et vérifie le comportement hérité et nouveau.
- Cliquez sur Run pour compiler, puis Check answer. Votre code s'exécute sur le serveur, donc même le premier lancement est rapide.
Below the finished Animal, write a class Cat that extends Animal. Give it a constructor Cat(String name) that passes the name up with super(name). Add nothing else — Cat should inherit getName() for free. · Sous la classe terminée Animal, écrivez une classe Cat qui étend Animal. Donnez-lui un constructeur Cat(String name) qui passe le nom vers le haut avec super(name). N'ajoutez rien d'autre — Cat héritera gratuitement de getName().
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.
Complete the class Cow (it already extends Animal). Override speak() so a Cow returns · rendements "Moo" instead of the default. getName() must still work (inherited). · Complétez la classe Cow (elle étend déjà Animal). Redéfinissez speak() pour qu'un Cow retourne "Moo" au lieu de la valeur par défaut. getName() doit toujours fonctionner (hérité).
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.
Complete the class Fish (it already extends Animal). Override describe() so it returns the Animal description plus ", and I can swim". Reuse the parent's work by calling super.describe() — do not rewrite the whole sentence. · Complétez la classe Fish (elle étend déjà Animal). Redéfinissez describe() pour qu'elle retourne la description Animal plus ", and I can swim". Réutilisez le travail du parent en appelant super.describe() — ne réécrivez pas toute la phrase.
Click Run to see the output here. · Cliquez sur Exécuter pour voir le résultat ici.