+0

Herencia de clases en Java

Duration: 4m 7s



Vamos a ver qué es esto de la Herencia de clases en Java.

¿Qué es la herencia de clases?

La herencia de clases es un mecanismo que permite a una clase heredar los atributos y métodos de otra clase. Esto permite reutilizar código y facilita la organización del mismo.

¿Cómo se implementa la herencia de clases?

La herencia de clases se implementa utilizando la palabra clave extends. La subclase se declara después de la palabra clave extends, seguida del nombre de la superclase.

Si la clase que se hereda tiene un constructor específico, se tendrá que implementar con la palabra clave super.

Basándonos en la clase Vehicle que ya tenemos, vamos a crear dos clases más: Car y Truck. Ambas heredarán todos los miembros de Vehicle, ya que nos servirán como una base. Como el constructor de la clase Vehicle requiere parámetros, tendremos que crear un constructor en nuestras nuevas clases, y con la palabra clave super llamar al constructor de la clase que estamos heredando, en este caso Vehicle. Le pasaremos al constructor los combustibles máximos para cada tipo. Nos debería quedar algo así:

package me.polvallverdu.course.vehicles;  
  
public class Car extends Vehicle {  
 
    public Car() {  
        super(50);  
    }  
    
}
package me.polvallverdu.course.vehicles;  
  
public class Truck extends Vehicle {  
  
    public Truck() {  
        super(100);  
    }  
  
}

Si vamos a Main y probamos a instanciar Vehicle, nos pedirá el combustible, y veremos todos sus métodos.

Métodos de la clase Vehicle

Métodos de la clase Vehicle

En cambio, si instanciamos Car, vemos cómo no nos pide nada el constructor (porque ya le hemos pasado ese valor en el constructor de Car) y tendremos todos los miembros heredados de Vehicle.

Métodos de la clase Car heredados de Vehicle

Métodos de la clase Car heredados de Vehicle

super

La palabra clave super se utiliza para llamar métodos de la clase heredada desde la misma subclase.

Si desde el mismo constructor de Car quisiéramos encender Vehicle, podríamos llamar al método:

package me.polvallverdu.course.vehicles;  
  
public class Car extends Vehicle {  
  
    public Car() {  
        super(50);  
        super.on();  
    }  
  
}

Sobreescribir métodos

Sobreescribir un método es redefinir un método heredado de una clase. Para sobreescribir un método, se debe declarar el método en la subclase con el mismo nombre, tipo de retorno y parámetros que el método heredado de la superclase. La subclase debe usar la anotación @Override para indicar que está sobreescribiendo un método heredado.

Supongamos que Truck, como es un vehículo más grande, queremos que gaste 5 más de combustible. Primero tendremos que hacer protected el campo fuel en Vehicle para poder acceder desde la clase Truck:

package me.polvallverdu.course.vehicles;  
  
public class Vehicle {  
  
    private boolean powered;  
    private final int maxFuel;  
    protected int fuel;
    
    // ...
 
}

Ahora, con @Override desde Truck, podemos reescribir el método on() de Vehicle:

package me.polvallverdu.course.vehicles;  
  
public class Truck extends Vehicle {  
  
    public Truck() {  
        super(100);  
    }  
  
    @Override  
    public void on() {  
        this.fuel -= 5;  
        super.on();  
    }  
}