A Palavra-chave super
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 21 de 87.
A palavra-chave super fornece uma maneira para uma subclasse referenciar sua classe pai. É essencial quando você precisa acessar membros ou construtores da classe pai de dentro de uma classe filha.
O uso mais comum de super é chamar o construtor da classe pai. Esta deve ser a primeira instrução no construtor da subclasse:
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); // Deve ser a primeira linha
this.doors = doors;
}
}Você também pode usar super para chamar métodos pai, o que é particularmente útil quando a subclasse tem um método com o mesmo nome:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Chama a versão de Animal
System.out.println("Meow!");
}
}Pense no super como o oposto do this. Enquanto o this se refere ao objeto atual, o super se refere à parte da classe pai desse objeto. Essa distinção torna-se crucial ao construir hierarquias de classes onde as classes filhas precisam estender, em vez de substituir completamente, o comportamento do pai.
Desafio
FácilVamos construir um sistema de eletrodomésticos que demonstra como as classes filhas podem usar super para chamar construtores pais e estender o comportamento dos métodos dos pais.
Você criará três arquivos para organizar seu código:
Appliance.java: Crie a classe pai que representa qualquer eletrodoméstico. Ela deve ter:- Um campo privado para a marca do eletrodoméstico
brand(String) - Um campo privado para a potência
wattage(int) - Um construtor que aceita ambos os valores e os inicializa
- Um método
getBrand()que retorna a marca - Um método
getWattage()que retorna a potência - Um método
getInfo()que retorna:[brand] - [wattage]W
- Um campo privado para a marca do eletrodoméstico
WashingMachine.java: Crie uma subclasse que estende Appliance. Uma máquina de lavar tem tudo o que um eletrodoméstico tem, além de suas próprias características especiais:- Um campo privado para a capacidade
capacity(int) representando a capacidade de carga em kg - Um construtor que recebe brand, wattage e capacity - use
super(brand, wattage)para inicializar a parte do pai e, em seguida, defina a capacidade - Um método
getCapacity()que retorna a capacidade - Um método
getInfo()que chama ogetInfo()do pai usandosuper.getInfo()e o estende para retornar:[parent info], Capacity: [capacity]kg
- Um campo privado para a capacidade
Main.java: Crie uma WashingMachine e exiba suas informações completas. Você receberá três entradas: a marca (String), a potência (int) e a capacidade (int). Imprima o resultado da chamada degetInfo()em sua máquina de lavar.
Você receberá três entradas: nome da marca, potência e capacidade.
Observe como o super serve a dois propósitos aqui: chamar o construtor pai para inicializar campos herdados e chamar o método do pai para aproveitar seu comportamento em vez de substituí-lo inteiramente.
Folha de consulta
A palavra-chave super referencia a classe pai de dentro de uma subclasse.
Use super() para chamar o construtor pai. Esta deve ser a primeira instrução no construtor da subclasse:
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); // Must be first line
this.doors = doors;
}
}Use super.methodName() para chamar métodos do pai, o que é útil quando a subclasse sobrescreve um método:
public class Animal {
public void makeSound() {
System.out.println("Some sound");
}
}
public class Cat extends Animal {
public void makeSound() {
super.makeSound(); // Calls Animal's version
System.out.println("Meow!");
}
}super refere-se à parte da classe pai de um objeto, enquanto this refere-se ao objeto atual.
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Ler as entradas
String brand = scanner.nextLine();
int wattage = scanner.nextInt();
int capacity = scanner.nextInt();
// TODO: Criar um objeto WashingMachine com os valores de entrada
// TODO: Imprimir o resultado da chamada de getInfo() na máquina de lavar
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator