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 do tipo "é um". Um Dog é um Animal, então faz sentido que Dog estenda Animal. Essa relação permite que você construa classes especializadas que compartilham funcionalidades comuns, ao mesmo tempo em que adicionam seus próprios comportamentos únicos.
Desafio
FácilVamos construir um sistema de veículos simples que demonstra a herança em ação. Você criará uma classe pai que contém propriedades comuns de 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
branddo veículo (String) - Um construtor que aceita o nome da marca (o uso de
super()não é necessário aqui, pois Vehicle é o pai) - 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, então essa relação "é-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 o 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 comportamentos herdados e únicos. Você receberá uma entrada: o nome da marca. Imprima duas linhas chamando:- O método herdado
start() - O método próprio da Motorcycle
wheelie()
- O método herdado
Você receberá uma entrada: o nome da marca (String) para sua motocicleta.
Observe como sua Motorcycle tem acesso automático a start() e getBrand() sem precisar reescrevê-los - esse é o poder da herança!
Folha de consulta
Use a palavra-chave extends para criar uma relação de herança entre classes:
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 subclasse (filha) herda todos os métodos da superclasse (pai) e pode adicionar os seus próprios:
Dog myDog = new Dog("Buddy");
myDog.eat(); // Método herdado
myDog.bark(); // Método próprioUse super() no construtor da subclasse para chamar o construtor da classe pai.
A herança representa uma relação do tipo "é um" (is-a) entre classes.
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 Iterator