24
Herança, Polimorfismo e Herança, Polimorfismo e Classes Abstratas em Java Classes Abstratas em Java Disciplina: Programação Orientada a Disciplina: Programação Orientada a Objetos Objetos Prof. Ricardo Satoshi Oyakawa Prof. Ricardo Satoshi Oyakawa

Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

Embed Size (px)

Citation preview

Page 1: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

Herança, Polimorfismo e Herança, Polimorfismo e Classes Abstratas em JavaClasses Abstratas em Java

Disciplina: Programação Orientada a ObjetosDisciplina: Programação Orientada a Objetos

Prof. Ricardo Satoshi OyakawaProf. Ricardo Satoshi Oyakawa

Page 2: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

2

Herança em JavaHerança em Java

O que torna a Orientação a Objetos única é o conceito de herança.Herança é um mecanismo que permite que características comuns a diversas classes sejam fatoradas de uma classe base, ou superclasse. A partir de uma classe base, outras classes podem ser especificadas. Cada classe derivada ou subclasse apresenta as características (estrutura e métodos) da superclasse e acrescenta a elas o que for definido de particularidade para ela.

Page 3: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

3

Herança em JavaHerança em Java

Sintaxe: [modificador] class NomeDaSuperclasse { // corpo da superclasse... } [modificador] class NomeDaSubclasse extends

NomeDaSuperclasse { // corpo da subclasse... }

extends - indica que está sendo criada uma nova classe que deriva de uma classe existenteClasse existente - superclasse, classe base ou classe progenitoraNova classe - subclasse, classe derivada ou classe filha Em geral, as subclasses têm mais funcionalidade que sua superclasse.

Page 4: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

4

Exemplo de HerançaExemplo de Herança (Superclasse-Empregado.java)(Superclasse-Empregado.java)

import java.text.*;public class Empregado {

private String nome; private double salario;

public Empregado (String n, double s){ nome = n; salario = s; } public void imprimir (){ System.out.println(nome + " " + formatarMoeda()); }

Page 5: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

5

Exemplo de Herança Exemplo de Herança (Superclasse-Empregado.java)(Superclasse-Empregado.java)

public void aumentarSalario (double porPercentual){ salario *= 1 + porPercentual / 100; } public String formatarMoeda (){ NumberFormat nf = NumberFormat.getCurrencyInstance(); nf.setMinimumFractionDigits (2); String formatoMoeda = String.valueOf(nf.format(salario)); return formatoMoeda; }

Page 6: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

6

Exemplo de Herança Exemplo de Herança (Superclasse-Empregado.java)(Superclasse-Empregado.java)

public static void main (String args []){ Empregado [] e = new Empregado [3]; e[0] = new Empregado ("Harry Hacker", 3500); e[1] = new Empregado ("Carl Cracker", 7500); e[2] = new Empregado ("Tony Tester", 3800); int i; for (i = 0; i < 3; i++) e[i].imprimir(); System.out.println("******************************"); for (i = 0; i < 3; i++){ e[i].aumentarSalario(10); e[i].imprimir(); } }}

}

Page 7: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

7

Exemplo de Herança Exemplo de Herança (Subclasse-Gerente.java)(Subclasse-Gerente.java)

import java.text.*;public class Gerente extends Empregado {

private String nomeSecretaria; public Gerente (String n, double s){ super (n, s); nomeSecretaria =" "; } public void aumentarSalario (double porPercentual){ //adiciona bonus de 20% ao valor do salario double bonus = 20; super.aumentarSalario(porPercentual + bonus); }

Page 8: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

8

Exemplo de HerançaExemplo de Herança(Subclasse-Gerente.java)(Subclasse-Gerente.java)

public String getNomeSecretaria (){ return nomeSecretaria; } public void setNomeSecretaria (String nome){ nomeSecretaria = nome; } }

Page 9: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

9

Exemplo de HerançaExemplo de Herança

Palavra-chave super refere-se a uma superclasse indica a chamada ao construtor da superclasse se a superclasse não contiver o construtor padrão e o

construtor da subclasse não chamar nenhum outro construtor da superclasse explicitamente compilador java vai informar um erro

Em um relacionamento de herança: é necessário apenas indicar as diferenças entre a

subclasse e superclasse o reuso é automático é necessário redefinir métodos um dos primeiros

motivos para usar herança

Page 10: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

10

Exemplo de HerançaExemplo de Herança

Exemplo da subclasse Gerente: redefinição do método aumentarSalario ( )

para que ele funcione diferente para gerentes e empregados comuns esse método não tem acesso direto às variáveis de instância

privados da superclasse, ou seja, esse método não pode alterar diretamente a variável de instância salario, embora cada objeto Gerente tenha uma variável de instância salario

somente os métodos da classe Empregado têm acesso aos atributos de instância privados

Resultado dessa redefinição para objetos da classe Gerente: Quando se dá a todos os empregados um aumento de 5%, os gerentes

vão receber um aumento maior automaticamente

Page 11: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

11

Exemplo de Herança Exemplo de Herança (Classe Principal-GerenteTeste.java)(Classe Principal-GerenteTeste.java)

public class GerenteTeste { public static void main (String args[]){ Gerente g = new Gerente ("Carl Cracker", 7500); g.setNomeSecretaria ("Harry Hacker"); Empregado [] e = new Empregado [3]; e[0] = g; e[1] = new Empregado ("Harry Hacker", 3500); e[2] = new Empregado ("Tony Tester", 3800); int i; for (i = 0; i < 3; i++) e[i].aumentarSalario(10); for (i = 0; i < 3; i++) e[i].imprimir(); System.out.println("O nome da secretaria do departamento e: " +g.getNomeSecretaria()); }}

Page 12: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

12

SubclassesSubclasses

Para saber se a herança é adequada para um programa ter em mente que qualquer objeto que seja uma instância de uma

subclasse precisa ser utilizável no lugar de um objeto que seja uma instância de superclasse

objetos de subclasse são utilizáveis em qualquer código que use a superclasse

um objeto de subclasse pode ser passado como argumento para qualquer método que espera um parâmetro de superclasse

um objeto de superclasse não pode geralemente ser atribuído a um objeto de subclasseg = e[i]; //erro

Os atributos só podem ser adicionados, e não removidos, os objetos de uma subclasse herdados têm, pelo menos, tantos atributos de dados quanto os objetos de superclasse

Page 13: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

13

Recomendações de Projeto Recomendações de Projeto para Herançapara Herança

1. Coloque métodos e atributos comuns na superclasse2. Use herança para modelar uma relação de “estar contido em” (um

objeto da subclasse é um (a) objeto da superclasse)Exemplo: classe Empreiteiro

3. Não use herança a menos que todos os métodos herdados façam sentido

Exemplo: classe Feriadoclass Feriado extends Day { . . .} - Um dos métodos públicos da classe Day é avancarData ( ), que permite

transformar dias feriados em dias normais, de modo que não é um método apropriado para se fazer com dias feriados.

Feriado natal; natal.avancarData(10); // neste caso, um feriado é um dia mas

não um Day (objeto)

Page 14: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

14

Recomendações de Projeto Recomendações de Projeto para Herançapara Herança

4. Use polimorfismo, não informação de tipo- Sempre que você encontrar código do tipo

if (x é o tipo 1) acao1(x);else if (x é o tipo 2) acao2(x);

- Pense em Polimorfismo - acao1 e acao2 representam um conceito comum? Caso

afirmativo, faça o conceito virar um método de uma superclasse. Assim poderá simplesmente chamar:

x.acao( );- o ponto a ser obervado aqui é que o código para usar métodos

polimórficos é muito mais fácil de se manter e estender que um código que use múltiplos testes de tipos de dados.

Page 15: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

15

PolimorfismoPolimorfismoComunicação entre objetos: envio de mensagens ao enviar uma mensagem que pede para uma subclasse aplicar um

método usando certos parâmetros a subclasse verifica se ela tem ou não um método com esse

nome e com exatamente os mesmos parâmetros. Se tiver, usa-o. caso contrário: a superclasse torna-se responsável pelo

processamento da mensagem e procura por um método com esse nome e esses parâmetros. Se encontrar, chama esse método.

Uma das regras fundamentais da herança: um método definido em uma subclasse com o mesmo nome e mesma

lista de parâmetros que um método em uma de suas classes antecessoras oculta o método da classe ancestral a partir da subclasse

Page 16: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

16

PolimorfismoPolimorfismoExemplo: o método aumentarSalario () da classe Gerente é chamado

em vez do método aumentarSalario () da classe Empregado quando se envia uma mensagem aumentarSalario ao objeto Gerente

Polimorfismo: é a capacidade de um objeto decidir que método aplicar a si mesmo. embora a mensagem possa ser a mesma - os objetos podem responder

diferentemente aplicado a qualquer método que seja herdado de uma superclasse

Page 17: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

17

PolimorfismoPolimorfismo

a chave para fazer polimorfismo: ligação tardia (late binding) ou ligação dinâmica:

o compilador não gera o código para chamar um método em tempo de compilação

em vez disso, cada vez que se aplica um método a um objeto, o compilador gera código para calcular que método deve ser chamado, usando informações de tipo do objeto

o mecanismo de chamada de método tradicional é chamado ligação estática: determinada em tempo de compilação

Page 18: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

18

Classes AbstratasClasses AbstratasAo subir na hierarquia de heranças, as classes se tornam mais genéricas e, provavelmente mais abstratasEm algum ponto, a classe ancestral se torna tão geral que acaba sendo vista mais como um modelo para outras classes do que uma classe com instâncias específicas que são usadasUma classe abstrata não pode ser instanciada, ou seja, não há objetos que possam ser construídos diretamente de sua definição. Classes abstratas correpondem a especificações genéricas, que deverão ser concretizadas em classes derivadas (subclasses).Sintaxe:abstract class NomeDaSuperclasse { // corpo da classe abstrata... }

Page 19: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

19

Classes AbstratasClasses Abstratas

Exemplo: Sistema de mensagens eletrônicas que integre e-mail, fax e correio de

voz Seguindo os princípios OO o programa vai precisar de classes como MensagemTexto, MensagemVoz e MensagemFax

Mensagem

MensagemTexto MensagemVoz MensagemFax

Page 20: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

20

Classes AbstratasClasses Abstratas

Por que se preocupar com um nível tão alto de abstração? Tornar o projeto das classes mais claro Uma das chaves da POO é entender como combinar e reunir operações

comuns num nível mais alto na hierarquia de herança Por exemplo: todas as mensagens têm um método comum denominado

enviar ( ) é fácil perceber como reproduzir uma mensagem de voz enviando-a ao alto

falante, ou uma mensagem de texto exibindo-a em uma janela de texto, ou uma mensagem de fax imprimindo-a ou mostrando-a em uma janela gráfica

Page 21: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

21

Classes e Métodos AbstratosClasses e Métodos Abstratos

Como implementar o método enviar ( ) na superclasse Mensagem? A resposta é que não se pode Em Java, usa-se a palavra-chave abstract para indicar

que um método não pode ser especificado nessa classe. Para aumentar a clareza, uma classe com um ou mais métodos abstratos precisa, ela mesma, ser declarada abstrata

public abstract class Mensagem { … public abstract void enviar ( );}

Page 22: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

22

Classes e Métodos AbstratosClasses e Métodos Abstratos

Além dos métodos abstratos, as classes abstratas podem ter dados e métodos concretos

Por exemplo, a classe Mensagem pode armazenar o remetente da mensagem e ter um método concreto que retorne o nome do remetente

public abstract class Mensagem { private String remetente; public Mensagem (String r) { remetente = r;} public abstract void enviar ( ); public String getRemetente( ) { return remetente;}}

}

Page 23: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

23

Classes e Métodos AbstratosClasses e Métodos Abstratos

Um método abstrato promete que todos os descendentes não abstratos dessa classe abstrata irão implementar esse método abstrato

Os métodos abstratos funcionam como uma espécie de guardador de lugar para métodos que serão posteriormente implementados nas subclasses

Uma classe pode ser declarada como abstrata mesmo sem ter métodos abstratos

Page 24: Herança, Polimorfismo e Classes Abstratas em Java Disciplina: Programação Orientada a Objetos Prof. Ricardo Satoshi Oyakawa

24

Classes e Métodos AbstratosClasses e Métodos Abstratos

public class MensagemTexto extends Mensagem { private String texto; public MensagemTexto(String r, String t) { super (r); texto = t;} public void enviar ( ){ System.out.println(texto); }}

- Observe que foi preciso fornecer somente uma definição concreta do método abstrato enviar( ) na classe MensagemTexto