AnyCompiler

Inheritance

Una class puede heredar de otra con extends, obteniendo automáticamente acceso a sus fields y methods. super(name) dentro del constructor de una subclass llama al constructor de la parent class, lo cual es obligatorio antes de que el constructor de la subclass pueda hacer cualquier otra cosa cuando la parent no tiene un constructor sin argumentos.

Hacer override con @Override

Marcar un method con @Override le dice al compilador que pretendes reemplazar la versión de la parent class — es opcional, pero detecta errores reales, como un nombre de method mal escrito que de otro modo definiría silenciosamente un method completamente nuevo en vez de hacer override del que querías. dog.speak() llama a la versión propia de Dog, no a la de Animal, porque Dog la hace override.

public class Main {
    static class Animal {
        String name;

        Animal(String name) {
            this.name = name;
        }

        String speak() {
            return name + " makes a sound";
        }
    }

    static class Dog extends Animal {
        Dog(String name) {
            super(name);
        }

        @Override
        String speak() {
            return name + " barks";
        }
    }

    public static void main(String[] args) {
        Dog dog = new Dog("Rex");
        System.out.println(dog.speak());
    }
}
Output
Rex barks

Siguiente: polymorphism e interfaces — la forma de primera clase que tiene Java de describir comportamiento compartido entre classes no relacionadas.

Practice exercise

Define una class Animal con un field name y un method speak() que devuelva name + " makes a sound". Define una class Cat que extienda Animal y haga override de speak() para devolver name + " meows". Crea un Cat llamado "Whiskers" e imprime su speak().