Herança Básica (extends)
Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy. Lição 20 de 87.
Herança é um dos pilares fundamentais da POO. Ela permite que uma classe adquira as propriedades e métodos de outra classe, promovendo a reutilização de código e estabelecendo uma hierarquia natural entre as classes.
Em Java, você cria uma relação de herança usando a palavra-chave extends. A classe que herda é chamada de subclasse (ou classe filha), e a classe da qual se herda é a superclasse (ou classe pai).
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // Chama o construtor pai
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}A classe Dog herda automaticamente o método eat() e o método getName() de Animal. Ela também pode definir seus próprios métodos como bark():
Dog myDog = new Dog("Buddy");
myDog.eat(); // Herdado: "Buddy is eating"
myDog.bark(); // Método próprio: "Buddy says woof!"Pense na herança como uma relação de "é um". Um Dog é um Animal, então faz sentido que Dog estenda Animal. Essa relação permite criar classes especializadas que compartilham funcionalidades comuns e, ao mesmo tempo, adicionam seus próprios comportamentos exclusivos.
Desafio
FácilVamos criar um sistema simples de veículos que demonstra a herança em ação. Você criará uma classe pai que contém propriedades comuns dos veículos e uma classe filha que a estende com um comportamento especializado.
Você organizará seu código em três arquivos:
Vehicle.java: crie a classe pai que representa qualquer veículo. Ela deve ter:- Um campo privado para a
brand(String) do veículo - Um construtor que aceita o nome da marca e o atribui ao campo. (Nenhuma chamada a
super()é necessária aqui, pois Vehicle está no topo da hierarquia.) - Um método
getBrand()que retorna a marca - Um método
start()que imprime:[brand] is starting
- Um campo privado para a
Motorcycle.java: crie uma subclasse que estende Vehicle. Uma motocicleta é um veículo, portanto, essa relação de “é-um” torna a herança apropriada. Sua Motorcycle deve:- Usar
extendspara herdar de Vehicle - Ter um construtor que recebe a marca e a passa para a classe pai usando
super(brand) - Adicionar seu próprio método
wheelie()que imprime:[brand] is doing a wheelie!
- Usar
Main.java: reúna tudo criando um objeto Motorcycle e demonstrando tanto os comportamentos herdados quanto os exclusivos. Você receberá uma entrada: o nome da marca. Imprima duas linhas chamando:- O método herdado
start() - O método próprio de Motorcycle,
wheelie()
- O método herdado
Você receberá uma entrada: o nome da marca (String) da sua motocicleta.
Observe como sua Motorcycle automaticamente tem acesso a start() e getBrand() sem precisar reescrevê-los — esse é o poder da herança!
Experimente você mesmo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: Crie um objeto Motorcycle com a brand
// TODO: Chame o método start() herdado
// TODO: Chame o método wheelie()
}
}
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