[Desenvolvimento OO com Java] Classes abstratas e interfaces

Documentos relacionados
Desenvolvimento OO com Java Classes abstratas e interfaces

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

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

Herança; Sobrescrita, Sobrecarga e Polimorfismo; Classes abstratas e concretas (finais).

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

Interfaces POO. Prof. Marcio Delamaro

POO29004 Programação Orientada a Objetos

Classe Abstrata e Interface

Computação II - Java - Teste 1.2 Prof. Adriano Joaquim de Oliveira Cruz 2015/04/27

Linguagem de Programação Orientada a Objeto Polimorfismo, Classes Abstractas e Interfaces

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

[Desenvolvimento OO com Java] Modificadores de acesso e atributos de classe

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Herança. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

Desenvolvimento OO com Java Herança, reescrita e polimorfismo

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Classes e Objetos. Sintaxe de classe em Java

POO29004 Programação Orientada a Objetos

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Herança e Polimorfismo

Linguagem de Programação IV Introdução

Polimorfismo. O que é polimorfismo?

Programação. Orientada a Objetos: Herança. Objetos. Relacionamento entre classes. Análise e Projeto Orientados a. Objetos

Fundamentos Básicos da linguagem Java (Programação Orientada a Objetos) Prof. Responsáveis Wagner Santos C. de Jesus

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

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

