Inheritance: extends, super, and overriding · Herencia: extends, super y 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.
Herencia: construir sobre una clase
- La herencia permite que una clase reutilice los campos y métodos de otra clase.
- La clase en la que te basas es la clase padre (superclase); la nueva clase es la clase hija (subclase).
- Una subclase es-un tipo de su superclase: un
Doges 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 y super
- Escribe
class Dog extends Animalpara hacer queDogsea una subclase deAnimal. Dogobtiene automáticamente todos los métodos públicos deAnimal, comogetName().- El constructor de la subclase llama primero al constructor de la superclase con
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.
Invocar un método
- Una subclase puede invocar un método heredado: le da la misma firma, un nuevo cuerpo.
- El
Dogdespeak()reemplaza alAnimaldespeak()para los objetosDog. - Los métodos que no invoca (como
getName()) se heredan sin cambios.
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() — extender, no reemplazar
- A veces quieres que el trabajo del padre más un poco más.
- Dentro de una invocación,
super.describe()ejecuta la versión de la superclase del método. - Luego agregas a su resultado en lugar de reescribirlo desde cero.
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: una subclase encaja donde se espera su superclase
- Porque un
Doges unAnimal, puedes escribirAnimal a = new Dog("Spot");. - El tipo de la variable es
Animal, pero el objeto es realmente unDog. - Esta regla "is-a" es lo que hace posible la siguiente lección: polimorfismo.
Common mistakes
super(...)must be the first line of a subclass constructor.- Add
@Overrideso the compiler catches a wrong signature.
Errores comunes
super(...)debe ser la primera línea de un constructor de subclase.- Agrega
@Overridepara que el compilador detecte una firma incorrecta.
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.
Ahora tú intentas
- Cada tarea te ofrece una superclase
Animalterminada. Escribe o completa la subclase debajo de ella. - Un Controlador oculto construye tu objeto y verifica tanto el comportamiento heredado como el nuevo.
- Presiona Run para compilar, luego Check answer. Tu código se ejecuta en el servidor, así que incluso la primera ejecución es rápida.
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. · Debajo de la clase Animal terminada, escribe una clase Cat que extienda Animal. Dale un constructor Cat(String name) que pase el nombre hacia arriba con super(name). No añadas nada más — Cat debería heredar getName() automáticamente.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
Complete the class Cow (it already extends Animal). Override speak() so a Cow returns · retornos "Moo" instead of the default. getName() must still work (inherited). · Completa la clase Cow (ya extiende Animal). Sobreescribe speak() para que una Cow devuelva "Moo" en lugar del valor por defecto. getName() debe seguir funcionando (heredado).
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
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. · Completa la clase Fish (ya extiende Animal). Sobreescribe describe() para que devuelva la descripción de Animal más ", and I can swim". Reutiliza el trabajo del padre llamando a super.describe() — no reescribas toda la oración.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.