Buscar

Aula_14_Polimorfismo

Prévia do material em texto

Curso de Licenciatura em Computação
Disciplina: Programação III
Professor: Rafael Cunha Cardoso
rafaelcardoso@ifsul.edu.br
Classe Object
e Polimorfismo
PIII
Classe Object
2
Pai de todas as classes.
Toda classe que não estende outra explicitamente é subclasse da classe Object.
public class Pessoa {
private String nome;
public String getNome() {
return nome;
}
}
public class Pessoa extends Object {
private String nome;
public String getNome() {
return nome;
}
}
É o mesmo que:Isso:
A classe Object possui 11 métodos. 
Entre eles o método toString(), o qual que retorna uma String com a representação 
do objeto que chamou o método.
PIII
3
Método toString()
public class Pessoa{
private String nome;
public Pessoa (String nome){
this.nome = nome;
}
public String getNome(){
return this.nome;
}
public String getNome(){
return “Nome:” + this.nome;
}
}
public class Exemplo {
public static void main(String args[]){
Pessoa p = new Pessoa(“Ana”);
System.out.println(p);
}
}
É usual sobrescrever
o método toString()
O principal objetivo de se fazer isso, é 
fornecer uma descrição relevante do objeto 
que está sendo descrito.
Pessoa@2c8d66b2Nome: Ana 
PIII
Polimorfismo
PIII
Polimorfismo
5
Polimorfismo: poli=muitos, morfi=forma
Característica que permite usar uma variável de uma superclasse para referenciar objetos de 
uma subclasse.
Produto
#preco:double
+Produto(preco:double)
+exibe()
Fogao
-qdeBocas:int
+Fogao(preco:double,qdeBocas:int)
+exibe()
Bicicleta
-qMarchas:int
+Bicicleta(preco:double, qMarchas:int)
+exibe()
A referência muda o comportamento 
conforme o objeto que está associado a ela.
PIII
6
Polimorfismo
public class Produto {
protected double preco;
public Produto(double preco) {
this.preco = preco;
}
public void exibe() {
System.out.println(“Produto: “);
System.out.println(“Preco:“ + preco);
}
}
public class Fogao extends Produto {
private int qdeBocas;
public Fogao(double preco, int qdeBocas) {
super(preco);
this.qdeBocas = qdeBocas;
}
public void exibe() {
System.out.println(“Fogao: “);
System.out.println(“Preco: “ + preco);
System.out.println(“Bocas: “ + qdeBocas);
}
}
public class Bicicleta extends Produto {
private int qMarchas;
public Bicicleta(double preco, int qMarchas){
super(preco);
this.qMarchas = qMarchas;
}
public void exibe() {
System.out.println(“Bicicleta: “);
System.out.println(“Preco: “+preco);
System.out.println(“Marchas: “+qMarchas);
}
}
Produto
#preco:double
+Produto(preco:double)
+exibe()
Fogao
-qdeBocas:int
+Fogao(preco:double,qdeBocas:int)
+exibe()
Bicicleta
-qMarchas:int
+Bicicleta(preco:double, qMarchas:int)
+exibe()
PIII
7
Polimorfismo
public class Produto {
protected double preco;
public Produto(double preco) {
this.preco = preco;
}
public void exibe() {
System.out.println(“Produto: “);
System.out.println(“Preco:“ + preco);
}
}
public class Fogao extends Produto {
private int qdeBocas;
public Fogao(double preco, int qdeBocas) {
super(preco);
this.qdeBocas = qdeBocas;
}
public void exibe() {
System.out.println(“Fogao: “);
System.out.println(“Preco: “ + preco);
System.out.println(“Bocas: “ + qdeBocas);
}
}
public class Bicicleta extends Produto {
private int qMarchas;
public Bicicleta(double preco, int qMarchas){
super(preco);
this.qMarchas = qMarchas;
}
public void exibe() {
System.out.println(“Bicicleta: “);
System.out.println(“Preco: “+preco);
System.out.println(“Marchas: “+qMarchas);
}
}
public class Polimorfismo {
public static void main(String args[]){
Produto p1, p2, p3;
p1 = new Produto(100.0);
p2 = new Fogao(150.0,2);
p3 = new Bicicleta(600.0,10);
p1.exibe();
p2.exibe();
p3.exibe();
}
}
Qual exibe é chamado?
PIII
8
Polimorfismo
p1 = new Produto(100.0);
p2 = new Fogao(150.0,2);
p3 = new Bicicleta(600.0,10);
Fogao é um Produto
Bicicleta é um Produto
100.0preco
p1
preco 150.0
2qdeBocasp2
preco 600.0
10qMarchas
p3
public class Polimorfismo {
public static void main(String args[]){
Produto p1, p2, p3;
p1 = new Produto(100.0);
p2 = new Fogao(150.0,2);
p3 = new Bicicleta(600.0,10);
p1.exibe();
p2.exibe();
p3.exibe();
}
}
Produto: 
Preco:100.0
Fogao: 
Preco: 150.0
Bocas: 2
Bicicleta: 
Preco: 600.0
Marchas: 10
Polimorfismo permite usar uma variável de uma 
superclasse para referenciar objetos de uma subclasse.
PIII
9
Polimorfismo – outro exemplo de uso
ListaDeProdutos
-n:int
+ListaDeProdutos(qdeMaxima:int)
+inclui(p:Produto)
+exibeTodos()
Produto
#preco:double
+Produto(preco:double)
+exibe()
Bike
-qMarchas:int
+Bicicleta(preco:double, qMarchas:int)
+exibe()
vet[]
0..*
null null
vet
[0] [1] [2] [3] [4]
Fogao Bike Fogao
Uma classe para armazenar uma
lista de instância de Produto
Fogao
-qdeBocas:int
+Fogao(preco:double, qdeBocas:int)
+exibe()
PIII
10
Classe ListaDeProdutos
public class ListaDeProdutos {
private Produto vet[];
private int n;
public ListaDeProdutos(int qtdMax){
vet = new Produto[qtdMax];
n=0;
} 
public void inclui(Produto p) {
if (n < vet.length)
vet[n++] = p; 
}
public void exibeTodos() {
for (int i=0; i<n; i++)
vet[i].exibe();
}
}
public class ExemploLista {
public static void main(String args[]){
ListaDeProdutos lista;
lista = new ListaDeProdutos(5);
lista.inclui(new Fogao(200.0,4));
lista.inclui(new Bicicleta(450.0,10));
lista.inclui(new Fogao(300.0,6));
lista.exibeTodos();
}
}
Para permitir a inclusão de um novo produto (ex: Geladeira), 
o que deve ser modificado?
PIII
11
Classe ListaDeProdutos
public class ExemploLista {
public static void main(String args[]){
ListaDeProdutos lista;
lista = new ListaDeProdutos(5);
lista.inclui(new Fogao(200.0,4));
lista.inclui(new Bike(450.0,10));
lista.inclui(new Fogao(300.0,6));
lista.inclui(new Geladeira(700.0,400));
lista.exibeTodos();
}
}
public class Geladeira extends Produto{
private int capacidade;
public Geladeira(double preco, int capacidade){
super(preco);
this.capacidade = capacidade;
}
public void exibe() {
System.out.println(“Geladeira: “);
System.out.println(“Preco: “ + preco);
System.out.println(“Capacidade: “ + capacidade);
}
}
PIII
Conversão entre 
objetos
PIII
Ampliação (UpCasting)
13
public class Ampliacao {
public static void main(String args[]) {
ListaDeProdutos lista;
Produto p1 = new Fogao(200.0,4);
Fogao f = new Fogao(300.0,6);
Produto p2 = f;
lista = new ListaDeProdutos(5);
lista.inclui(new Fogao(200.0,4));
...
}
}
Conversão da referência de uma subclasse 
para uma superclasse.
Ocorre automaticamente (implícita).
Espera um parâmetro da classe Produto
Fogao é um Produto
PIII
14
No upcasting, o método deve existir na 
superclasse para ser utilizado.
public class Fogao extends Produto {
...
public int getQuantidadeBocas() {
return qdeBocas;
}
...
} 
Incluindo um novo 
método na classe Fogao
public class Exemplo {
public static void main(String args[]) {
Produto p = new Fogao(300.0,6);
int qb = p.getQuantidadeBocas();
System.out.println("Bocas: “ + qb);
}
} 
Exemplo.java:5: cannot find symbol
symbol : method getQuantidadeBocas()
location: class Produto
int qb = p.getQuantidadeBocas();
^
1 error
A classe Produto não possui 
o método getQuantidadeBocas()
public class Produto {
protected double preco;
public Produto(double preco) {
this.preco = preco;
}
public void exibe() {
System.out.println(“Produto: “);
System.out.println(“Preco:“ + preco);
}
}
PIII
15
public class Downcasting {
public static void main(String args[]) {
int qb;
Produto p = new Fogao(300.0, 6);
Fogao f = (Fogao) p;
qb = f.getQuantidadeBocas();
System.out.println("Bocas: " + qb);
// ou
qb = ((Fogao)p).getQuantidadeBocas();
System.out.println("Bocas: " + qb);
}
}
Conversão da referência de uma superclasse 
para uma subclasse.
Deve ser explicitado.
Redução (DownCasting)
Bocas: 6
Bocas: 6
PIII
Polimorfismo e a classe Object
16
Polimorfismo com a classe Object.
ArrayList – classe que armazena Object- método add(Object obj)
Todas as classes são subclasses de Object.
Dessa forma podemos armazenar objetos de qualquer classe.
import java.util.ArrayList;
public class ArrayListJogador {
public static void main(String args[]){
ArrayList lista = new ArrayList();
lista.add(new Jogador("Zé",4));
lista.add(new Jogador("Mané",8));
lista.add(new Jogador("Odair",10));
System.out.println(lista);
}
}
Como permitir que os 
nomes sejam impressos?
[Jogador@3e25a5, 
Jogador@19821f, 
Jogador@addbf1]
PIII
17
Classe Jogador e método toString()
O método toString() da classe ArrayList possui uma chamada ao método toString()
dos objetos armazenados.
public class Jogador {
private String nome;
private int camiseta;
public Jogador(String n, int cam){
nome = n;
camiseta = cam;
}
public String toString() {
return nome;
}
...
} Para permitir a impressão correta: 
Implementar toString() na classe Jogador.
[Zé, Mané, Odair]
import java.util.ArrayList;
public class ArrayListJogador {
public static void main(String args[]){
ArrayList lista = new ArrayList();
lista.add(new Jogador("Zé",4));
lista.add(new Jogador("Mané",8));
lista.add(new Jogador("Odair",10));
System.out.println(lista);
}
}
Curso de Licenciatura em Computação
Disciplina: Programação III
Professor: Rafael Cunha Cardoso
rafaelcardoso@ifsul.edu.br
Classe Object
e Polimorfismo

Continue navegando