Vejamos o seguinte exemplo public class Exemplo private int testada = 20; public void testapalavra(int testada) JOptionPane.showMessageDialog(null,"Pa

Interfaces. Universidade Católica de Pernambuco Ciência da Computação. Prof. Márcio Bueno.

4 Conceito de Herança

Programação Java. Marco Fagundes. - Herança, Classes Abstratas e Interfaces Marco Fagundes -

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

9 Classes Abstractas e Interfaces

Programação por Objectos. Java

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

Linguagem de Programação III

Java Básico. Carga Horária: 32 horas. Pré-requisito: Lógica de Programação; JAVA. Conteúdo Programático

POO29004 Programação Orientada a Objetos

[Desenvolvimento OO com Java] Exceções e controle de erros

Programação Orientada a Objetos. SANTOS, Rafael (PLT) e Guia de Estudo SCJP. SIERRA, Kathy e BATES, Bert

Orientação a objetos. Programação. Orientada a Objetos. Orientação a objetos. Orientação a objetos. Abstração e encapsulamento

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Linguagem de Programação II Implementação

Lição 11 Herança, polimorfismo e interfaces

Programação Orientada a Objetos. Professor: André Luis Meneses Silva br.geocities.com/programacao2ufs

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

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

5 Reuso de Classes. Desenvolvimento OO com Java. Vítor E. Silva Souza

Palavras Reservadas da Linguagem Java

Rafael B. Pereira (

Aula 10 POO 1 Classes Abstratas. Profa. Elaine Faria UFU

Java para Desktop. Programação Orientada à Objetos 2 JSE

Java First-Tier: Aplicações. Sobrecarga. Orientação a Objetos em Java (II) Sobrecarga de Construtores: Exemplo de Declaração

Programação Orientada a Objetos com Java. Prof. Júlio Machado

Polimorfismo. PARTE II: Java e OO. Polimorfismo. Polimorfismo. Polimorfismo. Polimorfismo

Interfaces e Classes Abstratas

Linguagem de Programação II Implementação

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Orientada por Objetos

extendsé usado para indicar herança em JAVA

Aula 9 Herança. Prof. Jefersson Alex dos Santos

Conceitos de Programação Orientada a Objetos

Programação Java (nível intermediário) 4. Polimorfismo

Programação Estruturada e Orientada a Objetos

Programação Orientada a Objetos

Java First-Tier: Aplicações. Herança: Simples Múltipla. Orientação a Objetos em Java (III) Problemas de Herança Múltipla.

RESULUÇÃO DOS EXERCÍCIOS E INSTRUÇÕES DE DECISÃO (if{} e else{}) Profº André Aparecido da Silva Disponível em:

Linguagem de Programação Orientada a Objeto Construtores e Sobrecarga

Transcrição:

Centro Tecnológico Departamento de Informática Prof. Vítor E. Silva Souza http://www.inf.ufes.br/~vitorsouza [Desenvolvimento OO com Java] Classes abstratas e interfaces Este obra está licenciada com uma licença Creative Commons Atribuição- CompartilhaIgual 4.0 Internacional: http://creativecommons.org/licenses/by-sa/4.0/.

Conteúdo do curso O que é Java; Variáveis primitivas e controle de fluxo; Orientação a objetos básica; Um pouco de vetores; Modificadores de acesso e atributos de classe; Herança, reescrita e polimorfismo; Classes abstratas e interfaces; Exceções e controle de erros; Organizando suas classes; Utilitários da API Java. Estes slides foram baseados na apostila do curso FJ-11: Java e Orientação a Objetos da Caelum e na apostila Programação Orientada a Objetos em Java do prof. Flávio Miguel Varejão. Abril 2019 Programação III - Classes abstratas e interfaces 2

Exemplo: um aplicativo de desenho Abril 2019 Programação III - Classes abstratas e interfaces 3

Classes e métodos abstratos Classes no topo da hierarquia podem ser muito gerais: o O que é uma forma? o Como se desenha uma forma? o Como se aumenta uma forma? Tais operações não fazem sentido. Queremos apenas definir que elas existam, mas não implementá-las; A solução: métodos abstratos. Abril 2019 Programação III - Classes abstratas e interfaces 4

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 { @Override public void desenhar() { System.out.println("Círculo"); Abril 2019 Programação III - Classes abstratas e interfaces 5

Classes abstratas Não permitem criação de instâncias (objetos): o Um método abstrato não possui implementação, portanto não pode ser chamado. Para ser útil, deve ser estendida: o Suas subclasses devem implementar o método ou declararem-se como abstratas. Servem para definir interfaces e prover algumas implementações comuns. Polimorfismo! Abril 2019 Programação III - Classes abstratas e interfaces 6

Construindo a hierarquia de formas Forma Decl. desenhar() Círculo Triângulo Retângulo Decl. desenhar() Decl. desenhar() Decl. desenhar() Impl. desenhar() Impl. desenhar() Impl. desenhar() Quadrado Decl. desenhar() Abril 2019 Programação III - Classes abstratas e interfaces 7

Classes e métodos abstratos - Quiz Métodos estáticos podemser abstratos? Construtores podemser abstratos? Classes abstratas podemter construtores? Não Não Sim Lembre-se: construtores são chamados pelas subclasses! Métodos abstratos podemser privativos? Uma classe abstratapodemestender umanormal? Posso ter uma classe abstrata sem nenhum método abstrato? Não Sim Sim Abril 2019 Programação III - Classes abstratas e interfaces 8

Classes abstratas (puras) e concretas // 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); Abril 2019 Programação III - Classes abstratas e interfaces 9

Classes abstratas (puras) e concretas // Classe concreta. class Retangulo extends Poligono { public Retangulo() { super(4); @Override public void desenhar() { System.out.println("Retangulo.desenhar"); @Override public void aumentar(int t) { System.out.println("Retangulo.aumentar"); @Override public void pintar(int cor) { System.out.println("Retangulo.pintar"); Abril 2019 Programação III - Classes abstratas e interfaces 10

Interfaces Uma classe abstrata é pura quando: o Possui métodos abstratos; o Não possui métodos concretos; o Não possui atributos (não-static). Java oferece a palavra reservada interface: o Cria uma classe abstrata pura; o Chamaremos pelo nome de interface; o Ao conversar com outros programadores, cuidado para não confundir com interface com o usuário. Abril 2019 Programação III - Classes abstratas e interfaces 11

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); Abril 2019 Programação III - Classes abstratas e interfaces 12

Interfaces class Linha implements Forma { private double x1, y1, x2, y2; @Override public void desenhar() { /*... */ @Override public void aumentar(int t) { /*... */ Abril 2019 Programação III - Classes abstratas e interfaces 13

Tudo é público na interface Métodos definidos na interface são automaticamente públicos e abstratos; Exceção: default methods (Java 8) Atributos definidos na interface são automaticamente públicos e estáticos. interface Forma { int x = 10; void desenhar(); Definições equivalentes interface Forma { public static int x = 10; public abstract void desenhar(); Abril 2019 Programação III - Classes abstratas e interfaces 14

Por isso, cuidado com erros interface Forma { void desenhar(); void aumentar(int t); class Linha implements Forma { // Erro: reduziu de público para priv. ao pacote! void desenhar() { /*... */ // Erro: reduziu de público para privativo! private void aumentar(int t) { /*... */ Abril 2019 Programação III - Classes abstratas e interfaces 15

Motivação Texto não é forma, OK! Como fica o método que carrega meu desenho do arquivo que eu salvei no HD? Abril 2019 Programação III - Classes abstratas e interfaces 16

Não-solução 1 public class AplicativoDesenho { private static void desenhar(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); Texto não é forma! Esse método não serve Abril 2019 Programação III - Classes abstratas e interfaces 17

Não-solução 2 public class AplicativoDesenho { private static void desenhar(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); private static void desenhar(texto[] ts) { for (int i = 0; i < ts.length; i++) ts[i].escrever(); Já vimos, com polimorfismo, que essa não é a solução Abril 2019 Programação III - Classes abstratas e interfaces 18

Não-solução 3 Já sei! Abril 2019 Programação III - Classes abstratas e interfaces 19

Solução: interfaces Abril 2019 Programação III - Classes abstratas e interfaces 20

Solução: interfaces abstract class Forma implements Renderizavel { /*... */ @Override public void renderizar() { desenhar(); class Texto implements Renderizavel { /*... */ @Override public void renderizar() { escrever(); Abril 2019 Programação III - Classes abstratas e interfaces 21

Solução: interfaces (alternativa) interface Forma extends Renderizavel { /*... */ // As diferentes implementações de forma agora tem // que implementar renderizar() e não desenhar(). class Texto implements Renderizavel { /*... */ @Override public void renderizar() { escrever(); Abril 2019 Programação III - Classes abstratas e interfaces 22

Solução: interfaces O polimorfismo se amplia: mais um modo de referenciar uma forma: Renderizavel; AplicativoDesenho não precisa saber a classe real do objeto, apenas que ele implementa a interface; o Se implementa a interface, ele implementa o método renderizar()! Novas classes podem ser renderizáveis! public class AplicativoDesenho { private static void desenhar(renderizavel[] fs) { for (int i = 0; i < fs.length; i++) fs[i].renderizar(); Abril 2019 Programação III - Classes abstratas e interfaces 23

Interface = contrato Renderizavel define que todas as classes que a implementam saibam se renderizar() o que ; o A implementação define o como ; Define um contrato: quem desejar ser renderizável precisa saber se renderizar() ; o A classe que quiser, assina o contrato e se responsabiliza a cumpri-lo; Programe voltado a interfaces e não a implementações (mas sem exageros). Abril 2019 Programação III - Classes abstratas e interfaces 24

Herança múltipla em Java Pode isso, Arnaldo? Abril 2019 Programação III - Classes abstratas e interfaces 25

Herança múltipla em Java A regra é clara Abril 2019 Programação III - Classes abstratas e interfaces 26

Herança múltipla em Java class CaixaDeTexto extends Texto implements Forma { private Retangulo caixa; /*... */ public CaixaDeTexto() { // Parâmetros foram omitidos para simplificar... caixa = new Retangulo(); public void renderizar() { // Desenha a caixa. caixa.renderizar(); // Escreve o texto. escrever(); Abril 2019 Programação III - Classes abstratas e interfaces 27

A interface Comparable Um exemplo de interface na API Java é a interface Comparable; Define o método compareto(object obj): o Compara o objeto atual (this) com o objeto informado (obj); o Retorna 0 se this = obj; o Retorna um número negativo se this < obj; o Retorna um número positivo se this > obj. Métodos genéricos a utilizam para ordenar coleções de elementos. Abril 2019 Programação III - Classes abstratas e interfaces 28

A interface Comparable class Valor implements Comparable { int valor; public Valor(int v) { valor = v; @Override public int compareto(object obj) { return valor - ((Valor)obj).valor; @Override public String tostring() { return "" + valor; Abril 2019 Programação III - Classes abstratas e interfaces 29

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; Abril 2019 Programação III - Classes abstratas e interfaces 30

O mecanismo de RTTI

Polimorfismo e extensão Com polimorfismo, podemos esquecer a classe de um objeto e trabalhar com a superclasse: o A interface de ambas é a mesma; o 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! Abril 2019 Programação III - Classes abstratas e interfaces 32

Polimorfismo e extensão interface Animal { void comer(); class Cachorro implements Animal { @Override public void comer() { System.out.println("Comendo um osso..."); public void latir() { System.out.println("Au Au!"); Abril 2019 Programação III - Classes abstratas e interfaces 33

Polimorfismo e extensão class Gato implements Animal { @Override public void comer() { System.out.println("Comendo um peixe..."); public void miar() { System.out.println("Miau!"); Abril 2019 Programação III - Classes abstratas e interfaces 34

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(); #comofas? Abril 2019 Programação III - Classes abstratas e interfaces 35

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 Abril 2019 Programação III - Classes abstratas e interfaces 36

Upcast vs. downcast Ampliação é automática e livre de erros: o A classe base não pode possuir uma interface maior do que a classe derivada; o Não é necessário explicitar o upcast. Estreitamento é manual e pode causar erros: o A classe base pode ter várias subclasses e você está convertendo para a classe errada; o É necessário explicitar o downcast; o Pode lançar um erro (ClassCastException); o Pode haver perda de informação (tipos primitivos). Abril 2019 Programação III - Classes abstratas e interfaces 37

Upcast vs. downcast public class Teste { public static void main(string[] args) { Animal a = new Cachorro(); Cachorro c = (Cachorro)a; Upcast c.latir(); // Forma resumida: a = new Gato(); ((Gato)a).miar(); Downcast Abril 2019 Programação III - Classes abstratas e interfaces 38

RTTI: Run-Time Type Identification O mecanismo que verifica o tipo de um objeto em tempo de execução chama-se RTTI; RTTI = Run-Time Type Identification ou Identificaçã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 convertido para uma classe inválida: o Fora da hierarquia: erro de compilação; o Dentro da hierarquia: erro de execução. Abril 2019 Programação III - Classes abstratas e interfaces 39

RTTI: Run-Time Type Identification 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; Abril 2019 Programação III - Classes abstratas e interfaces 40

O operador instanceof O mecanismo de RTTI permite que você consulte se um objeto é de uma determinada classe; Operador instanceof: o Sintaxe: <objeto> instanceof <Classe> o Retorna true se o objeto for instância (direta ou indireta) da classe especificada; o Retorna false caso contrário. Abril 2019 Programação III - Classes abstratas e interfaces 41

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(); Abril 2019 Programação III - Classes abstratas e interfaces 42

O uso de instanceof deve ser raro Não é uma boa prática usar instanceof: o Use polimorfismo; o Use classes genéricas (veremos adiante). Use instanceof apenas quando não há outra solução. Abril 2019 Programação III - Classes abstratas e interfaces 43

Trocando instanceof por polimorfismo interface Animal { void comer(); void falar(); class Cachorro extends Animal { @Override public void comer() { /*... */ @Override public void falar() { /*... */ class Gato extends Animal { @Override public void comer() { /*... */ @Override public void falar() { /*... */ Abril 2019 Programação III - Classes abstratas e interfaces 44

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); Abril 2019 Programação III - Classes abstratas e interfaces 45

Exercitar é fundamental Apostila FJ-11 da Caelum Classes Abstratas: o Seção 9.6, página 121 (conta corrente); o Seção 9.7, página 123 (desafios); Apostila FJ-11 da Caelum Interfaces: o Seção 10.5, página 134 (formas, conta corrente); o Seção 10.6, página 138 (exercícios avançados); o Seção 10.7, página 139 (discussão). Abril 2019 Programação III - Classes abstratas e interfaces 46