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 DogLembre-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.
Desafio
FácilVamos 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
- Um campo privado para
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!
- Um campo privado para
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
- Um campo privado para
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
}
}
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 IteratorPratique por conta própria: Compilador de Java online