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 de la clase padre. Esta debe ser la primera instrucción 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.
Desafío
FácilConstruyamos un sistema de electrodomésticos que demuestre cómo las clases hijas pueden usar super para llamar a los constructores de las clases padre y ampliar el comportamiento de los métodos heredados.
Crearás tres archivos para organizar tu código:
Appliance.java: Crea la clase padre que representa cualquier electrodoméstico del hogar. Debe tener:- Un campo privado para la
brand(String) del electrodoméstico - Un campo privado para
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 la potencia - Un método
getInfo()que devuelva:[brand] - [wattage]W
- Un campo privado para la
WashingMachine.java: Crea una subclase que extienda Appliance. Una lavadora tiene todo lo que tiene un electrodoméstico, además de sus propias características especiales:- Un campo privado para
capacity(int) que representa la capacidad de carga en kg - Un constructor que reciba la marca, la potencia y la capacidad; usa
super(brand, wattage)para inicializar la parte de la clase padre y después establece la capacidad - Un método
getCapacity()que devuelva la capacidad - Un método
getInfo()que llame al métodogetInfo()de la clase padre usandosuper.getInfo()y lo amplíe para devolver:[parent info], Capacity: [capacity]kg
- Un campo privado para
Main.java: Crea una WashingMachine y muestra toda su información. Recibirás tres entradas: la marca (String), la potencia (int) y la capacidad (int). Imprime el resultado de llamar agetInfo()en tu lavadora.
Recibirás tres entradas: el nombre de la marca, la potencia y la capacidad.
Observa cómo super cumple aquí dos propósitos: llamar al constructor de la clase padre para inicializar los campos heredados y llamar al método de la clase padre para basarse en su comportamiento en lugar de reemplazarlo por completo.
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
}
}
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
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón IteratorPractica por tu cuenta: Compilador de Java online