6 Polimorfismo. Desenvolvimento OO com Java. Vítor E. Silva Souza ~ vitorsouza

Documentos relacionados
Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Capítulo 5 Reuso de Classes

Java na Prática. Célio Silva Aula 3

Aula 10 Polimorfismo. Prof. Jefersson Alex dos Santos. Baseado em:

Introdução à orientação a objetos

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Desenvolvimento Web TCC Turma A-1

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Simulado de Linguagem de Programação Java


Análise e Projeto Orientado a Objetos. Nazareno Andrade Baseado no material dos profs. Hyggo Almeida e Jacques Sauvé

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Programação Orientada a Objetos em Java. Herança

Técnicas de Programação II

Módulo 06 Desenho de Classes

Modulo IIa Extra: Object

Programação Java. Construção de Interface gráfica. Processo Básico: OO + Eventos. Exemplo

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Orientação a Objetos

Programação Orientada a Objetos (DPADF 0063)

Herança. Prof. Leonardo Barreto Campos 1

Paradigmas de Programação. Genéricos

Programação Orientada a Objetos

Exercício de Estrutura de dados. Java Fila

Num programa em JAVA é possível definir diferentes sequências de execução independente: Threads.

Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC, Programação em Comunicações

MDS II Aula 04. Concepção Requisitos Diagrama de Casos de Uso (Use Cases)

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Cartão de fidelização de clientes das distribuidoras de combustível.

UNIVERSIDADE DO VALE DO RIO DOS SINOS - UNISINOS CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS - CENTRO 06. Funções, variáveis, parâmetros formais

Aula 3 Objeto atual com referencia THIS e Classes com Herança

Guia de Fatores de Qualidade de OO e Java

Sistemas de Objetos DistribuídosRevisão Java e Java ORBs p.1/26

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 6 Filas

Algoritmos e Programação II

INF1007: Programação 2 9 Tipos Abstratos de Dados. (c) Dept. Informática - PUC-Rio 1

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

de fevereiro de 2002

Desenvolvimento OO com Java Orientação a objetos básica

Interface gráfica em Java: Swing e SWT

Orientação a Objetos - Programação em C++

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Programação Orientada a Objetos em java. Polimorfismo

Lógica de Programação. Profas. Simone Campos Camargo e Janete Ferreira Biazotto

Computação II Orientação a Objetos

Programação de Computadores - I. Profª Beatriz Profº Israel

Orientação a Objetos e a Linguagem Java

II Semana de Ciência e Tecnologia do IFMG campus Bambuí II Jornada Científica 19 a 23 de Outubro de 2009

Programação de Computadores I. Linguagem C Função

Programação Na Web. Linguagem Java Parte II. break com o nome do bloco. Sintaxe. Nome do bloco. Termina o bloco. António Gonçalves ...

Programação Orientada a Objetos SANTOS, Rafael

Inteligência Artificial

Java 2 Standard Edition Como criar classes e objetos

Tópicos Avançados em Banco de Dados Dependências sobre regime e controle de objetos em Banco de Dados. Prof. Hugo Souza

Encapsulamento de Dados

Banco de Dados I. Prof. Edson Thizon

ENGENHARIA DE SOFTWARE

5 Caso de estudo O cartão fidelidade

AULA 1 INTRODUÇÃO A BANCO DE DADOS E VISÃO GERAL DO SQL CONCEITUANDO BANCO DE DADOS MODELO RELACIONAL

Linguagem de Programação

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Conteúdo programático

Capítulo 4 - Polimorfismo

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Orientação a Objetos com Java

Aula 11: Desvios e Laços

Desenvolvimento Web com Framework Demoiselle versão 1.0

Padrões de Projeto. Factory Method

MODELAGENS. Modelagem Estratégica

Programação com Acesso a BD. Programação com OO Acesso em Java

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Adriana da Silva Santi Coord. Pedagógica de Matemática SMED - Abril/2015

Prof. Me. Marcos Echevarria

Reuso com Herança a e Composiçã

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Lista de Exercícios Nro. 1 Programação Orientada a Objetos - SCC204

JAVA Express com Lógica. Subtítulo

Sobre o Visual C

