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



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

[Desenvolvimento OO com Java] Classes abstratas e interfaces

Técnicas de Programação II

Desenvolvimento OO com Java Classes abstratas e interfaces

Programação Orientada a Objetos em java. Polimorfismo

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

Módulo 07 Características Avançadas de Classes

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

Programação por Objectos. Java

Herança. Alberto Costa Neto DComp - UFS

Programação Orientada a Objetos em Java

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Programação Orientada a Objetos (DPADF 0063)

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

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

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

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Módulo 06 Desenho de Classes

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Encapsulamento de Dados

Programação Orientada a Objetos (DPADF 0063)

Capítulo 4. Packages e interfaces

Material de Apoio 5. int getres() { return res; O que estas classes possuem em comum? 1) 2) 3)

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

Padrão Básico de Projeto: Interfaces e Polimorfismo

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Computação II Orientação a Objetos

Exercícios de Revisão Java Básico

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Guia de Fatores de Qualidade de OO e Java

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Programação Orientada a Objetos. Encapsulamento

Conversão de Tipos e Arrays

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

Laboratório de Programação. Aula 13 Java 5COP088. Aula 13 Genéricos e Conjuntos Java Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr barbon@uel.

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

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Capítulo 5 Reuso de Classes

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

Modulo IIa Extra: Object

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

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

Java 2 Standard Edition Como criar classes e objetos

Especialização em desenvolvimento para web com interfaces ricas. Tratamento de exceções em Java Prof. Fabrízzio A. A. M. N. Soares

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Classes, Superclasses e Subclasses

Análise de Programação

Introdução. Programação. Orientada a Objetos: Reuso. Introdução. Classes Abstratas

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

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Universidade Federal de Itajubá Instituto de Engenharia de Sistemas e Tecnologias da Informação-IESTI PCO203 Tópicos Especiais em Programação

Orientação a Objetos com Java

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

BSI UFRPE Prof. Gustavo Callou

Programação Orientada por Objetos

Noções sobre Objetos e Classes

Análise e Projeto Orientados por Objetos

Prototype, um Design Patterns de Criação

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Orientação a Objetos e a Linguagem Java

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

UML Unified Modeling Language

Tópicos em Engenharia de Computação

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Reuso com Herança a e Composiçã

Implementação de Classe e Auto-Relacionamento em Java

Java. Marcio de Carvalho Victorino

Programação por Objectos. Java

Unidade IV: Ponteiros, Referências e Arrays

Universidade da Beira Interior. Sistemas Distribuídos

Polimorfismo. Prof. Leonardo Barreto Campos 1

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Curso Java Starter. 1

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

1. Herança. Sobrescrevem métodos - redefinem métodos herdados. Subclasse herda de uma superclasse

Exemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame

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

Capítulo 8. Introdução UML

Prof. Jhonatan Fernando

Tópicos da Aula. Classes e Objetos. Classe Pública em Java. Classes em Java. Assinatura de Métodos. Corpo de Classes e Métodos. Conceitos de classe

Classes Abstratas e Interfaces

Universidade Federal de Uberlândia

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Coleções. Conceitos e Utilização Básica. c Professores de ALPRO I 05/2012. Faculdade de Informática PUCRS

Implementando uma Classe e Criando Objetos a partir dela

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

2 Orientação a objetos na prática

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

insfcanceof new public switch transient while byte continue extends for int null

UML: Diagrama de Casos de Uso, Diagrama de Classes

Classes Abstratas e Interfaces

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

THREADS EM JAVA. George Gomes Cabral

Modificador static e Pacotes. Alberto Costa Neto DComp - UFS

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

POO Programação Orientada a Objetos. Classes em Java

Transcrição:

Desenvolvimento OO com Java 7 RTTI e Interfaces 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 7 Apresentar os conceitos relacionados à iden%ficação de %pos em tempo de execução (Run- Time Type Iden%fica%on RTTI); Mostrar como a palavra reservada interface permite a criação de classes abstratas puras (interfaces); Explicar como Java pode simular herança múl%pla usando interfaces. Maio 2013 O Paradigma Orientado a Objetos 2

Polimorfismo e extensão Com polimorfismo, podemos esquecer a classe de um objeto e trabalhar com a superclasse: A interface de ambas é a mesma; A amarração dinâmica garante que o método da classe correta será executado. O que acontece se a subclasse estende a superclasse (adiciona mais funcionalidade)? Se a superclasse não possui aquela funcionalidade, não podemos chamá- la! Maio 2013 O Paradigma Orientado a Objetos 3

