Menu
Coddy logo textTech

Herança Simples e Multinível

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 25 de 87.

Até agora, vimos classes estendendo uma classe pai diretamente. Mas a herança pode formar estruturas diferentes dependendo de como as classes se relacionam entre si. Vamos explorar os dois padrões principais: herança única e herança multinível.

Herança única é o que temos usado. Uma classe estende exatamente uma classe pai diretamente:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

Aqui, tanto Dog quanto Cat herdam de Animal, mas eles não herdam um do outro. Cada filho tem um pai direto.

Herança multinível cria uma cadeia onde uma classe estende outra classe, que por sua vez estende outra classe:

public class Animal {
    public void eat() {
        System.out.println("Eating");
    }
}

public class Mammal extends Animal {
    public void breathe() {
        System.out.println("Breathing");
    }
}

public class Dog extends Mammal {
    public void bark() {
        System.out.println("Barking");
    }
}

Nesta cadeia, Dog herda de Mammal, que herda de Animal. Um objeto Dog tem acesso a todos os métodos de toda a cadeia:

Dog dog = new Dog();
dog.eat();      // De Animal
dog.breathe();  // De Mammal
dog.bark();     // De Dog

Lembre-se de que Object está no topo de cada cadeia. Portanto, nosso Dog na verdade tem quatro níveis: Object -> Animal -> Mammal -> Dog. O encadeamento de construtores flui por todos esses níveis ao criar um novo objeto.

challenge icon

Desafio

Fácil

Vamos criar uma hierarquia de transporte que demonstre padrões de herança simples e multinível. Você criará uma cadeia de classes em que cada nível adiciona novos recursos, mostrando como os métodos são herdados por vários níveis.

Você organizará seu código em quatro arquivos:

  • Vehicle.java: crie a classe-base no topo da sua hierarquia. Todo veículo deve ter:
    • Um campo privado para brand (String)
    • Um construtor que aceite a marca
    • Um método getBrand() que retorne a marca
    • Um método move() que imprima: [brand] is moving
  • LandVehicle.java: crie uma classe que estenda Vehicle, representando o nível intermediário da sua cadeia multinível. Veículos terrestres adicionam comportamentos específicos para o solo:
    • Um campo privado para wheels (int)
    • Um construtor que receba brand e wheels, usando super(brand) para a parte referente à classe-pai
    • Um método getWheels() que retorne a quantidade de rodas
    • Um método honk() que imprima: [brand] honks!
  • Car.java: crie uma classe que estenda LandVehicle, completando sua cadeia de herança de três níveis. Os carros adicionam seus próprios recursos especializados:
    • Um campo privado para model (String)
    • Um construtor que receba brand, wheels e model, usando super(brand, wheels)
    • Um método getModel() que retorne o modelo
    • Um método displayInfo() que imprima: [brand] [model] with [wheels] wheels
  • Main.java: demonstre como um objeto Car tem acesso aos métodos dos três níveis da hierarquia. Você receberá três entradas: brand (String), wheels (int) e model (String). Crie um Car e chame estes métodos na seguinte ordem:
    • move() - herdado de Vehicle (avô)
    • honk() - herdado de LandVehicle (pai)
    • displayInfo() - definido na própria classe Car

Você receberá três entradas: o nome da marca, o número de rodas e o nome do modelo.

Sua saída deve mostrar três linhas demonstrando como o objeto Car pode usar métodos de todos os níveis da sua cadeia de herança — desde o Vehicle, no nível mais alto, até sua própria classe!

Experimente você mesmo

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler as entradas
        String brand = scanner.nextLine();
        int wheels = scanner.nextInt();
        scanner.nextLine(); // consome a quebra de linha
        String model = scanner.nextLine();
        
        // TODO: Criar um objeto Car com os valores de entrada
        
        // TODO: Chamar move() - herdado de Vehicle (avô)
        
        // TODO: Chamar honk() - herdado de LandVehicle (pai)
        
        // TODO: Chamar displayInfo() - definido no próprio Car
    }
}
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

Pratique por conta própria: Compilador de Java online