Polimorfismo em Java
Guarde objetos diferentes numa variavel tipada do pai para que um mesmo nome de chamada possa rodar corpos diferentes. Em Machine, mantenha horn imprimindo tone. Em Truck, reescreva horn para imprimir honk. Em Car, reescreva horn para imprimir beep. Em Yard.java, atribua Machine m = new Machine();, Machine t = new Truck(); e Machine c = new Car();, depois chame horn em cada uma. Compile com javac Yard.java e rode java Yard. A tela deve mostrar tone, depois honk, depois beep. Uma segunda demo guarda so os dois filhos como referencias Machine. Deixe equals para a pagina seguinte — esta licao e um tipo pai que segura muitas formas.
Um tipo pai, tres corpos horn
A pagina abstract deixou um metodo inacabado para os filhos preencherem. Esta pagina foca na chamada atraves de uma variavel tipada do pai. Abra Yard.java. Mantenha o nome da classe publica Yard. Apague demos so-abstract se enterrarem a historia tipada do pai, arquivos enum Level sobrando, demos de caminho e qualquer Scanner de teclado. O programa nao deve esperar digitacao. Nenhuma linha import e necessaria.
Declare um pai normal com corpo horn:
class Machine {
void horn() {
System.out.println("tone");
}
}
Declare filhos com extends Machine e corpos proprios de horn que imprimem honk e beep. Nome igual e lista de parametros vazia significam que cada filho faz override do metodo do pai.
Dentro de Yard.main, construa tres variaveis cujo tipo declarado e Machine:
Machine m = new Machine();
Machine t = new Truck();
Machine c = new Car();
Depois chame:
m.horn();
t.horn();
c.horn();
O tipo declarado e Machine para as tres. O objeto real decide qual corpo horn roda.
class Machine {
void horn() {
System.out.println("tone");
}
}
class Truck extends Machine {
void horn() {
System.out.println("honk");
}
}
class Car extends Machine {
void horn() {
System.out.println("beep");
}
}
public class Yard {
public static void main(String[] args) {
Machine m = new Machine();
Machine t = new Truck();
Machine c = new Car();
m.horn();
t.horn();
c.horn();
}
}
Da pasta que guarda Yard.java, rode javac Yard.java. Quando parenteses, chaves e ponto e virgula baterem, javac nao escreve linha propria. Depois rode java Yard — nao java Yard.java. Tire o final .java do comando de execucao. Mantenha uma classe publica no arquivo para o nome bater com Yard. Tipos auxiliares ficam sem public neste formato iniciante.
A tela mostra tone, depois honk, depois beep. Percorra a execucao uma vez. Java comeca em Yard.main. m guarda um Machine simples, entao m.horn() imprime tone. t guarda um Truck mesmo que o tipo da variavel diga Machine, entao t.horn() imprime honk. c guarda um Car, entao c.horn() imprime beep. Mesma grafia da chamada. Tres corpos.
Aponte cada atribuicao enquanto le a linha da tela que combina com ela. A primeira linha pertence a maquina simples. A segunda linha pertence ao objeto truck atras de um nome tipado machine. A terceira linha pertence ao objeto car atras de um nome tipado machine. Esse jogo de combinar e a licao inteira num so passe.
Se ainda vir so honk depois park de uma demo abstract, mude para o arquivo de ensino de polymorphism e rode java Yard de novo. Se cada variavel for tipada so Truck ou Car, voce ainda nao mostra a forma tipada do pai desta pagina — mantenha o tipo Machine a esquerda das atribuicoes na demo.
Diga a regra em voz alta enquanto olha a tela: o tipo da variavel pode ser o pai, o objeto pode ser o filho, a chamada roda o corpo do filho quando o filho fez override do metodo. Nao invente um override de equals nesta pagina. Esse topico espera a proxima licao.
Dois filhos por referencias Machine
Um segundo programa mantem os overrides. main constroi so Truck e Car, ainda guardados como Machine, e chama horn em cada um.
class Machine {
void horn() {
System.out.println("tone");
}
}
class Truck extends Machine {
void horn() {
System.out.println("honk");
}
}
class Car extends Machine {
void horn() {
System.out.println("beep");
}
}
public class Yard {
public static void main(String[] args) {
Machine t = new Truck();
Machine c = new Car();
t.horn();
c.horn();
}
}
Compile com javac Yard.java, depois rode java Yard. A tela mostra honk, depois beep. Nao ha objeto Machine simples nesta segunda demo, mas as duas variaveis ainda sao tipadas Machine. Os objetos filhos fornecem os corpos. E a mesma ideia de polymorphism com tela mais curta.
Leia as linhas de atribuicao mais uma vez: esquerda Machine, direita new Truck() ou new Car(). A esquerda nomeia o tipo pai pelo qual voce chama. A direita nomeia o objeto real. Mantenha extends Machine nos dois filhos para essas atribuicoes continuarem legais.
Se demos abstract sobrando ainda estiverem por perto, guarde-as como historia. Para esta licao rode o arquivo de ensino de polymorphism para a tela mostrar tone / honk / beep ou honk / beep, nao park como historia principal. Se javac reclamar de classes publicas duplicadas, mantenha so Yard public.
Qual corpo horn roda
📊 Who runs for each Machine variable
| Variable | Real object | horn prints |
|---|---|---|
m |
Machine |
tone |
t |
Truck |
honk |
c |
Car |
beep |
Comparado com preenchimentos abstract
Na pagina abstract, Machine deixou horn inacabado e os filhos preencheram, muitas vezes com um park compartilhado. Nesta pagina, Machine ja tem corpo tone, os filhos fazem override, e variaveis tipadas do pai guardam os objetos. Voce ainda compila Yard.java e roda java Yard. Os tokens novos sao atribuicoes tipadas do pai como Machine t = new Truck(); e as tres impressoes diferentes de um mesmo nome de chamada.
Se um arquivo abstract sobrando ainda estiver aberto, voce pode ver abstract void horn(); e park. Mude para o arquivo de polymorphism para Machine ter um corpo horn normal e main atribuir variaveis Machine a objetos diferentes. Mantenha demos de equals fora desta pagina. Mantenha entrada de teclado fora desta pagina.
Antes de equals
Voce pode atribuir variaveis Machine a objetos Machine, Truck e Car e ver tone, depois honk, depois beep. Voce pode guardar so os dois filhos como referencias Machine e ver honk depois beep. Compile Yard.java e rode java Yard para cada demo que mantiver. A chamada usou o dono do corpo. A proxima pagina e equals, onde dois objetos sao comparados por igualdade de forma segura para ensino.
Mantenha a demo de tres objetos para uma tela clara de pai mais filhos. Mantenha a demo de dois filhos para um par claro tipado do pai. Mantenha arquivos equals fora desta pagina. Esses tres habitos sao o ponto de checagem antes de avancar. Quando honk aparece de uma variavel truck tipada Machine, polymorphism fez o trabalho desta licao e voce esta pronto para o proximo topico sobre equals.
Uma ultima passagem pela pasta: um Yard publico, corpos horn de pai e filho, variaveis tipadas do pai em main, sem espera de teclado, sem forcar equals. Rode javac Yard.java e java Yard mais uma vez na demo que mantiver aberta. Se a tela ainda bater com a tabela, a chamada de muitas formas esta solida e o curso pode ir para equals na pagina seguinte.
🧠 Teste Seu Conhecimento
Teste Seu Conhecimento
Desafie-se com este questionário interativo e veja o quão bem você entende o tópico
📝 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