INFORMÁTICA PARA GESTÃO II Curso Superior de Gestão de Marketing

Análise da Base Nacional Comum Curricular de Matemática. Revisado por Phil Daro, USA Common Core Standards

Banco de Dados. Banco de Dados Parte 2. Alcides Pamplona Alcides Pamplona Linguagem de Programação CESBD 2010

Revisão OO Básico. Orientação a Objetos em Java

Programação Java III. Prof. Vinicius Rosalen

Programação para a Plataforma Android Aula 17. Broadcasts

GEOMETRIA. sólidos geométricos, regiões planas e contornos PRISMAS SÓLIDOS GEOMÉTRICOS REGIÕES PLANAS CONTORNOS

(Aula 17) Threads em Java

Universidade Federal de Goiás Campus Catalão Departamento de Matemática

(ou seja, boas praticas de programação orientada a objetos devem ser empregadas mesmo se não foram explicitamente solicitadas)

Um Exemplo de Refatoração. Prof. Alberto Costa Neto DComp/UFS

ÁREA DO PROFESSOR (TUTOR)

BALANÇO PATRIMONIAL AMBIENTAL - EXERCÍCIO COMENTADO Prof Alan

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

Porquê PADRÕES? - Exemplo

Introdução à Programação de Computadores Parte I

Treinamento sobre Progress Report.

Transcrição:

Desenvolvimento OO com Java 6 Polimorfismo Vítor E. Silva Souza (vitorsouza@inf.ufes.br) http://www.inf.ufes.br/ ~ vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo Este obra foi licenciada sob uma Licença Creative Commons Atribuição 3.0 Não Adaptada.

Obje%vos da parte 6 Entrar em detalhes no conceito de polimorfismo, muito importante para a orientação a objetos: Hierarquias polimórficas; Classes e métodos abstratos; Polimorfismo com java.lang.object. Desta forma: Aumentar ainda mais a capacidade de abstração para construção de sojwares mais modulares e reu%lizáveis. Maio 2013 O Paradigma Orientado a Objetos 2

Polimorfismo Do grego poli + morphos = múl%plas formas; Caracterís%ca OO na qual se admite tratamento idên%co para objetos diferentes baseado em relações de semelhança; Em outras palavras, onde uma classe base é esperada, aceita- se qualquer uma de suas subclasses. Maio 2013 O Paradigma Orientado a Objetos 3

