Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Vamos 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
  • 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 o getInfo() do pai usando super.getInfo() e o estende para retornar: [parent info], Capacity: [capacity]kg
  • 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 de getInfo() 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
    }
}
quiz iconTeste seus conhecimentos

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