Polimorfismo e extensão abstract class Animal { public abstract void comer(); class Cachorro extends Animal { public void comer() { System.out.println("Comendo um osso..."); public void latir() { System.out.println("Au Au!"); class Gato extends Animal { public void comer() { System.out.println("Comendo um peixe..."); public void miar() { System.out.println("Miau!"); Maio 2013 O Paradigma Orientado a Objetos 4

Polimorfismo e extensão public class Teste { public static void main(string[] args) { Animal[] vet = new Animal[] { new Cachorro(), new Gato(), new Gato(), new Cachorro() ; for (int i = 0; i < vet.length; i++) { vet[i].comer(); // Erro: vet[i].latir(); Maio 2013 O Paradigma Orientado a Objetos 5

Estreitamento (downcast) Precisamos relembrar a classe específica do objeto para chamarmos métodos que não estão na interface da superclasse; Para isso faremos estreitamento: Ampliação (upcast) int para long float para double Cachorro para Animal Gato para Animal Estreitamento (downcast) long para int double para float Animal para Cachorro Animal para Gato Maio 2013 O Paradigma Orientado a Objetos 6

Upcast vs. downcast Ampliação é automá%ca e livre de erros: A classe base não pode possuir uma interface maior do que a classe derivada; Não é necessário explicitar o upcast. Estreitamento é manual e pode causar erros: A classe base pode ter várias subclasses e você está convertendo para a classe errada; É necessário explicitar o downcast; Pode lançar um erro (ClassCastException); Pode haver perda de informação (%pos primi%vos). Maio 2013 O Paradigma Orientado a Objetos 7

Upcast vs. downcast public class Teste { public static void main(string[] args) { Animal a = new Cachorro(); Cachorro c = (Cachorro)a; c.latir(); Upcast // Forma resumida: a = new Gato(); ((Gato)a).miar(); Downcast Maio 2013 O Paradigma Orientado a Objetos 8

RTTI: Run- Time Type Iden%fica%on O mecanismo que verifica o %po de um objeto em tempo de execução chama- se RTTI; RTTI = Run- Time Type Iden%fica%on ou Iden%ficação de Tipos em Tempo de Execução; Este mecanismo garante que as conversões são sempre seguras; Não permite que um objeto seja conver%do para uma classe inválida: Fora da hierarquia: erro de compilação; Dentro da hierarquia: erro de execução. Maio 2013 O Paradigma Orientado a Objetos 9

RTTI: Run- Time Type Iden%fica%on public class Teste { public static void main(string[] args) { Animal a = new Cachorro(); // Sem erro nenhum: Cachorro c = (Cachorro)a; // Erro de execução (ClassCastException): Gato g = (Gato)a; // Erro de compilação: String s = (String)a; Maio 2013 O Paradigma Orientado a Objetos 10

O operador instanceof O mecanismo de RTTI permite que você consulte se um objeto é de uma determinada classe; Operador instanceof: Sintaxe: <objeto> instanceof <Classe> Retorna true se o objeto for instância (direta ou indireta) da classe especificada; Retorna false caso contrário. Maio 2013 O Paradigma Orientado a Objetos 11

O operador instanceof public class Teste { public static void main(string[] args) { Animal[] vet = new Animal[] { new Cachorro(), new Gato(), new Gato(), new Cachorro() ; for (int i = 0; i < vet.length; i++) { if (vet[i] instanceof Cachorro) ((Cachorro)vet[i]).latir(); else if (vet[i] instanceof Gato) ((Gato)vet[i]).miar(); Maio 2013 O Paradigma Orientado a Objetos 12

O uso de instanceof deve ser raro Não é uma boa prá%ca usar instanceof: Use polimorfismo; Use classes genéricas (veremos adiante). Use instanceof apenas quando não há outra solução. Maio 2013 O Paradigma Orientado a Objetos 13

Trocando instanceof por polimorfismo abstract class Animal { public abstract void comer(); public abstract void falar(); class Cachorro extends Animal { public void comer() { /*... */ public void falar() { /*... */ class Gato extends Animal { public void comer() { /*... */ public void falar() { /*... */ Maio 2013 O Paradigma Orientado a Objetos 14

Trocando instanceof por genéricos public class Teste { public static void main(string[] args) { Cachorro c; List lista = new ArrayList(); lista.add(new Cachorro()); Object o = lista.get(0); if (o instanceof Cachorro) c = (Cachorro)o; // Com genéricos. List<Cachorro> listagen; listagen = new ArrayList<Cachorro>(); listagen.add(new Cachorro()); c = listagen.get(0); Maio 2013 O Paradigma Orientado a Objetos 15

Interfaces Uma classe abstrata é pura quando: Possui métodos abstratos; Não possui métodos concretos; Não possui atributos. Java oferece a palavra reservada interface: Cria uma classe abstrata pura; Chamaremos pelo nome de interface; Ao conversar com outros programadores, cuidado para não confundir com interface com o usuário. Maio 2013 O Paradigma Orientado a Objetos 16

Caracterís%cas Estabelece a interface (o contrato) de um conjunto de classes; Permite a construção de código genérico: Trabalha com qualquer objeto que implemente a interface; Obriga programadores a implementar determinados métodos em suas classes para usar seu código. Podem ser públicas ou amigas (mesma regra das classes); Classes u%lizam implements ao invés de extends para implementar uma interface. Maio 2013 O Paradigma Orientado a Objetos 17

Interfaces interface Forma { void desenhar(); void aumentar(int t); abstract class Poligono implements 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 18

Interfaces class Linha implements Forma { private int x1, y1, x2, y2; public void desenhar() { /*... */ public void aumentar(int t) { /*... */ Maio 2013 O Paradigma Orientado a Objetos 19

Membros da interface Métodos definidos na interface são automa%camente públicos; Atributos definidos na interface são automa%camente públicos e está%cos. interface Forma { int x; void desenhar(); interface Forma { public static int x; public void desenhar(); Definições equivalentes Maio 2013 O Paradigma Orientado a Objetos 20

Membros da interface interface Forma { void desenhar(); void aumentar(int t); class Linha implements Forma { // Erro: reduziu de público para amigo! void desenhar() { /*... */ // Erro: reduziu de público para privado! private void aumentar(int t) { /*... */ Maio 2013 O Paradigma Orientado a Objetos 21

Herança múl%pla Algumas vezes queremos herdar comportamento de duas classes: Maio 2013 O Paradigma Orientado a Objetos 22

Herança múl%pla Herança múl%pla pode trazer problemas: Colisão de nomes; Herança repe%da. Java prima pela simplicidade e não permite herança múl%pla: // Isto não existe em Java! class ProfessorAluno extends Professor, Aluno { Maio 2013 O Paradigma Orientado a Objetos 23

Herança múl%pla com interfaces Interfaces permitem que simulemos a herança múl%pla: interface VeiculoComPortas { void abrirportas(); interface VeiculoComPortaMalas { void abrirportamalas(); interface VeiculoComTetoSolar { void abrirtetosolar(); Maio 2013 O Paradigma Orientado a Objetos 24

Herança múl%pla com interfaces class Carrao implements VeiculoComPortas, VeiculoComPortaMalas, VeiculoComTetoSolar { public void abrirportas() { public void abrirportamalas() { public void abrirtetosolar() { public void andar() { public class Teste { static void ap(veiculocomportas v) { v.abrirportas(); static void apm(veiculocomportamalas v) { v.abrirportamalas(); Maio 2013 O Paradigma Orientado a Objetos 25

Herança múl%pla com interfaces static void ats(veiculocomtetosolar v) { v.abrirtetosolar(); static void a(carrao v) { v.andar(); public static void main(string[] args) { Carrao c = new Carrao(); ap(c); // Upcast: VeiculoComPortas apm(c); // Upcast: VeiculoComPortaMalas ats(c); // Upcast: VeiculoComTetoSolar a(c); // Sem upcast. Maio 2013 O Paradigma Orientado a Objetos 26

Solução para herança múl%pla Escolha uma das classes concretas para herdar; Para as demais, crie interfaces e implemente- as; Use composição para fazer reuso. Maio 2013 O Paradigma Orientado a Objetos 27

Interface ou classe abstrata? Sempre que possível, use interfaces; Lembre- se que Java não suporta herança múl%pla: Quando um objeto estende uma classe, não poderá estender nenhuma outra; Não queime a herança sem necessidade! Maio 2013 O Paradigma Orientado a Objetos 28

Colisão de nomes em interfaces Assim como na herança múl%pla, pode haver colisão de nomes em interfaces: Não há colisão de implementação (simplifica); Especificadores de acesso podem colidir; Tipos de retorno podem colidir. interface Forma { void desenhar(); void inverter(); class UmaForma implements Forma { protected void desenhar() { public int inverter() { // Erro! // Erro! Maio 2013 O Paradigma Orientado a Objetos 29

Hierarquias de interface Uma interface pode estender outra: interface Forma { void desenhar(); void aumentar(int t); interface FormaInversivel extends Forma { void inverter(); class UmaForma implements Forma { /*... */ class OutraForma implements FormaInversivel { /*... */ Maio 2013 O Paradigma Orientado a Objetos 30

A interface Comparable Um exemplo de interface na API Java é a interface Comparable; Define o método compareto(object obj): Compara o objeto atual (this) com o objeto informado (obj); Retorna 0 se this = obj; Retorna um número nega%vo se this < obj; Retorna um número posi%vo se this > obj. Métodos genéricos a u%lizam para ordenar coleções de elementos. Maio 2013 O Paradigma Orientado a Objetos 31

A interface Comparable import java.util.arrays; class Valor implements Comparable { int valor; public Valor(int v) { valor = v; public int compareto(object obj) { return valor - ((Valor)obj).valor; public String tostring() { return "" + valor; Maio 2013 O Paradigma Orientado a Objetos 32

A interface Comparable public class Teste { static void imprimir(object[] vetor) { for (int i = 0; i < vetor.length; i++) System.out.print(vetor[i] + "; "); System.out.println(); public static void main(string[] args) { Valor[] vetor = new Valor[] { new Valor(10), new Valor(3), new Valor(15), new Valor(7) ; imprimir(vetor); // 10; 3; 15; 7; Arrays.sort(vetor); imprimir(vetor); // 3; 7; 10; 15; Maio 2013 O Paradigma Orientado a Objetos 33

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