Relembrando o exemplo da parte 5 class Forma { public void desenhar() { System.out.println("Forma"); class Circulo extends Forma { public void desenhar() { System.out.println("Círculo"); class Quadrado extends Forma { /*... */ class Triangulo extends Forma { /*... */ Maio 2013 O Paradigma Orientado a Objetos 4

Relembrando o exemplo da parte 5 public class Teste { private static void desenha(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); public static void main(string[] args) { Forma[] formas = new Forma[] { new Circulo(), new Forma(), new Quadrado(), new Triangulo() ; desenha(formas); Maio 2013 O Paradigma Orientado a Objetos 5

Relembrando o exemplo da parte 5 Ampliação (upcas&ng) é a conversão implícita de uma subclasse para uma superclasse: class Teste { public static void inverter(forma f) { System.out.println("Inverte " + f); public static void main(string[] args) { Circulo c = new Circulo(); inverter(c); // Upcasting! Forma f = new Quadrado(); // Upcasting! Maio 2013 O Paradigma Orientado a Objetos 6

Incrementando o exemplo O compilador realmente não sabe qual é o %po. Veja um exemplo com geração aleatória: public static void main(string[] args) { Forma f = null; switch((int)(math.random() * 3)) { case 0: f = new Circulo(); case 1: f = new Quadrado(); case 2: f = new Triangulo(); default: f = new Forma(); f.desenhar(); Maio 2013 O Paradigma Orientado a Objetos 7

Esquecendo o %po do objeto Quando realizamos ampliação, esquecemos o %po de um objeto: Forma f = new Quadrado(); Não sabemos mais qual é a classe específica de f. Sabemos apenas que ele é uma forma; Por que fazer isso? Maio 2013 O Paradigma Orientado a Objetos 8

Métodos mais gerais Fazemos ampliação para escrevermos métodos mais gerais, para poupar tempo e esforço: class Teste { public void inverter(circulo f) { System.out.println("Inverte " + f); public void inverter(quadrado f) { System.out.println("Inverte " + f); public void inverter(triangulo f) { System.out.println("Inverte " + f); Maio 2013 O Paradigma Orientado a Objetos 9

Amarração No entanto, se trabalhamos com Forma, como saber qual implementação executar quando chamamos um método? public class Teste { private static void desenha(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); fs[i] é do tipo Forma. Chamar sempre Forma.desenhar()? Maio 2013 O Paradigma Orientado a Objetos 10

Amarração tardia Em linguagens estruturadas, os compiladores realizam amarração em tempo de compilação; Em linguagens OO com polimorfismo, não temos como saber o %po real do objeto em tempo de compilação; A amarração é feita em tempo de execução, também conhecida como: Amarração tardia; Amarração dinâmica; ou Late binding. Maio 2013 O Paradigma Orientado a Objetos 11

Amarração tardia Maio 2013 O Paradigma Orientado a Objetos 12

Quando usar Amarração dinâmica é menos eficiente; No entanto, ela que permite o polimorfismo; Java usa sempre amarração dinâmica; A exceção: se um método é final, Java usa amarração está%ca (pois ele não pode ser sobrescrito); Você não pode escolher quando usar um ou outro. É importante apenas entender o que acontece. Maio 2013 O Paradigma Orientado a Objetos 13

Benercios do polimorfismo Extensibilidade: Podemos adicionar novas classes sem alterar o método polimórfico. class Retangulo extends Forma { public void desenhar() { System.out.println("Retangulo"); class Quadrado extends Retangulo { public void desenhar() { System.out.println("Quadrado"); Maio 2013 O Paradigma Orientado a Objetos 14

Benercios do polimorfismo class Reta extends Forma { public void desenhar() { System.out.println("Reta"); public class Teste { public void inverter(forma f) { System.out.println("Inverte " + f); public static void main(string[] args) { Forma f = new Reta(); f.desenhar(); inverter(f); Maio 2013 O Paradigma Orientado a Objetos 15

Benercios do polimorfismo A interface de todos é definida pela classe base; Novas classes possuem a mesma interface, portanto o sistema já sabe lidar com elas; Mesmo que todas as classes já existam de princípio, poupa- se tempo e esforço, codificando um método único para todas. Maio 2013 O Paradigma Orientado a Objetos 16

Sobrescrita vs. sobrecarga Cuidado para não confundir: class Forma { public void aumentar(int t) { System.out.println("Forma.aumentar()"); class Linha extends Forma { // Foi feita sobregarga e não sobrescrita! public void aumentar(double t) { System.out.println("Linha.aumentar()"); Maio 2013 O Paradigma Orientado a Objetos 17

Sobrescrita vs. sobrecarga A confusão gera um erro muito dircil de descobrir: public class Teste { private static void aumentar(forma f) { f.aumentar(10); public static void main(string[] args) { Linha l = new Linha(); aumentar(l); // Forma.aumentar() Maio 2013 O Paradigma Orientado a Objetos 18

Classes e métodos abstratos Algumas vezes classes no topo da hierarquia são muito gerais: O que é uma forma? Como se desenha uma forma? Como se aumenta uma forma? Tais operações não fazem sen%do. Queremos apenas definir que elas existam, mas não implementá- las; A solução: métodos abstratos. Maio 2013 O Paradigma Orientado a Objetos 19

Classes e métodos abstratos Uma classe que possui métodos abstratos deve ser declarada como abstrata: abstract class Forma { public abstract void desenhar(); class Circulo extends Forma { public void desenhar() { System.out.println("Círculo"); Maio 2013 O Paradigma Orientado a Objetos 20

Classes abstratas Não permitem criação de instâncias (objetos): Um método abstrato não possui implementação, portanto não pode ser chamado; Podemos ter classes abstratas sem métodos abstratos, mas não o contrário. Para ser ú%l, deve ser estendida: Suas subclasses devem implementar o método ou declararem- se como abstratas. Servem para definir interfaces e prover algumas implementações comuns. Maio 2013 O Paradigma Orientado a Objetos 21

Classes e métodos abstratos Algumas regras: Métodos está%cos não podem ser abstratos; Construtores não podem ser abstratos; Classes abstratas podem ter construtores (lembre- se que são chamados pelas subclasses!); Métodos abstratos não podem ser privados. Maio 2013 O Paradigma Orientado a Objetos 22

Classes e métodos abstratos // Classe abstrata pura. abstract class Forma { public abstract void desenhar(); public abstract void aumentar(int t); // Classe abstrata. abstract class Poligono extends Forma { private int lados; public Poligono(int lados) { this.lados = lados; public int getlados() { return lados; public abstract void pintar(int cor); Maio 2013 O Paradigma Orientado a Objetos 23

Classes e métodos abstratos // Classe concreta. class Retangulo extends Poligono { public Retangulo() { super(4); public void desenhar() { System.out.println("Retangulo.desenhar"); public void aumentar(int t) { System.out.println("Retangulo.aumentar"); public void pintar(int cor) { System.out.println("Retangulo.pintar"); Maio 2013 O Paradigma Orientado a Objetos 24

Polimorfismo com java.lang.object Relembrando a interface comum a todas as classes escritas em Java: clone(): cria uma cópia do objeto (uso avançado); equals(object o): verifica se objetos são iguais; finalize(): chamado pelo GC (não é garan%a); getclass(): retorna a classe do objeto; hashcode(): função hash; notify(), notifyall() e wait(): para uso com threads; tostring(): converte o objeto para uma representação como String. Maio 2013 O Paradigma Orientado a Objetos 25

O método equals() Compara dois objetos. Retorna true se forem iguais, false se não forem; Permitem polimorfismo em grande escala: Podemos criar uma classe conjunto que armazena objetos de qualquer classe, desde que sejam objetos diferentes; Podemos implementar um método que permite dizer se um objeto está no conjunto, se um conjunto está con%do em outro, etc. Maio 2013 O Paradigma Orientado a Objetos 26

O método equals() class Valor { int i; public Valor(int i) { this.i = i; public class Teste { public static void main(string[] args) { Integer m = new Integer(100); Integer n = new Integer(100); System.out.println(m == n); // false System.out.println(m.equals(n)); // true Valor v = new Valor(100); Valor u = new Valor(100); System.out.println(v.equals(u)); // false Maio 2013 O Paradigma Orientado a Objetos 27

O método equals() class Valor { int i; public Valor(int i) { this.i = i; public boolean equals(object o) { return (o instanceof Valor) && (((Valor)o).i == i); public class Teste { public static void main(string[] args) { Valor v = new Valor(100); Valor u = new Valor(100); System.out.println(v.equals(u)); // true Maio 2013 O Paradigma Orientado a Objetos 28

O método tostring() Retorna uma representação em String do objeto em questão; Permite polimorfismo em grande escala: Se quisermos imprimir um objeto de qualquer classe, ele será chamado; Se quisermos concatenar um objeto de qualquer classe com uma String, ele será chamado. Maio 2013 O Paradigma Orientado a Objetos 29

O método tostring() class Valor { int i; public Valor(int i) { this.i = i; public class Teste { public static void main(string[] args) { Integer m = new Integer(100); System.out.println(m); // 100 Valor v = new Valor(100); System.out.println(v); // Valor@82ba41 Maio 2013 O Paradigma Orientado a Objetos 30

O método tostring() class Valor { int i; public Valor(int i) { this.i = i; public String tostring() { return "" + i; public class Teste { public static void main(string[] args) { Integer m = new Integer(100); System.out.println(m); // 100 Valor v = new Valor(100); System.out.println(v); // 100 Maio 2013 O Paradigma Orientado a Objetos 31

Conclusões O polimorfismo permite a criação de métodos mais gerais, graças à amarração tardia; Hierarquias polimórficas são mais extensíveis; Classes e métodos abstratos auxiliam na criação de modelos mais precisos; A classe Object, ancestral de todas as classes Java, promove polimorfismo em grande escala com seus métodos. Maio 2013 O Paradigma Orientado a Objetos 32

h"p://nemo.inf.ufes.br/ Maio 2013 O Paradigma Orientado a Objetos 33