Carregando...

Sobrescrita em Java

Reescreva um metodo do pai no filho para a chamada usar o corpo do filho. Mantenha Truck extends Car. Em Car, mantenha horn imprimindo beep. Em Truck, escreva horn de novo para imprimir honk. Em Yard.java, construa um Truck e chame t.horn(). Compile com javac Yard.java e rode java Yard. A tela deve mostrar honk. Uma segunda demo tambem constroi um Car simples para voce ouvir beep do pai e honk do filho. Deixe interfaces para a pagina seguinte — esta licao e um nome de metodo com dois corpos.

Reescreva horn no filho

A pagina de heranca deixou Truck vazio para t.horn() manter o beep do pai. A pagina de super rodou construtores com super. Esta pagina muda o corpo do metodo no filho. Abra Yard.java. Mantenha o nome da classe publica Yard. Apague impressoes so de construtor de car e truck se enterrarem a historia do metodo, demos de caminho sobrando, escritores Store e qualquer Scanner de teclado. O programa nao deve esperar digitacao. Nenhuma linha import e necessaria.
Declare o pai com um metodo de instancia que imprime beep:
class Car {
void horn() {
System.out.println("beep");
}
}
Declare o filho com extends Car. Dentro de Truck, escreva o mesmo nome de metodo de novo, mas imprima honk:
void horn() {
System.out.println("honk");
}
Nome igual e lista de parametros vazia igual significam que a versao do filho substitui a versao do pai para objetos Truck. Voce nao esta adicionando um segundo metodo sem relacao. Voce esta sobrescrevendo horn.
Dentro de Yard.main, construa um truck e chame o metodo:
Truck t = new Truck();
t.horn();
A chamada roda o corpo escrito em Truck, entao a tela imprime honk.

Yard Truck overrides horn to honk

java
class Car {
    void horn() {
        System.out.println("beep");
    }
}

class Truck extends Car {
    void horn() {
        System.out.println("honk");
    }
}

public class Yard {
    public static void main(String[] args) {
        Truck t = new Truck();
        t.horn();
    }
}

Da pasta que guarda Yard.java, rode javac Yard.java. Quando parenteses, chaves e ponto e virgula batem, javac nao escreve linha propria. Depois rode java Yard — nao java Yard.java. Tire o sufixo .java do comando de execucao. Mantenha uma classe publica no arquivo para o nome coincidir com Yard. Os tipos auxiliares Car e Truck ficam sem public nesta forma iniciante.
A tela mostra honk. Percorra a execucao uma vez. Java comeca em Yard.main. new Truck() constroi um truck. t.horn() olha o tipo real de t. Como Truck escreveu o proprio horn, esse corpo do filho roda e imprime honk. O corpo beep do pai fica em Car e nao e usado nesta chamada do truck.
Se voce ainda ve beep, confira se Truck realmente contem um metodo horn. Um Truck vazio da pagina de heranca ainda herda beep. Sobrescrever exige que o metodo do filho esteja presente com o mesmo nome. Se voce ainda ve car depois truck de uma demo de construtor, mude para o arquivo didatico de override e rode java Yard de novo.
Diga a regra em voz alta enquanto olha a tela: mesmo nome de metodo no filho, o corpo do filho vence para aquele objeto. Mantenha extends Car para Truck continuar sendo um tipo de Car. Sem extends, um horn em Truck seria uma historia de tipo separada, nao uma sobrescrita do metodo do pai.
Nao invente um arquivo interface nesta pagina. Interfaces esperam a licao seguinte. Hoje uma hierarquia de classes carrega dois corpos horn, e o corpo do filho responde a chamada em um truck.

beep do pai e honk do filho lado a lado

Um segundo programa mantem a sobrescrita. main constroi tanto um Car quanto um Truck, depois chama horn em cada um. O pai ainda imprime beep. O filho ainda imprime honk.

Yard Car beep and Truck honk

java
class Car {
    void horn() {
        System.out.println("beep");
    }
}

class Truck extends Car {
    void horn() {
        System.out.println("honk");
    }
}

public class Yard {
    public static void main(String[] args) {
        Car c = new Car();
        Truck t = new Truck();
        c.horn();
        t.horn();
    }
}

Compile com javac Yard.java, depois rode java Yard. A tela mostra beep, depois honk. A primeira linha vem do objeto Car. A segunda linha vem do objeto Truck. Sobrescrever no filho nao apaga o metodo do pai para objetos pai. Cada objeto usa o corpo que pertence ao proprio tipo.
Leia os dois metodos horn mais uma vez. Mesmo nome. Mesma lista de parametros vazia. Texto de impressao diferente. Essa igualdade de assinatura e o que torna a versao do filho uma sobrescrita em vez de um metodo novo sem relacao. Se voce renomear o metodo do filho para outra coisa, a heranca manteria beep nos trucks de novo, e voce nao estaria mais ensinando override.
Se demos de construtor com super() ainda estiverem na pasta, mantenha-as como historia. Para esta licao rode o arquivo didatico de override para a tela mostrar impressoes de metodo, nao palavras de ordem de construtor. Se javac reclamar de classes publicas duplicadas, voce ainda tem mais de uma classe publica no arquivo — mantenha so Yard publico.

Corpo do pai versus corpo do filho

📊 Who prints what for horn

Role horn body
Parent Car prints beep
Child Truck prints honk (overrides)
A tabela e o mapa curto desta pagina. So heranca colocaria beep nos dois papeis quando o filho fica vazio. Depois da sobrescrita, a linha do filho muda para honk enquanto a linha do pai fica beep. Guarde esse mapa quando a segunda demo imprimir as duas linhas.

Comparado com extends vazio e com super

Na pagina de heranca, Truck vazio manteve o horn do pai e imprimiu beep. Na pagina de super, construtores rodaram por super e imprimiram car depois truck. Nesta pagina, o proprio metodo muda no filho. Voce ainda precisa de extends. Voce ainda pode usar construtores depois. Voce ainda nao precisa de interface.
Se um Truck vazio sobrando ainda estiver aberto, acrescente o horn do filho que imprime honk antes de julgar a tela. Se um arquivo de construtor sobrando ainda estiver aberto, mude para o arquivo de override para t.horn() ser a chamada sob teste. Os tokens novos sao o metodo reescrito no filho e as duas palavras diferentes da tela beep e honk.

Antes de interfaces

Voce pode reescrever horn em Truck e ver honk de t.horn(). Voce pode chamar tanto c.horn() quanto t.horn() e ver beep depois honk. Compile Yard.java e rode java Yard para cada demo que voce mantiver, uma de cada vez. O corpo do filho respondeu a chamada do truck. A pagina seguinte e interfaces, onde um tipo pode prometer metodos sem usar so extends.
Mantenha a demo de um so truck com honk para uma sobrescrita clara. Mantenha a demo de dois objetos para um contraste claro pai-versus-filho. Mantenha arquivos de interface fora desta pagina. Esses tres habitos sao o posto de controle antes de seguir. Quando honk aparece depois de t.horn() e beep ainda aparece depois de c.horn(), a sobrescrita fez o trabalho desta licao e voce esta pronto para o proximo topico sobre interfaces.
Uma ultima passagem pela pasta: um Yard publico, dois tipos auxiliares, um horn do filho que imprime honk, sem espera de teclado, sem forcar interface. Rode javac Yard.java e java Yard mais uma vez na demo que voce mantiver aberta. Se a tela ainda bater com a tabela — pai beep, filho honk — a sobrescrita esta solida e o curso pode ir para interfaces na pagina seguinte.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
5
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo