Você está na página 1de 10

PARTE II: Java e OO Polimorfismo

Um único controle remoto pode ser utilizado


para controlar várias televisões desde que
respeitem a interface de comunicação para a
Polimorfismo  Polimorfismo: qual o controle foi projetada
muitas formas de
Interface implementação de
Herança uma operação
Herança e polimorfismo
 Permite esconder
Classes e métodos abstratos diferentes
implementações
atrás da mesma
interface

40 41

Polimorfismo Polimorfismo

Exercício rápido instrumentoFinanceiro.getSaldo()

Encontre um exemplo da vida real onde


polimorfismo é utilizado

Ação Conta Fundo de


corrente Aplicação

42 43

Polimorfismo Polimorfismo

Implementação OO Exercício rápido


classe qqer {
public float calcularSaldo( ) {
InstrumentoFinanceiro f[ ] = {new Acao(), Como seria a implementação da
new ContaCorrente(),
new FundoAplicacao()}; transparência anterior sem OO?
float saldo = 0;
for (int i=0; i < f.length(); f++)
saldo += f[i].getSaldo(); Solução >>>>
return saldo;
}
}
44 45

1
Polimorfismo Polimorfismo

Solução em pseudo-código Como utilizar polimorfismo?


Interfaces
if instrumentoFinanceiro = ação
calcularSaldoDasAcoes() Herança (hierarquias)

if instrumentoFinanceiro = ContaCorrente
calcularSaldoContaCorrente()

if instrumentoFinanceiro = FundoAplicacao
calcularSaldoFundoAplic()

46 47

PARTE II: Java e OO Interface


 Interfaces não fornecem comportamento default
Polimorfismo  Interfaces permitem implementar comportamentos
polimórficos
Interface
 Plug-and-play: mudar implementação sem afetar cliente
Herança
Herança e polimorfismo
Classes e métodos abstratos

realização

48 Cubo, pirâmide e outras formas podem ser desenhados, deslocados, etc. Embora apresentem o mesmo 49
comportamento, a implementação pode ser totalmente diferente

Interface: notação UML Classes de interface

São classes abstratas puras


Notação
pirulito

Métodos são implicitamente públicos,


abstratos e não-estáticos

Notação
Atributos são implicitamente públicos,
canônica static e final (constantes)
*se uma classe tem métodos abstratos, deve ser declarada como abstrata
*método abstrato é um método sem implementação
50
*modificador abstract não é usado com métodos de interface (implícito) 51

2
Classe de Interface Classe de interface

Exercício em sala

Encontre classes de interface na API de


JAVA

Solução >>>>

52 53

Classes de Interface: representação UML Classes de Interface: exemplo


<<interface>>
<<interface>>
LimitesTabuleiro
Classe
+atributos: tipo = valor inicial ~larguraTabuleiro: int=500
~alturaTabuleiro: int=500
+operação(arg:tipo):retorno ~totalLinhas: int=10
~totalColunas: int=10 <<interface>>
~alturaCelula:int= alturaPixels/totalLinhas
~larguraCelula:int=larguraPixels/totalColunas
RatoDeTabuleiro

+getAparencia():String
A
+getPosicaoAtual():Point
+andar():Point

Classe
<<interface>>
Classe A implementa a classe de interface
54 55

Interface: exemplo Implementação de interface


1. public interface LimitesTabuleiro { 1.public class RatoDeCanto implements RatoDeTabuleiro, LimitesTabuleiro {
2. private Point posAtual;
2. int larguraPixels = 500; // largura do tabuleiro em pixels 3. private String aparenciaRato=“¨o¨”;
3. int alturaPixels = 500; // altura do tabuleiro em pixels 4.
4. int totalLinhas = 10; // numero de linhas do tabuleiro 5. public RatoDeCanto (int x, int y, String aparencia) {
6. posAtual = new Point(x, y);
5. int totalColunas = 10; // numero de colunas do tabuleiro
7. aparenciaRato = aparencia;
6. int alturaCelula = alturaPixels/totalLinhas; 8. }
7. int larguraCelula = larguraPixels/totalColunas; 9. public String getAparencia() {return aparenciaRato;}
10. public Point getPosicaoAtual() {return posAtual;}
8. }
11. public Point andar() {
12. if (posAtual.y == 1 && posAtual.x < totalColunas)
13. posAtual.x++;
14. else
1. public interface RatoDeTabuleiro { 15. if (posAtual.x == totalColunas && posAtual.y < totalLinhas)
16. posAtual.y++;
2. public String getAparencia();
17. else
3. public Point getPosicaoAtual(); 18. if (posAtual.y == totalLinhas && posAtual.x > 1)
4. public Point andar(); 19. posAtual.x--;
5. } 20. else
21. if (posAtual.x == 1 && posAtual.y > 1)
22. posAtual.y--;
23.
24. return posAtual;
25. }
26.}
56 57

3
Realização de interface: representação Realização de interface: representação
UML UML
<<interface>>
LimitesTabuleiro
~larguraTabuleiro: int=500 <<interface>>
~alturaTabuleiro: int=500 RatoDeTabuleiro
~totalLinhas: int=10
RatoDeLabirinto RatoDeCanto ~totalColunas: int=10
~alturaCelula:int= alturaPixels/totalLinhas
~larguraCelula:int=larguraPixels/totalColunas +getAparencia():String
+getPosicaoAtual():Point
+andar():Point
LimitesTabuleiro

RatoDeCanto

ou >>>>
58 59

Classe de Interface PARTE II: Java e OO

Exercício em sala Polimorfismo


 apostila revisão OO exercício 02 Interface
 enunciado completo na apostila
Herança
Criar um novo rato nos moldes do Herança e polimorfismo
RatoDeCanto mas que ande de modo Classes e métodos abstratos
diferente. (JExercRatosInterface)

Solução >>>> (JExercRatosInterfaceSol)


61
60

Herança Herança

Classes de objetos podem ter em Triângulo eqüilátero e quadrado


comum
parte do comportamento => métodos
O que estes objetos têm em comum?
parte da descrição do estado => atributos
São polígonos regulares

É possível aproveitar estas similaridades? O que estes objetos têm de diferente?


Para quê? Número de lados

62 63

4
Herança Herança

Aprofundando...  Todas as figuras têm os atributos:


Número de lados: numLados
Que operações podemos efetuar sobre estes
Tamanho do lado: tamLado
polígonos?
Calcular perímetro
Calcular área
 e o método em comum
Calcular perímetro:
 numLados x tamLado
São válidas para todos ou se distinguem em
algum ponto? Diferem no método Calcular área
 Triângulo equilátero: (tamLado x sqrt(3)) / 2
 Quadrado: pow(tamLado, 2)

64 65

Herança: classe base x derivada Herança: representação em UML


<<estereótipo>>
ClasseBase
Classe base
Atributos comuns
Reúne as características de estado e
comportamento comuns Métodos comuns

Classe derivada
Contém as especificidades <<estereótipo>>
atributos e comportamentos que as tornam ClasseDerivada
diferentes da base e das irmãs Atributos específicos
Métodos específicos
66 67

Herança:
Exercício
representação UML do exemplo
Exercícios da apostila: 3 e 4

Desenhar diagramas de classe para


Método
abstrato
+calcularArea():float
Exerc. 3. Tabuleiro de robôs
Exerc. 4. Locadora de veículos – contrato de
locação segundo o tipo de veículo

68 69

5
PARTE II: Java e OO Herança e polimorfismo

Polimorfismo Tipos de polimorfismo


Interface sobrecarga
Herança sobreposição

Herança e polimorfismo
Classes e métodos abstratos

70
71

Exemplo de polimorfismo por


Polimorfismo por sobrecarga
sobrecarga

1. public class Aluno {


Mudança dos parâmetros e, 2. int numMatricula;
3. int CPF;
adicionalmente, do tipo de retorno do 4.
5. public Aluno (int nMatr) {
método 6. numMatricula = nMatr;
7. }
8.
9. public Aluno (int nMatr, int CPF){
Mesma classe ou 10. numMatricula = nMatr;
11. this.CPF = CPF;
de classe base para classe derivada 12. }
13. }

72 73

Exemplo de polimorfismo de sobrecarga Exercício polimorfismo sobrecarga

public class Somador{


public double somar(double v1, double v2) {
Classe String – fonte http://java.sun.com/j2se/1.5.0/docs/api/ return v1 + v2;
}
public int somar(int v1, int v2) {
return v1 + v2;
}

public static void main(String args[]) {


Somador s = new Somador();
System.out.println(s.somar(2.05, 2.30));
System.out.println(s.somar(2, 2));
}
}

Quais os valores impressos por este programa?

74 75

6
Exercício rápido Exercício: solução
class JAoQuadradoDouble extends JAoQuadrado {
public double elevarQuadrado(double a) {
System.out.println("metodo elevarQuadrado de JAoQuadradoDouble ");
return (double)a*a;
} Ao encontrar 10, o compilador assume float
}

class JAoQuadrado { metodo elevarQuadrado de JAoQuadrado


public float elevarQuadrado(float a) {
System.out.println("metodo elevarQuadrado de JAoQuadrado ");
100.0
return a*a; metodo elevarQuadrado de JAoQuadradoDouble
}
O que este programa imprime 100.0
} metodo elevarQuadrado de JAoQuadrado
na tela?
public class Main {
public static void main(String args[]) {
JAoQuadradoDouble j = new JAoQuadradoDouble(); Ao encontrar 10.0, o compilador assume double
System.out.println(j.elevarQuadrado(10));
System.out.println(j.elevarQuadrado(10.0));
double d = j.elevarQuadrado(10);
}
}

76 77

Polimorfismo por sobreposição Exemplo de polimorfismo de sobreposição

1. public class IPVA {


Ou reescrita 2. protected static final vlrBase = 1.50;
IPVA

3. protected int qtdCavalos;


4.
5. public float calcularIPVA () {
6. return vlrBase * qtdCavalos;
7. }
Preserva a assinatura 8. }

Muda a implementação
1. public class IPVACaminhao extends IPVA {
2. private int qtdEixos;
3. public float calcularIPVA() {
4. return vlrBase * qtdCavalos * qtdEixos;
5. }
De classe base para classe derivada 6. }

Este método sobrepõe o de cima

78 79

Exercício rápido Exercício rápido: solução


class ClienteEspecial extends Cliente {
protected double desconto = 0.2;
ClienteEspecial(double desconto) {
desconto = desc;
} Cliente
public double calcularDesconto(double valor) {
#desconto:double =0.1
return valor * desconto;
} +calcularDesconto(v:double):double
} Encontre um polimorfismo de sobreposição e
desenhe o diagrama de classes em UML
public class Cliente {
protected double desconto=0.1; // 10%
public double calcularDesconto(double valor) {
if (valor > 500) return valor * desconto; ClienteEspecial
else return 0.0; #desconto:double =0.2
}
+calcularDesconto(v:double):double
public static void main(String args[]) {
Cliente cli[] = {new Cliente(), new ClienteEspecial(0.15)};

for (int i=0; i < 2; i++)


println(cli[i].calcularDesconto(100)); Vinculação
}
}
dinâmica
Dynamic binding
80 81

7
Exercício rápido: solução Exercício
class ClienteEspecial extends Cliente {
protected double desconto = 0.2;
ClienteEspecial(double desconto) {
desconto = desc;
Fazer número 5 da apostila
}
public double calcularDesconto(double valor) { IPVA (construção do diagrama de classes e
return valor * desconto; Sobrepõe o método
} indicar tipo de polimorfismo)
} de mesmo nome
da classe base
public class Cliente {
protected double desconto=0.1; // 10%
public double calcularDesconto(double valor) {
if (valor > 500) return valor * desconto;
else return 0.0;
}

public static void main(String args[]) {


Cliente cli[] = {new Cliente(), new ClienteEspecial(0.15)};

for (int i=0; i < 2; i++)


println(cli[i].calcularDesconto(100));
}
}
82 83

Herança: super e this Herança: this e sombreamento

super
1 public class Fatorial {
Referência a métodos e atributos da 2 private int num = 0; // último número calculado
3 private int res = 1; // último resultado obtido
superclasse 4
5 public int calcular(int n) {
super.<método>(<lista argumentos>) 6 if (n == num) return res;
7 else {
8 int res = 1;
9 for (int i=n; i>0; i--)
this 10
11
res = i * res;

12 // guarda resultado
Referência a métodos e atributos do objeto 13 this.res = res;
corrente 14
15
num = n;
return res;
16 }
17 }
18 }
84 85

Exemplo super, this e sombreamento Exercício


class ClienteEspecial extends Cliente {
protected double desconto = 0.2;
ClienteEspecial(double desconto) {
println (this.desconto + " " + super.desconto + " " + desconto);
Fazer o exercício 6 da apostila
This e super no exemplo do Totó
this.desconto = desconto;
}
public double calcularDesconto(double valor) {
return valor * desconto;
}
} O que o programa
imprime na linha
public class Cliente { azul???
protected double desconto=0.1; // 10%
public double calcularDesconto(double valor) {
if (valor > 500) return valor * desconto;
else return 0.0;
}

public static void main(String args[]) {


Cliente cli[] = {new Cliente(), new ClienteEspecial(0.15)};

for (int i=0; i < 2; i++)


println(cli[i].calcularDesconto(100));
}
} 86 87

8
Herança e construtores Herança: Ordem de chamada das construtoras

A
Métodos construtores não são herdados
pelas classes derivadas,  Ao instanciar um objeto +A( )
de C:
 C( )
mas o construtor default de uma classe  super( )
B

base é chamado implicitamente antes da • B( )


+B( )
 super( )
primeira linha do construtor da classe  A( )
derivada.  executa restante de B( )
 executa restante de C( ) C

+C( )

88 89

Exemplo Exercício
class C extends B {
int c; super();
C() {c = 3;} c = 3; Fazer o exercício 7 da apostila
}
Ordem da chamada das construtoras
class B extends A {
int b;
B() {b = 2;}
O que este programa imprime?
}

class A {
int a;
A() {a = 1;}
}

public class Main {


public static void main(String args[]) {
C c = new C();
System.out.println(c.a + " " + c.b + " " + c.c);

}
90 91
} JRevisaoOO\JExemConstrutoraChamadaImplicita

PARTE III: Java e OO Classes e métodos abstratos

Polimorfismo Uma classe abstrata


Interface não pode ser instanciada
Herança Pode ter declarações de métodos
Pode ter métodos com corpo
Herança e Polimorfismo
Pode ter métodos abstratos ou não
Classes e métodos abstratos Pode ter atributos de instância ou de classe

92 93

9
Exemplo classe abstrata Métodos abstratos
class Carro extends Veiculo {
public int numeroPassageiros = 5;
public double calcularIPVA() {
if (cavalos <= 100) Não podem ter corpo
return (cavalos * 1.5);
else Devem ser implementados pelas classes
return super.calcularIPVA();
} derivadas concretas (instanciáveis)
public double calcularSeguroObrigatorio() {
return numeroPassageiros * 100;
}
}
Não podem ser abstratos:
public abstract class Veiculo {
public String placa="AAA0000"; Métodos construtores (não são herdados)
public int cavalos;
public double calcularIPVA() { Métodos estáticos (são finais)
return cavalos * 2.0;
}
public abstract double calcularSeguroObrigatorio();

}
94
JRevisaoOO\JExemClasseAbstrata 95

Exemplo classe e método abstratos Classes abstratas x interface


1. public abstract class IPVA { ABSTRATA INTERFACE
2. protected static final
float vlrBase = 1.50;  Atributos variados  Atributos public, static e final
3. protected int qtdCavalos;  Métodos abstratos  Métodos abstratos
4. public abstract float calcularIPVA();
5. }  Métodos não abstratos 
 Métodos estáticos 
1. public class IPVACaminhao extends IPVA  Métodos não estáticos  Métodos não estáticos
{  Uma classe estende  Uma classe IMPLEMENTA
2. private int qtdEixos;
3. public float calcularIPVA() { apenas UMA classe várias classes de interface
4. return vlrBase * qtdCavalos * abstrata
qtdEixos;  extends  implements
5. }
6. }
96 97

Exercício Exercício
Baixe o código do programa Rato Exerc. 8 da apostila: classe abstrata,
de Tabuleiro. herança e polimorfismo
 ~tacla/RepositorioJava/JExercRatosInterface.zip
Destinatário Assinatura
Como você utilizaria classes Amigo []s
João de Almeida
abstratas para aumentar a
Colega de trabalho Atenciosamente,
reutilização de código? João de Almeida
Ramal 3455

Parente Até mais,


João de Almeida

98 99
JRevisaoOO\JExercHerancaAssinaturaEmail

10

Você também pode gostar