O documento descreve uma aula sobre polimorfismo em programação orientada a objetos. Aborda conceitos como exemplos de polimorfismo, vantagens do polimorfismo, tipos de polimorfismo como sobrecarga e sobrescrita, métodos abstratos, classes abstratas e vinculação dinâmica.
1. Universidade Presbiteriana Mackenzie
Aula
4:
Polimorfismo
Prof. Ms. Daniel Arndt Alves
Faculdade
de
Computação
e
Informá<ca
Computação e Informática
Faculdade de
Linguagem
de
Programação
II
Polimorfismo
1
Daniel
Arndt
Alves
2. Tópicos
da
Aula
• Polimorfismo
– Exemplos
de
Polimorfismo
– Vantagens
do
Polimorfismo
– Tipos
de
Polimorfismo
• Métodos
Abstratos
• Classes
Abstratas
• Vinculação
Dinâmica
Polimorfismo
2
Daniel
Arndt
Alves
3. Tópicos
da
Aula
• Hierarquia
Empregado
– Classe
Empregado
– Classe
EmpregadoHorista
– Classe
EmpregadoPorComissao
– Classe
EmpregadoFixoMaisComissao
• Processamento
Polimórfico
– Operador
instanceof
– A
Classe
Class
Polimorfismo
3
Daniel
Arndt
Alves
4. Tópicos
da
Aula
• Exemplo
de
Polimorfismo
• CasHng
– Cast
– Upcast
– Downcast
• Métodos
Final
• Classes
Final
Polimorfismo
4
Daniel
Arndt
Alves
5. Polimorfismo
• Permite
que
um
método
produza
resultados
diferentes,
dependendo
do
objeto
ao
qual
é
aplicado.
• A
mesma
invocação
pode
produzir
“muitas
formas”
de
resultados.
Daniel
Arndt
Alves
Polimorfismo
5
6. Polimorfismo
• Um
nome
para
várias
formas,
ou
ainda,
um
nome
e
várias
implementações
(vários
métodos
com
o
mesmo
nome).
• Capacidade
de
uma
referência
de
variável
mudar
seu
comportamento
de
acordo
com
o
objeto
a
que
ela
está
conectada.
– Isto
permite
que
objetos
diferentes,
de
subclasses
disHntas,
sejam
vistos
como
objetos
de
uma
mesma
superclasse
–
o
método
apropriado
a
ser
executado
será
escolhido
automaHcamente,
baseado
na
subclasse
que
o
objeto
pertence
Daniel
Arndt
Alves
Polimorfismo
6
7. Exemplos
de
Polimorfismo
• Sobrecarga
de
um
método
– Mesmo
nome,
parâmetros
diferentes
• setData(int dia, int mes, int ano);
• setData(int dia, int mes, int ano, int hora,
int minuto, int segundo);
Daniel
Arndt
Alves
Polimorfismo
7
8. Exemplos
de
Polimorfismo
• Sobrescrita
de
um
método
– Uma
subclasse
redefine
um
comportamento
de
sua
superclasse
• umaPessoa.toString();
• umEmpregado.toString();
• umGerente.toString();
Daniel
Arndt
Alves
Polimorfismo
8
9. Exemplos
de
Polimorfismo
• Vinculação
dinâmica
(ou
tardia)
– Dynamic
Binding,
Late
Binding
– O
método
a
ser
chamado
só
pode
ser
determinado
em
tempo
de
execução
Daniel
Arndt
Alves
Polimorfismo
9
10. Vantagens
do
Polimorfismo
• Simplicidade
– Quando
necessário
escrever
um
código
que
manipula
uma
família
de
Hpos,
o
código
pode
ignorar
detalhes
específicos
de
cada
Hpo
– Mesmo
que
o
código
aparente
estar
manipulando
um
objeto
do
Hpo
da
classe-‐mãe,
o
objeto
na
verdade
pode
ser
do
Hpo
da
classe-‐mãe,
mas
também
do
Hpo
das
classes-‐filhas
– Isso
torna
o
código
mais
fácil
de
se
escrever
e
de
se
entender
Daniel
Arndt
Alves
Polimorfismo
10
11. Vantagens
do
Polimorfismo
• Escalabilidade
– Num
momento
futuro,
outras
classes
poderão
ser
adicionadas
à
família
de
Hpos,
sendo
que
os
seus
objetos
executarão
seu
código
específico.
Daniel
Arndt
Alves
Polimorfismo
11
12. Tipos
de
Polimorfismo
• Sobrecarga
(overloading)
– Ocorre
na
mesma
classe
ou
entre
classe-‐mãe
e
classe-‐filha
– Os
métodos
diferem
pela
assinatura
(ordem
e
número
de
parâmetros)
– A
escolha
do
método
ocorre
em
tempo
de
compilação
Daniel
Arndt
Alves
Polimorfismo
12
13. Tipos
de
Polimorfismo
• Sobreposição
(overriding):
– Métodos
na
classe-‐filha
que
redefinem
ou
sobrepõem
o
comportamento
do
mesmo
método
da
classe-‐mãe
– Apresenta
mesma
lista
de
parâmetros!
– Existe
também
a
sobreposição
(ou
implementação)
de
métodos
concretos
(classe-‐filha)
em
métodos
abstratos
(classe-‐mãe
ou
interface)
– A
escolha
do
método
é
feita
em
tempo
de
execução
Daniel
Arndt
Alves
Polimorfismo
13
14. Métodos
Abstrados
• Métodos
declarados
sem
implementação
– abstract void moveTo(double X, double Y);
Daniel
Arndt
Alves
Polimorfismo
14
15. Classes
Abstratas
• São
classes
em
que
um
ou
mais
dos
métodos
são
abstratos:
Daniel
Arndt
Alves
Polimorfismo
15
public abstract class Animal {
private String nome;
public Animal (String nome){
this.nome = nome;
}
public String getNome(){
return(nome);
}
public abstract void emitirSom();
}
16. Classes
Abstratas
• Uma
classe
abstrata
declara
atributos
e
comportamentos
comuns
das
várias
classes
em
uma
hierarquia
de
classes.
Daniel
Arndt
Alves
Polimorfismo
16
17. Classes
Abstratas
• As
subclasses
devem
sobrescrever
os
métodos
abstratos
para
se
tornarem
concretas.
• As
classes
abstratas
não
podem
ser
instanciadas.
Daniel
Arndt
Alves
Polimorfismo
17
18. Classes
Abstratas
public class Vaca extends Animal {
public Vaca(String nome) {
super(nome);
}
public void emitirSom() {
System.out.println("MUUUUUUU");
}
}
Daniel
Arndt
Alves
Polimorfismo
18
19. Classes
Abstatas
public class Cachorro extends Animal {
public Cachorro(String nome) {
super(nome);
}
public void emitirSom() {
System.out.println("AUAU");
}
public void rosnar() {
System.out.println("GRRRRRR");
}
}
Daniel
Arndt
Alves
Polimorfismo
19
20. Vinculação
Dinâmica
public class AnimalTest {
public static void main(String args[]) {
Animal ref;
Vaca umaVaca = new Vaca("Mimosa");
Cachorro umCachorro = new Cachorro("Rex");
// Referencia cada um como animal
ref = umaVaca;
ref.emitirSom(); // Polimorfismo: Dynamic Binding
ref = umCachorro;
ref.emitirSom(); // Polimorfismo: Dynamic Binding
}
}
Daniel
Arndt
Alves
Polimorfismo
20
21. Vinculação
Dinâmica
• O
compilador
não
sabe
qual
método
deve
ser
chamado.
• Isto
é
determinado
apenas
durante
a
execução
do
programa.
Animal []meusBichos = new Animal[20];
...
for(int i=0; i<20; i++){
meusBichos[i].emitirSom();
}
...
Daniel
Arndt
Alves
Polimorfismo
21
22. Vinculação
Dinâmica
List <Animal> meusBichinhos = new LinkedList
<Animal>();
...
meusBichinhos.add(umCachorro);
meusBichinhos.add(umGato);
meusBichinhos.add(umaVaca);
...
for(Animal bicho: meusBichinhos)
bicho.emitirSom();
Daniel
Arndt
Alves
Polimorfismo
22
24. Classe
Empregado
• Superclasse
abstract Empregado
– Método
ganhos
é
declarado
abstract
• Nenhuma
implementacão
pode
ser
dada
à
função
ganhos
na
classe
abstract Empregado
Daniel
Arndt
Alves
Polimorfismo
24
25. Classe
Empregado
public abstract class Empregado {
private String primeiroNome;
private String ultimoNome;
private String rg;
public Empregado(String primeiro, String ultimo, String ident) {
primeiroNome = primeiro;
ultimoNome = ultimo;
rg = ident;
}
}
Daniel
Arndt
Alves
Polimorfismo
25
26. Classe
Empregado
public String getPrimeiroNome() {
return primeiroNome;
}
public String getUltimoNome() {
return ultimoNome;
}
public String getRG() {
return rg;
}
Daniel
Arndt
Alves
Polimorfismo
26
27. Classe
Empregado
public void setPrimeiroNome(String primeiro) {
primeiroNome = primeiro;
}
public void setUltimoNome(String ultimo) {
ultimoNome = ultimo;
}
public void setRG(String ident) {
rg = ident;
}
public String toString() {
return String.format("%s %snRG: %s",
getPrimeiroNome(), getUltimoNome(), getRG());
}
Daniel
Arndt
Alves
Polimorfismo
27
28. Classe
Empregado
/*
* Método abstrato a ser
* sobrescrito pelas subclasses
*/
public abstract double ganhos();
Daniel
Arndt
Alves
Polimorfismo
28
29. Classe
EmpregadoHorista
public class EmpregadoHorista extends Empregado {
private double valorHora;
private double horas;
public EmpregadoHorista(String primeiro,
String ultimo, String ident, double valor, double horas) {
super(primeiro, ultimo, ident);
setValorHora(valor);
setHoras(horas);
}
}
Daniel
Arndt
Alves
Polimorfismo
29
30. Classe
EmpregadoHorista
public void setValorHora(double valor){
valorHora = valor;
}
public void setHoras(double horasTrabalhadas){
horas = horasTrabalhadas;
}
public double getHoras(){
return horas;
}
public double getValorHora(){
return valorHora;
}
Daniel
Arndt
Alves
Polimorfismo
30
31. Classe
EmpregadoHorista
// Implementando o método ganhos
public double ganhos() {
if (getHoras() <= 40) {
return getValorHora() * getHoras();
} else {
return (getHoras() - 40) * getValorHora() * 1.5;
}
}
Daniel
Arndt
Alves
Polimorfismo
31
32. Classe
EmpregadoAssalariado
public class EmpregadoAssalariado extends Empregado {
private double salarioSemanal;
public EmpregadoAssalariado(String primeiro, String ultimo,
String ident, double salario) {
super(primeiro, ultimo, ident);
setSalarioSemanal(salario);
}
public double ganhos() {
return getSalarioSemanal();
}
Daniel
Arndt
Alves
Polimorfismo
32
33. Classe
EmpregadoAssalariado
public void setSalarioSemanal(double salario) {
salarioSemanal = salario;
}
public double getSalarioSemanal() {
return salarioSemanal;
}
Daniel
Arndt
Alves
Polimorfismo
33
34. Classe
EmpregadoPorComissao
public class EmpregadoPorComissao extends Empregado{
private double vendasBrutas;
private double taxaComissao;
public EmpregadoPorComissao(String primeiro, String ultimo, String ident,
double vendas, double comissao){
super(primeiro, ultimo, ident);
setVendasBrutas(vendas);
setTaxaComissao(comissao);
}
public double ganhos(){
return getTaxaComissao() * getVendasBrutas();
}
}
Daniel
Arndt
Alves
Polimorfismo
34
35. Classe
EmpregadoPorComissao
public void setVendasBrutas(double vendas){
vendasBrutas = vendas;
}
public void setTaxaComissao(double comissao){
taxaComissao = comissao;
}
public double getTaxaComissao(){
return taxaComissao;
}
public double getVendasBrutas(){
return vendasBrutas;
}
Daniel
Arndt
Alves
Polimorfismo
35
36. Classe
EmpregadoFixoMaisComissao
public class EmpregadoFixoMaisComissao extends
EmpregadoPorComissao {
private double salarioBase;
public EmpregadoFixoMaisComissao(String primeiro, String ultimo,
String ident, double vendas, double comissao, double salario) {
super(primeiro, ultimo, ident, vendas, comissao);
setSalarioBase(salario);
}
public double ganhos() {
return getSalarioBase() + super.ganhos();
}
}
Daniel
Arndt
Alves
Polimorfismo
36
37. Classe
EmpregadoFixoMaisComissao
public void setSalarioBase(double salario) {
salarioBase = salario;
}
public double getSalarioBase() {
return salarioBase;
}
Daniel
Arndt
Alves
Polimorfismo
37
38. Processamento
Polimórfico
• Vinculação
Dinâmica
– Também
conhecida
como
Vinculação
Tardia
– Chamadas
aos
métodos
sobrescritos,
são
resolvidas
em
tempo
de
execução,
com
base
no
Hpo
de
objeto
referenciado
Daniel
Arndt
Alves
Polimorfismo
38
40. A
Classe
Class
• Método
getClass()
– Herdado
de
Object
– Retorna
um
objeto
do
Hpo
Class
Daniel
Arndt
Alves
Polimorfismo
40
41. A
Classe
Class
• Método
getName()
– Retorna
o
nome
da
classe:
public static void main(String args[]) {
Object anObject = new Object();
Class aClass;
String aString, anotherString;
aClass = anObject.getClass();
aString = aClass.getName();
anotherString = anObject.getClass().getName();
}
Daniel
Arndt
Alves
Polimorfismo
41
42. A
Classe
Class
import java.util.ArrayList;
import java.util.Vector;
public class VectorClass {
public static void main(String args[]) {
Object testObject = new Vector();
if (testObject instanceof Vector) {
System.out.println("Instance of the class java.util.Vector");
}
else if (testObject instanceof ArrayList) {
System.out.println("Instance of the class java.util.ArrayList");
}
else {
System.out.println("Instance of the classs " + testObject.getClass());
}
}
}
Daniel
Arndt
Alves
Polimorfismo
42
43. Exemplo
de
Polimorfismo
public static void main(String args[]) {
Empregado empregados[] = new Empregado[4];
EmpregadoAssalariado empregadoAssalariado =
new EmpregadoAssalariado("João", "Silva", "1837-1", 1500);
empregados[0] = empregadoAssalariado;
EmpregadoHorista empregadoHorista =
new EmpregadoHorista("Maria", "Santos", "4857-3", 0, 40);
empregados[1]= empregadoHorista;
EmpregadoPorComissao empregadoComissionista =
new EmpregadoPorComissao("Joana", "Fernandes", "5773-8",
50, 40);
empregados[2] = empregadoComissionista;
EmpregadoFixoMaisComissao empregadoComissao =
new EmpregadoFixoMaisComissao("Roberto", "Antunes",
"4857-3", 50, 40, 300);
empregados[3] = empregadoComissao;
Daniel
Arndt
Alves
Polimorfismo
43
44. Exemplo
de
Polimorfismo
• Vinculação
Tardia
–
Late
Binding
for(Empregado empregadoAtual:empregados){
// chama a função toString()
System.out.println(empregadoAtual);
// mostra os ganhos
System.out.printf("ganhou $%,.2fnn",
empregadoAtual.ganhos());
}
Daniel
Arndt
Alves
Polimorfismo
44
45. CasHng
• Cast:
converter
de
um
Hpo
de
dados
para
outro
int i = 20;
double x = 2.5;
x = (double) i;
Daniel
Arndt
Alves
Polimorfismo
45
46. Conversão
de
Tipos
Tipo
Tamanho
(bits)
Valores
char
16
'u0000'
a
'uFFFF'
byte
8
-‐128
a
127
int
32
-‐2.147.483.648
a
-‐2.147.483.647
short
16
-‐32.768
a
+32.767
long
64
-‐9.223.372.036.854.775.808
a
+9.223.372.036.854.775.807
float
32
-‐3,40292347E+38
a
+3,40292347E+38
double
64
-‐1,79769313486231570E+308
a
+1,79769313486231570E+308
boolean
8
true
ou
false
Daniel
Arndt
Alves
Polimorfismo
46
47. Conversão
de
Tipos
Supondo
a
variável
x
Converter
em
A
variável
y
recebe
o
valor
conver<do
int x = 30
float
float y = (float) x
int x = 30
double
double y = (double) x
float x = 20.5
int
int y = (int) x
String x = "20"
int
int y = Integer.parseInt(x)
String x = "40.84"
float
float y = Float.parseFloat(x)
String x = "40.84"
double
double y = Double.parseDouble(x)
String x = "Java"
Vetor
de
bytes
byte y[] = x.getBytes()
int x = 30
String
String y = String.valueOf(x)
float x = 20.5
String
String y = String.valueOf(x)
double x = 452.43
String
String y = String.valueOf(x)
byte x[]
String
String y = new String(x)
Daniel
Arndt
Alves
Polimorfismo
47
48. CasHng
• Upcast:
converter
sem
perda
de
informação
int i = 20;
double x = 2.5;
x = (double) i;
Daniel
Arndt
Alves
Polimorfismo
48
49. CasHng
• Downcast:
converer
com
perda
de
informação
int i = 20;
double x = 2.5;
i = (int) x;
• Java
warning:
Possible
loss
of
precision
Daniel
Arndt
Alves
Polimorfismo
49
50. CasHng
• Cast:
conversão
dentro
de
uma
hierarquia
de
classes
Daniel
Arndt
Alves
Polimorfismo
50
51. CasHng
• Upcast:
subir
na
hierarquia
– EmpregadoPorComissao -> Empregado
– EmpregadoFixoMaisComissao ->
EmpregadoPorComissao
• Downcast:
descer
na
hierarquia
– EmpregadoPorComissao ->
EmpregadoFixoMaisComissao
Daniel
Arndt
Alves
Polimorfismo
51
53. CasHng
• Superclasse
<-‐
Subclasse
– Upcast
ocorre
implicitamente
Animal umAnimal = new Animal("Bixo");
Cachorro umCachorro = new Cachorro("Rambo");
umAnimal = umCachorro;
umAnimal.rosnar();
– Referenciar
membros
exclusivos
de
subclasses
a
parHr
da
superclasse
gera
um
erro
de
compilação.
Daniel
Arndt
Alves
Polimorfismo
53
54. CasHng
• Subclasse
<-‐
Superclasse
– Erro
de
compilação
umCachorro
=
umAnimal;
– O
downcasHng
explicito
pode
evitar
este
erro
umCachorro
=
(Cachorro)umAnimal;
– Porém,
gera
uma
ClassCastException
(em
tempo
de
execução)
Daniel
Arndt
Alves
Polimorfismo
54
55. CasHng
• Antes
de
realizar
esta
coerção,
uHlizar
o
operador
instanceof,
para
assegurar
que
o
objeto
é
de
fato
um
objeto
de
um
Hpo
de
subclasse
apropriado.
if(umAnimal instanceof Cachorro)
umCachorro = (Cachorro)umAnimal;
Daniel
Arndt
Alves
Polimorfismo
55
56. Métodos
final
• Não
podem
ser
sobrescritos
em
uma
subclasse
• Métodos
private
e
static
são
implicitamente
final
• Métodos
final
são
resolvidos
em
tempo
de
compilação,
isto
é
conhecido
como
vinculação
estáHca.
Daniel
Arndt
Alves
Polimorfismo
56
57. Classes
final
• Não
podem
ser
estendidas
por
uma
subclasse
• Todos
os
métodos
em
uma
classe
final
são
implicitamente
final
Daniel
Arndt
Alves
Polimorfismo
57