Buscar

Introducao ao polimorfismo

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 18 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Introdução ao polimorfismo
APRESENTAÇÃO
Polimorfismo é um dos quatro pilares da programação orientada a objetos. Polimorfismo deriva 
do grego “muitas formas”. Em orientação a objetos, seria usar o mesmo método de formas 
diferentes. Segundo Horstmann Cay (2009), quando múltiplas classes implementam a mesma 
interface, cada classe implementa os métodos da interface de diferentes maneiras, isto é, cada 
classe implementa o método de acordo com suas funcionalidades. 
Nesta Unidade de Aprendizagem estudaremos o polimorfismo e sua aplicação. 
Bons estudos.
Ao final desta Unidade de Aprendizagem, você deve apresentar os seguintes aprendizados:
Definir o que é polimorfismo.•
Identificar interfaces.•
Construir uma aplicação utilizando a prática de polimorfismo.•
DESAFIO
Você trabalha como analista/programador em uma fábrica de software e foi solicitada a criação 
de uma calculadora com as quatro operações básicas da matemática - soma, subtração, 
multiplicação e divisão. Essa calculadora deverá receber apenas dois números de cada vez e a 
operação desejada. Para construi-la, você deverá fazer o uso de uma interface com um método 
calcular e quatro classes que implementam esta interface, cada classe correspondente a uma 
operação. Crie uma classe controle para instanciar as classes das operações. Para executar a 
tarefa, utilize uma linguagem de programação orientada a objeto. 
Logo após a criação, exporte o projeto em um arquivo zipado.
INFOGRÁFICO
Veja no infográfico conceitos de polimorfismo.
 
CONTEÚDO DO LIVRO
O polimorfismo permite que você “programe no geral”, em vez de “programar no específico”. 
Em particular, permite escrever programas que processam objetos que compartilham a mesma 
superclasse (direta ou indiretamente), como se todos fossem objetos da superclasse; isso pode 
simplificar a programação. 
Acompanhe um trecho do livro Android: como programar, o qual serve de base teórica para esta 
Unidade de Aprendizagem. Inicie seu estudo pelo tópico Introdução ao polimorfismo e finalize 
no tópico Declarando uma classe abstrata e métodos abstratos. 
Boa leitura!
com introdução a Java
Paul Deitel • Harvey Deitel • Abbey Deitel
SEGUNDA EDIÇÃO
Catalogação na publicação: Poliana Sanchez de Araujo – CRB 10/2094
D324a Deitel, Paul.
 Android : como programar [recurso eletrônico] / Paul 
 Deitel, Harvey Deitel, Abbey Deitel ; tradução: João 
 Eduardo Nóbrega Tortello. – 2. ed. – Porto Alegre : 
 Bookman, 2015.
 Editado como livro impresso em 2015.
 ISBN 978-85-8260-348-2
 1. Programação - Android. I. Deitel, Harvey. II. Deitel, 
 Abbey. III. Título. 
CDU 004.438Android
548 Android: Como Programar
G.6 Introdução ao polimorfismo
Continuamos nosso estudo sobre programação orientada a objetos explicando e de-
monstrando o polimorfismo com hierarquias de herança. O polimorfismo permite que 
você “programe no geral”, em vez de “programar no específico”. Em particular, o poli-
morfismo permite escrever programas que processam objetos que compartilham a mes-
ma superclasse (direta ou indiretamente), como se todos fossem objetos da superclasse; 
isso pode simplificar a programação.
Considere o exemplo de polimorfismo a seguir. Suponha que criemos um progra-
ma para simular o movimento de vários tipos de animais para um estudo biológico. As 
classes Peixe, Rã e Pássaro representam os tipos de animais sob investigação. Imagine 
que cada classe estende a superclasse Animal, a qual contém um método mover e mantém 
a posição atual de um animal como coordenadas x-y. Cada subclasse implementa o mé-
todo mover. Nosso programa mantém um array Animal que contém referências para obje-
tos de várias subclasses de Animal. Para simular os movimentos dos animais, o programa 
envia a cada objeto a mesma mensagem, uma vez por segundo – a saber, mover. Cada tipo 
específico de Animal responde a uma mensagem mover à sua própria maneira – um Peixe 
poderia nadar por um metro, uma Rã poderia pular por um metro e meio e um Pássaro 
poderia voar por três metros. Cada objeto sabe como modificar suas coordenadas x-y 
apropriadamente para seu tipo específico de movimento. Contar com o fato de que cada 
objeto sabe como “fazer a coisa certa” (isto é, fazer o que é adequado para esse tipo de 
objeto) em resposta à mesma chamada de método é o principal conceito do polimorfis-
mo. A mesma mensagem (neste caso, mover) enviada para uma variedade de objetos tem 
“muitas formas” de resultados – daí o termo polimorfismo.
Programar no específico
Ocasionalmente, ao realizarmos processamento polimórfico, precisamos programar “no 
específico”. Vamos demonstrar que um programa pode determinar o tipo de um objeto 
no momento da execução e atuar nesse objeto de forma correspondente.
Interfaces
O apêndice continua com uma introdução às interfaces Java. Uma interface descreve 
um conjunto de métodos que podem ser chamados em um objeto, mas não fornece 
implementações concretas para todos os métodos. Você pode declarar classes que im-
plementam (isto é, fornecem implementações concretas para os métodos de) uma ou 
mais interfaces. Cada método de interface deve ser declarado em todas as classes que im-
plementam a interface explicitamente. Quando uma classe implementa uma interface, 
todos os objetos dessa classe têm uma relação é um com o tipo de interface, e é garantido 
que todos os objetos da classe fornecem a funcionalidade descrita pela interface. Isso 
também vale para todas as subclasses dessa classe.
As interfaces são particularmente úteis para atribuir funcionalidade comum a clas-
ses possivelmente não relacionadas. Isso permite que objetos de classes não relacionadas 
sejam processados de modo polimórfico – objetos de classes que implementam a mesma 
interface podem responder a todas as chamadas de métodos da interface de forma perso-
nalizada. Para demonstrar a criação e o uso de interfaces, modificamos nosso aplicativo 
de folha de pagamento para criar um aplicativo de contas a pagar geral que pode calcular 
os pagamentos devidos aos funcionários da empresa e os valores das faturas a serem 
cobrados por bens adquiridos. Como você vai ver, as interfaces possiblitam recursos 
polimórficos semelhantes aos que são possíveis com a herança.
Apêndice G Programação orientada a objetos: herança e polimorfismo 549
G.7 Polimorfismo: um exemplo
Objetos espaciais em um videogame
Suponha que projetemos um videogame que manipula objetos das classes Marciano, 
Venusiano, Plutoniano, NaveEspacial e RaioLaser. Imagine que cada classe herda da 
superclasse ObjetoEspacial, a qual contém o método desenhar. Cada subclasse im-
plementa esse método. Um gerenciador de tela mantém uma coleção (por exemplo, 
um array ObjetoEspacial) de referências para objetos das várias classes. Para atualizar 
a tela, o gerenciador envia periodicamente a cada objeto a mesma mensagem – a 
saber, desenhar. Contudo, cada objeto responde à sua própria maneira, de acordo 
com sua classe. Por exemplo, um objeto Marciano poderia desenhar-se em vermelho 
com olhos verdes e com o número apropriado de antenas. Um objeto NaveEspacial 
poderia desenhar-se como um disco voador prata luminoso. Um objeto RaioLaser 
poderia desenhar-se como um feixe vermelho brilhante na tela. Novamente, a mesma 
mensagem (neste caso, desenhar) enviada para uma variedade de objetos tem “muitas 
formas” de resultados.
Um gerenciador de tela poderia usar polimorfismo para facilitar a inclusão de 
novas classes a um sistema, com modificações mínimas no código do sistema. Suponha 
que queiramos adicionar objetos Mercuriano ao nosso videogame. Para isso, construi-
ríamos uma classe Mercuriano que estenderia ObjetoEspacial e forneceria sua própria 
implementação do método desenhar. Quando objetos Mercuriano aparecem na coleção 
ObjetoEspacial, o código do gerenciador de tela chama o método desenhar, exatamente 
como faz para qualquer outro objeto da coleção, independentemente de seu tipo. Assim, os 
novos objetos Mercuriano simplesmente “se conectam”, semqualquer modificação no 
código do gerenciador de tela por parte do programador. Portanto, sem modificar o 
sistema (a não ser pela construção de novas classes e a modificação do código que cria 
novos objetos), você pode usar polimorfismo para convenientemente incluir tipos adi-
cionais que não estavam previstos quando o sistema foi criado.
Observação sobre engenharia de software G.4
O polimorfismo permite que você lide com as generalidades e deixe o ambiente de tempo 
de execução tratar dos detalhes específicos. Você pode fazer que os objetos se comportem 
de maneiras adequadas sem conhecer seus tipos (desde que os objetos pertençam à mesma 
hierarquia de herança).
Observação sobre engenharia de software G.5
O polimorfismo promove a extensibilidade: um software que ativa comportamento 
polimórfico é independente dos tipos de objeto para os quais as mensagens são enviadas. 
Novos tipos de objeto que podem responder às chamadas de método já existentes podem 
ser incorporados a um sistema sem modificar o sistema básico. Somente o código cliente 
que instancia novos objetos precisa ser modificado para acomodar os novos tipos.
G.8 Demonstração de comportamento polimórfico
A seção G.4 criou uma hierarquia de classes na qual a classe BasePlusCommissionEmployee 
herdava de CommissionEmployee. Os exemplos daquela seção manipulavam objetos 
CommissionEmployee e BasePlusCommissionEmployee usando referências a eles para cha-
550 Android: Como Programar
mar seus métodos – apontamos variáveis de superclasse para objetos de superclasse e 
variáveis de subclasse para objetos de subclasse. Essas atribuições são naturais e simples 
– as variáveis de superclasse são destinadas a fazer referência a objetos de superclasse, e as 
variáveis de subclasse são destinadas a fazer referência a objetos de subclasse. Contudo, 
conforme você vai ver em breve, outras atribuições são possíveis.
No próximo exemplo, apontamos uma referência de superclasse para um objeto de 
subclasse. Então, mostramos como o fato de chamar um método em um objeto de sub-
classe por meio de uma referência de superclasse ativa a funcionalidade da subclasse – o 
tipo do objeto referenciado, não o tipo da variável, determina qual método é chamado. 
Esse exemplo demonstra que um objeto de uma subclasse pode ser tratado como um obje-
to de sua superclasse, permitindo várias manipulações interessantes. Um programa pode 
criar um array de variáveis de superclasse que se referem a objetos de muitos tipos de sub-
classe. Isso é permitido porque cada objeto de subclasse é um objeto de sua superclasse. 
Por exemplo, podemos atribuir a referência de um objeto BasePlusCommissionEmployee 
a uma variável da superclasse CommissionEmployee, pois um BasePlusCommissionEmployee 
é um CommissionEmployee – podemos tratar um BasePlusCommissionEmployee como um 
CommissionEmployee.
Conforme você vai aprender mais adiante neste apêndice, não é permitido tratar 
um objeto de superclasse como um objeto de subclasse, pois um objeto de superclasse não é 
um objeto de qualquer uma de suas subclasses. Por exemplo, não podemos atribuir a re-
ferência de um objeto CommissionEmployee a uma variável da subclasse BasePlusCommis-
sionEmployee, pois um CommissionEmployee não é um BasePlusCommissionEmployee – um 
CommissionEmployee não tem uma variável de instância baseSalary e não tem métodos 
setBaseSalary e getBaseSalary. A relação é um se aplica apenas para cima na hierarquia, 
de uma subclasse para suas superclasses diretas e indiretas, e não vice-versa (isto é, não 
para baixo na hierarquia, de uma superclasse para suas subclasses).
O compilador Java permite a atribuição de uma referência de superclasse para uma 
variável de subclasse se convertermos explicitamente a referência de superclasse para o 
tipo da subclasse – uma técnica que discutimos na seção G.10. Por que desejaríamos 
fazer tal atribuição? Uma referência de superclasse só pode ser usada para chamar os mé-
todos declarados na superclasse – chamar métodos exclusivos da subclasse por meio de 
uma referência de superclasse resulta em erros de compilação. Se um programa precisa 
efetuar uma operação específica da subclasse em um objeto de subclasse referenciado por 
uma variável de superclasse, ele deve primeiro converter a referência de superclasse em 
uma referência de subclasse, por meio de uma técnica conhecida como downcasting. 
Isso permite que o programa chame métodos de subclasse que não estão na superclasse. 
Mostramos um exemplo de downcasting na seção G.10.
O exemplo da Fig. G.13 demonstra três maneiras de usar variáveis de superclasse 
e subclasse para armazenar referências para objetos de superclasse e subclasse. As duas 
primeiras são simples – como na seção G.4, atribuímos uma referência de superclasse 
a uma variável de superclasse e uma referência de subclasse a uma variável de subclasse. 
Então, demonstramos a relação entre subclasses e superclasses (isto é, a relação é um), 
atribuindo uma referência de subclasse a uma variável de superclasse. Esse programa 
usa as classes CommissionEmployee e BasePlusCommissionEmployee da Fig. G.10 e da Fig. 
G.11, respectivamente.
Apêndice G Programação orientada a objetos: herança e polimorfismo 551
1 // Fig. G.13: PolymorphismTest.java
2 // Atribuindo referências de superclasse e subclasse a
3 // variáveis de superclasse e subclasse.
4
5 public class PolymorphismTest
6 {
7 public static void main( String[] args )
8 {
9
10
11
12
13
14
15
16
17
18 // chama toString no objeto de superclasse usando variável de superclasse
19 System.out.printf( "%s %s:\n\n%s\n\n",
20 "Call CommissionEmployee's toString with superclass reference ",
21 "to superclass object", );
22
23 // chama toString no objeto de subclasse usando variável de subclasse
24 System.out.printf( "%s %s:\n\n%s\n\n",
25 "Call BasePlusCommissionEmployee's toString with subclass",
26 "reference to subclass object",
27 );
28
29 // chama toString no objeto de subclasse usando variável de superclasse
30
31
32 System.out.printf( "%s %s:\n\n%s\n",
33 "Call BasePlusCommissionEmployee's toString with superclass",
34 "reference to subclass object", );
35 } // fim de main
36 } // fim da classe PolymorphismTest
// atribui referência de superclasse à variável de superclasse
CommissionEmployee commissionEmployee = new CommissionEmployee(
"Sue", "Jones", "222-22-2222", 10000, .06 );
// atribui referência de subclasse à variável de subclasse
BasePlusCommissionEmployee basePlusCommissionEmployee =
new BasePlusCommissionEmployee(
"Bob", "Lewis", "333-33-3333", 5000, .04, 300 );
commissionEmployee.toString()
basePlusCommissionEmployee.toString()
CommissionEmployee commissionEmployee2 =
basePlusCommissionEmployee;
commissionEmployee2.toString()
Call CommissionEmployee's toString with superclass reference to superclass
object:
commission employee: Sue Jones
social security number: 222-22-2222
gross sales: 10000.00
commission rate: 0.06
Call BasePlusCommissionEmployee's toString with subclass reference to
subclass object:
base-salaried commission employee: Bob Lewis
social security number: 333-33-3333
gross sales: 5000.00
commission rate: 0.04
base salary: 300.00
Call BasePlusCommissionEmployee's toString with superclass reference to
subclass object:
base-salaried commission employee: Bob Lewis
social security number: 333-33-3333
gross sales: 5000.00
commission rate: 0.04
base salary: 300.00
Figura G.13 Atribuindo referências de superclasse e subclasse a variáveis de superclasse e subclasse.
552 Android: Como Programar
Na Fig. G.13, as linhas 10 e 11 criam um objeto CommissionEmployee e atri-
buem sua referência a uma variável de CommissionEmployee. As linhas 14 a 16 criam 
um objeto BasePlusCommissionEmployee e atribuem sua referência a uma variável de 
BasePlusCommissionEmployee. Essas atribuições são naturais – por exemplo, a principal fina-
lidade de uma variável de CommissionEmployee é armazenar uma referência para um objeto 
CommissionEmployee. As linhas 19 a 21 usam commissionEmployee parachamar toString ex-
plicitamente. Como commissionEmployee se refere a um objeto CommissionEmployee, é cha-
mada a versão de toString da superclasse CommissionEmployee. Do mesmo modo, as linhas 
24 a 27 usam basePlusCommissionEmployee para chamar toString explicitamente no objeto 
BasePlusCommissionEmployee. Isso chama a versão de toString da subclasse BasePlusCom-
missionEmployee. Então, as linhas 30 e 31 atribuem a referência do objeto de subclasse 
basePlusCommissionEmployee a uma variável da superclasse CommissionEmployee, a qual as 
linhas 32 a 34 usam para chamar o método toString. Quando uma variável de superclasse 
contém uma referência para um objeto de subclasse e essa referência é usada para chamar um 
método, é chamada a versão da subclasse do método. Assim, commissionEmployee2.toString() 
na linha 34 chama na verdade o método toString da classe BasePlusCommission Employee. O 
compilador Java permite esse “cruzamento” porque um objeto de uma subclasse é um ob-
jeto de sua superclasse (mas não vice-versa). Quando o compilador encontra uma chamada 
de método feita por meio de uma variável, ele determina se o método pode ser chamado 
verificando o tipo de classe da variável. Se essa classe contém a declaração de método correta 
(ou herda uma), a chamada é compilada. No momento da execução, o tipo do objeto ao 
qual a variável se refere determina o método realmente usado. Esse processo, denominado 
vinculação dinâmica, está discutido em detalhes na seção G.10.
G.9 Classes e métodos abstratos
Quando pensamos em uma classe, presumimos que os programas vão criar objetos desse 
tipo. Às vezes, é interessante declarar classes – denominadas classes abstratas – para as 
quais você nunca pretende criar objetos. Como elas são usadas apenas como superclasses 
nas hierarquias de herança, nos referimos a elas como superclasses abstratas. Essas clas-
ses não podem ser usadas para instanciar objetos, pois, como veremos em breve, as classes 
abstratas são incompletas. As subclasses devem declarar as “partes ausentes” para se torna-
rem classes “concretas”, a partir das quais você pode instanciar objetos. Caso contrário, es-
sas subclasses também serão abstratas. Demonstramos as classes abstratas na seção G.10.
Finalidade das classes abstratas
A finalidade de uma classe abstrata é fornecer uma superclasse apropriada a partir da 
qual outras classes podem herdar e, assim, compartilhar um projeto comum. Na hie-
rarquia Forma da Fig. G.3, por exemplo, as subclasses herdam a noção do que significa 
ser uma Forma – talvez atributos comuns, como localização, cor e espessuraDaBorda, e 
comportamentos como desenhar, mover, redimensionar e mudarCor. As classes que po-
dem ser usadas para instanciar objetos são denominadas classes concretas. Essas classes 
fornecem implementações de cada método que declaram (algumas das implementações 
podem ser herdadas). Por exemplo, poderíamos produzir as classes concretas Círculo, 
Quadrado e Triângulo a partir da superclasse abstrata FormaBidimensional. Do mesmo 
modo, poderíamos produzir as classes concretas Esfera, Cubo e Tetraedro a partir da 
superclasse abstrata FormaTridimensional. As superclasses abstratas são gerais demais para 
criar objetos reais – elas especificam apenas o que é comum entre as subclasses. Precisa-
mos ser mais específicos antes de podermos criar objetos. Por exemplo, se você envia a 
Apêndice G Programação orientada a objetos: herança e polimorfismo 553
mensagem desenhar para a classe abstrata FormaBidimensional, a classe sabe que formas 
bidimensionais devem ser desenhadas, mas não sabe a forma específica a desenhar; por-
tanto, não pode implementar um método desenhar real. As classes concretas fornecem 
os detalhes específicos que as tornam adequadas para instanciar objetos.
Nem todas as hierarquias contêm classes abstratas. No entanto, muitas vezes você 
vai escrever código cliente que utiliza apenas tipos de superclasse abstrata para reduzir as 
dependências do código a um intervalo de tipos de subclasse. Por exemplo, você pode 
escrever um método com um parâmetro de um tipo de superclasse abstrata. Quando 
chamado, esse método pode receber um objeto de qualquer classe concreta que estenda 
direta ou indiretamente a superclasse especificada como tipo do parâmetro.
Às vezes, as classes abstratas constituem vários níveis de uma hierarquia. Por exem-
plo, a hierarquia Forma da Fig. G.3 começa com a classe abstrata Forma. No nível seguinte 
da hierarquia estão as classes abstratas FormaBidimensional e FormaTridimensional. O 
próximo nível declara classes concretas para FormasBidimensionais (Círculo, Quadrado e 
Triângulo) e para FormasTridimensionais (Esfera, Cubo e Tetraedro).
Declarando uma classe abstrata e métodos abstratos
Você torna uma classe abstrata declarando-a com a palavra-chave abstract. Normal-
mente, uma classe abstrata contém um ou mais métodos abstratos. Um método abstra-
to é o que tem a palavra-chave abstract em sua declaração, como em
public abstract void draw(); // método abstrato
Os métodos abstratos não fornecem implementações. Uma classe que contém 
quaisquer métodos abstratos deve ser explicitamente declarada como abstract, mesmo 
que essa classe contenha alguns métodos concretos (não abstratos). Cada subclasse con-
creta de uma superclasse abstrata também deve fornecer implementações concretas de 
cada um dos métodos abstratos da superclasse. Construtores e métodos estáticos não 
podem ser declarados como abstract. Construtores não são herdados; portanto, um 
construtor abstrato nunca poderia ser implementado. Embora os métodos estáticos não 
private sejam herdados, eles não podem ser sobrescritos. Como os métodos abstratos se 
destinam a ser sobrescritos para que possam processar objetos de acordo com seus tipos, 
não faria sentido declarar um método estático como abstract.
Observação sobre engenharia de software G.6
Uma classe abstrata declara atributos e comportamentos comuns (tanto abstratos como 
concretos) das várias classes de uma hierarquia de classes. Normalmente, uma classe abs-
trata contém um ou mais métodos abstratos que as subclasses devem sobrescrever, caso de-
vam ser concretas. As variáveis de instância e os métodos concretos de uma classe abstrata 
estão sujeitos às regras normais da herança.
Usando classes abstratas para declarar variáveis
Embora não possamos instanciar objetos de superclasses abstratas, em breve você vai ver 
que podemos usar superclasses abstratas para declarar variáveis que podem armazenar re-
ferências para objetos de qualquer classe concreta derivada dessas superclasses abstratas. 
Normalmente, os programas usam tais variáveis para manipular objetos de subclasse de 
forma polimórfica. Também é possível usar nomes de superclasses abstratas para chamar 
métodos estáticos declarados nessas superclasses.
Considere outra aplicação de polimorfismo. Um programa de desenho precisa 
exibir muitas formas, incluindo tipos de novas formas que você vai adicionar ao sistema 
554 Android: Como Programar
depois de escrever o programa de desenho. Talvez esse programa precise exibir formas 
como Círculos, Triângulos, Retângulos ou outras que derivem da classe abstrata Forma. 
O programa de desenho usa variáveis de Forma para gerenciar os objetos que são exibi-
dos. Para desenhar qualquer objeto dessa hierarquia de herança, o programa de desenho 
usa uma variável da superclasse Forma contendo uma referência para o objeto de sub-
classe, a fim de chamar o método desenhar do objeto. Esse método é declarado como 
abstract na superclasse Forma; portanto, cada subclasse concreta deve implementar o 
método desenhar de uma maneira específica para essa forma – cada objeto da hierarquia 
de herança Forma sabe como se desenhar. O programa de desenho não precisa se preocupar 
com o tipo de cada objeto ou se encontrou objetos desse tipo.
Figura G.14 Diagrama de classe em UML da hierarquia Employee.
Encerra aqui o trecho do livro disponibilizado para 
esta Unidade de Aprendizagem. Na BibliotecaVirtual 
da Instituição, você encontra a obra na íntegra.
DICA DO PROFESSOR
Acompanhe no vídeo o uso prático de polimorfismo.
Conteúdo interativo disponível na plataforma de ensino!
EXERCÍCIOS
1) O polimorfismo é um dos quatro pilares da programação de orientação a objetos. 
Portanto, marque a opção que melhor descreva o conceito de polimorfismo. 
A) Quando uma classe herda membros de outra classe.
B) Quando uma classe possui métodos abstratos.
C) Quando cada classe implementa o mesmo método de diferentes maneiras.
D) Quando uma subclasse usa um método da superclasse.
E) Quando uma classe possui um ou mais métodos sem retorno.
2) Para podermos entender melhor e trabalharmos com polimorfismo, é de extrema 
importância sabermos alguns conceitos, como as "Interfaces". Portanto, marque a 
alternativa que melhor define interfaces em programação orientada a objetos.
A) São classes que possuem apenas atributos.
B) Interfaces são classes que não podem ser instanciadas.
C) Diferentemente de uma classe, um tipo de interface não fornece nenhuma implementação.
D) Interfaces possuem variáveis de instância e métodos abstratos.
E) Interfaces são classes que possuem métodos que não podem ser implementados por outras 
classes.
3) Em relação ao polimorfismo, marque a alternativa incorreta. 
A) O polimorfismo permite que programemos no geral, e não no específico.
B) Programar no específico é quando o programa determina o tipo de objeto no momento da 
execução.
C) Para trabalharmos com polimorfismo, podemos herdar métodos de uma superclasse ou 
implementarmos uma interface.
D) A técnica de polimorfismo não permite que alteremos a implementação de um método.
E) Novos tipos de objeto que podem responder às chamadas de método já existentes podem 
ser incorporados ao sistema sem alterar o sistema básico.
4) Qual a relação do polimorfismo com interfaces e superclasses? 
A) Há polimorfismo quando uma subclasse herda membros de uma superclasse.
B) Quando uma classe herda membros de uma interface, ativa um comportamento 
polimórfico.
Quando um método existente em uma interface é usado por uma classe que não altera a C) 
implementação do método, temos um comportamento de polimorfismo.
D) Quando uma classe implementa uma interface, ela se obriga a utilizar e implementar todos 
os métodos da interface, com isso, temos um comportamento polimórfico.
E) Quando uma classe implementa uma interface, não há necessidade de utilizar todos os seus 
métodos. Entretanto, para que haja um comportamento polimórfico, é necessário 
implementar os métodos utilizados de acordo com sua necessidade.
Analise o código abaixo e marque a alternativa correta. 5) 
 
