Menu
Coddy logo textTech

La palabra clave super

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 21 de 87.

La palabra clave super proporciona una forma para que una subclase haga referencia a su clase madre. Es esencial cuando necesitas acceder a miembros o constructores de la clase madre desde una subclase.

El uso más común de super es llamar al constructor del padre. Esta debe ser la primera sentencia en el constructor de la subclase:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
    
    public String getBrand() {
        return brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // Debe ser la primera línea
        this.doors = doors;
    }
}

También puedes usar super para llamar a métodos del padre, lo cual es particularmente útil cuando la subclase tiene un método con el mismo nombre:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // Llama a la versión de Animal
        System.out.println("Meow!");
    }
}

Piense en super como lo opuesto a this. Mientras que this se refiere al objeto actual, super se refiere a la parte de la clase padre de ese objeto. Esta distinción se vuelve crucial al construir jerarquías de clases donde las clases hijas necesitan extender en lugar de reemplazar completamente el comportamiento del padre.

challenge icon

Desafío

Fácil

Vamos a construir un sistema de electrodomésticos que demuestre cómo las clases hijas pueden usar super para llamar a los constructores de los padres y extender el comportamiento de los métodos de los padres.

Crearás tres archivos para organizar tu código:

  • Appliance.java: Crea la clase padre que representa cualquier electrodoméstico. Debe tener:
    • Un campo privado para la marca del electrodoméstico brand (String)
    • Un campo privado para el vataje wattage (int)
    • Un constructor que acepte ambos valores y los inicialice
    • Un método getBrand() que devuelva la marca
    • Un método getWattage() que devuelva el vataje
    • Un método getInfo() que devuelva: [brand] - [wattage]W
  • WashingMachine.java: Crea una subclase que extienda de Appliance. Una lavadora tiene todo lo que tiene un electrodoméstico, además de sus propias características especiales:
    • Un campo privado para la capacidad capacity (int) que representa la capacidad de carga en kg
    • Un constructor que reciba brand, wattage y capacity; usa super(brand, wattage) para inicializar la parte del padre y luego establece la capacidad
    • Un método getCapacity() que devuelva la capacidad
    • Un método getInfo() que llame al getInfo() del padre usando super.getInfo() y lo extienda para devolver: [parent info], Capacity: [capacity]kg
  • Main.java: Crea una WashingMachine y muestra su información completa. Recibirás tres entradas: la marca (String), el vataje (int) y la capacidad (int). Imprime el resultado de llamar a getInfo() en tu lavadora.

Recibirás tres entradas: nombre de la marca, vataje y capacidad.

Observa cómo super sirve para dos propósitos aquí: llamar al constructor del padre para inicializar los campos heredados y llamar al método del padre para construir sobre su comportamiento en lugar de reemplazarlo por completo.

Hoja de referencia

La palabra clave super hace referencia a la clase padre desde una subclase.

Usa super() para llamar al constructor del padre. Esta debe ser la primera sentencia en el constructor de la subclase:

public class Vehicle {
    private String brand;
    
    public Vehicle(String brand) {
        this.brand = brand;
    }
}

public class Car extends Vehicle {
    private int doors;
    
    public Car(String brand, int doors) {
        super(brand);  // Debe ser la primera línea
        this.doors = doors;
    }
}

Usa super.methodName() para llamar a métodos del padre, lo cual es útil cuando la subclase sobrescribe un método:

public class Animal {
    public void makeSound() {
        System.out.println("Some sound");
    }
}

public class Cat extends Animal {
    public void makeSound() {
        super.makeSound();  // Llama a la versión de Animal
        System.out.println("Meow!");
    }
}

super se refiere a la parte de la clase padre de un objeto, mientras que this se refiere al objeto actual.

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Leer las entradas
        String brand = scanner.nextLine();
        int wattage = scanner.nextInt();
        int capacity = scanner.nextInt();
        
        // TODO: Crear un objeto WashingMachine con los valores de entrada
        
        // TODO: Imprimir el resultado de llamar a getInfo() en la lavadora
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos