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.
Desafío
FácilVamos 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
- Un campo privado para la marca del electrodoméstico
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 algetInfo()del padre usandosuper.getInfo()y lo extienda para devolver:[parent info], Capacity: [capacity]kg
- Un campo privado para la capacidad
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 agetInfo()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
}
}
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 Iterator