A) O código 1 refere-se à criação de uma classe abstrata.
B) O código 2 está incorreto, pois o método locomover pertence à interface "InterfaceTeste". 
Quando a classe "Formiga" implementou a interface, a mesma alterou a implementação do 
método.
C) O código 3 está escrito de forma correta.
D) O código 4 está escrito de forma errada, pois, para utilizarmos uma interface, devemos 
colocar a palavra-chave implements, não extends.
E) Sendo o código 1 a interface, podemos concluir que nos códigos 2, 3 e 4, temos um 
comportamento polimórfico.
NA PRÁTICA
Polimorfismo em orientação a objetos refere-se à condição que um método tem de assumir 
várias formas, isto é, é a utilização de um método com a mesma assinatura, entretanto, 
executando ações específicas para a classe que o contém. Uma das vantagens do polimorfismo é 
menor trabalho e mais localizado. 
Um exemplo clássico é o método print no Java. É chamado em diferentes classes, mas o 
resultado impresso na tela será de acordo com a necessidade daquela classe.
 
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do 
professor:
Conceitos de computação com Java
HORSTMANN, C. Conceitos de computação com Java. 5.ed. Porto Alegre: Bookman, 2009.
Aula - Polimorfismo
Veja um pouco mais sobre polimorfismo no vídeo abaixo.
Conteúdo interativo disponível na plataforma de ensino!
Java para iniciantes: crie, compile e execute programas Java rapidamente.
Confira o livro Java para iniciantes no capítulo 7 (246) a relação de Herança e seu métodos que 
dão suporte ao polimorfismo.

Continue navegando