Desenvolvimento OO com Java Herança, reescrita e polimorfismo

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

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

Capítulo 5 Reuso de Classes

Desenvolvimento OO com Java Classes abstratas e interfaces

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

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

[Desenvolvimento OO com Java] Classes abstratas e interfaces

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

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

Classes e Objetos. Sintaxe de classe em Java

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

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

Programação por Objectos. Java

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

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

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

Classe Abstrata e Interface

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

Linguagem de Programação III

Linguagem de Programação II Implementação

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

POO29004 Programação Orientada a Objetos

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

Programação Orientada a Objetos. Métodos e Atributos. Métodos. Métodos. Alexandre César Muniz de Oliveira. Parte III

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

Linguagem de Programação II Herança

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

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

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

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

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

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

Desenvolvimento Web TCC Turma A-1

AULA 8 Polimorfismo de: coerção, overloading, inclusão e paramétrico Prof. Dr. Fernando Henrique Campos

POO29004 Programação Orientada a Objetos

LÓGICA DE PROGRAMAÇÃO (JAVA) HERANÇA. Professor Carlos Muniz

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

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

4 Conceito de Herança

Programação Orientada a Objetos Flávio de Oliveira Silva 144

Interfaces POO. Prof. Marcio Delamaro

Implementando classes em C# Curso Técnico Integrado em Informática Fundamentos de Programação

Conceitos Básicos da Programação OO

Laboratório de programação II

Herança e Polimorfismo

Herança e Propriedades

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

Linguagem de Programação III

Linguagem de Programação II Programação Orientada a Objetos. Orientação a Objetos

Linguagens de Programação Aula 12

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

Linguagem de Programação. Diagrama de classes

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

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

Herança (parte 2) Redefinição de métodos AULA 11

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

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

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis

Palavras Reservadas da Linguagem Java

POO e C++: Herança e Polimorfismo

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Programação Orientada a Objetos JAVA - NETBEANS

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

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

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

Conceitos de Programação Orientada a Objetos

POO29004 Programação Orientada a Objetos

Esta categoria mais geral, à qual cada objeto pertence, denominamos de classe; IFSC/POO + JAVA - prof. Herval Daminelli

Programação Orientada a Objetos

Orientação a Objetos - Herança

Programação em Linguagem C++

extendsé usado para indicar herança em JAVA

Programação Orientada a Objetos. Aula 1.9 this e static. Prof. Bruno Moreno

Análise de Programação

Programação Orientada por Objetos

Programação Java. - Herança e Polimorfismo - Marco Fagundes Marco Fagundes -

Paradigmas de Linguagens de Programação. Suporte para Programação Orientada a Objeto

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

Linguagem de Programação IV Introdução

Transcrição:

Desenvolvimento OO com Java Herança, reescrita e polimorfismo Vítor E. Silva Souza (vitor.souza@ufes.br) http://www.inf.ufes.br/~vitorsouza Departamento de Informática Centro Tecnológico Universidade Federal do Espírito Santo

Licença para uso e distribuição Este obra está licenciada com uma licença Creative CommonsAtribuição-CompartilhaIgual4.0 Internacional; Você tem o direito de: Compartilhar: copiar e redistribuir o material em qualquer suporte ou formato Adaptar: remixar, transformar, e criar a partir do material para qualquer fim, mesmo que comercial. De acordo com os termos seguintes: Atribuição: você deve dar o crédito apropriado, prover um link para a licença e indicar se mudanças foram feitas. Você deve fazê-lo em qualquer circunstância razoável, mas de maneira alguma que sugira ao licenciante a apoiar você ou o seu uso; CompartilhaIgual: se você remixar, transformar, ou criar a partir do material, tem de distribuir as suas contribuições sob a mesma licença que o original. Mais informações podem ser encontradas em: http://creativecommons.org/licenses/by-sa/4.0/ Abril 2016 OO & Java - Herança, reescrita e polimorfismo 2

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; Interfaces; Exceções e controle de erros; 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 2016 OO & Java - Herança, reescrita e polimorfismo 3

Reuso / reutilização Para entregar software de qualidade em menos tempo, é preciso reutilizar; Copiar & colar não é reuso! Reuso é uma das principais vantagens anunciadas pela Orientação a Objetos; Mecanismo baseado no conceito de classes: Composição ( tem um ); Herança ou derivação ( é um ). Abril 2016 OO & Java - Herança, reescrita e polimorfismo 4

Composição Criação de uma nova classe usando classes existentes como atributos; Relacionamento tem um : uma conta tem um titular (cliente), um cliente tem um nome (string); Vimos como fazer isso anteriormente: Atributos primitivos e referências a objetos; Operadores de seleção; Inicialização (zerar e atribuir valor inicial); O valor null; Atributos estáticos. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 5

Herança Criação de novas classes derivando classes existentes; Relacionamento é um [subtipo de] : um livro é um produto, um administrador é um usuário; Uso da palavra-chave extends; A palavra-chave é sugestiva a classe que está sendo criada estende outra classe: Partindo do que já existe naquela classe... Pode adicionar novos recursos; Pode redefinir recursos existentes. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 6

Motivação Classes com elementos (atributos, métodos) repetidos: class Produto { String nome; double preco; Produto() { // Precisa? public Produto(String nome, double preco) { this.nome = nome; this.preco = preco; public boolean ehcaro() { return (preco > 100); // Eventuais outros métodos... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 7

Motivação Classes com elementos (atributos, métodos) repetidos: class Livro { String nome; double preco; String autor; int paginas; Não escreva assim, é só pra caber no slide! public Livro(String n, double p, String a, int pg) { nome = n; preco = p; autor = a; paginas = pg; public boolean ehcaro() { return (preco > 100); public boolean ehgrande() { return (paginas > 200); // Eventuais outros métodos... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 8

Motivação Código repetido = problema de manutenção; Se surge um novo tipo de produto? Se muda alguma coisa em todos os produtos? Colocar os atributos extras em Produto, porém só utilizá-los em objetos que representem livros? Solução confusa, desperdiça memória, ainda mais se a hierarquia crescer (CDs, DVDs, eletrônicos, etc.); Usar composição? Também causa confusão. Um livro tem um produto ou um livro é um produto? Solução OO: herança! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 9

Solução com herança Livro estende produto (adiciona novos membros): class Livro extends Produto { //private String nome; //private double preco; private String autor; private int paginas; // Não preciso repetir. // Herdo de Produto public Livro(String n, double p, String a, int pg) { nome = n; preco = p; autor = a; paginas = pg; // Também não preciso repetir: // public boolean ehcaro() { return (preco > 100); public boolean ehgrande() { return (paginas > 200); // Eventuais outros métodos... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 10

Herança em UML Um livro é um (tipo de) produto. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 11

Solução com herança Podemos chamar métodos do Produto no Livro: public class Loja { public static void main(string[] args) { Livro l = new Livro("Linguagens de Programação", 74.90, "Flávio Varejão", 334); System.out.println(l.ehCaro()); System.out.println(l.ehGrande()); Superclasse; Subclasse; Produto Classe base; Classe pai/mãe; Classe ancestral, etc. Livro Classe derivada; Classe filha; Classe descendente, etc. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 12

Java suporta herança simples Uma classe pode ter muitas subclases; Uma classe só pode ter uma superclasse. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 13

Java não suporta herança múltipla Abril 2016 OO & Java - Herança, reescrita e polimorfismo 14

Hierarquias de qualquer tamanho Abril 2016 OO & Java - Herança, reescrita e polimorfismo 15

Sintaxe Sintaxe: class Subclasse extends Superclasse { /*... */ Semântica: A subclasse herda todos os atributos e métodos que a superclasse possuir; Subclasse é uma derivação, um subtipo, uma extensão da superclasse. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 16

Subclasses herdam membros Livro possui autor e paginas (definidos na própria classe); Livro possui nome e preco (definidos na superclasse); Livro pode receber mensagens ehgrande() (definida na própria classe); Livro pode receber mensagens ehcaro() (definida na superclasse). E se nome e preco fossem definidos como privativos? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 17

Visibilidade dos atributos herdados Acesso privativo é só para a própria classe: class Produto { private String nome; private double preco; // Restante da classe... class Livro extends Produto { private String autor; private int paginas; public Livro(String n, double p, String a, int pg) { nome = n; preco = p; autor = a; paginas = pg; error: nome has private access in Produto // Restante da nome classe... = n; preco = p; autor = a; paginas = pg; ^ Abril 2016 OO & Java - Herança, reescrita e polimorfismo 18

Visibilidade dos atributos herdados Utilizamos o acesso protegido: class Produto { protected String nome; protected double preco; // Restante da classe... Atenção! O acesso protegido não deveria ser usado automaticamente junto com a herança. Faz sentido a filha acessar atributos da mãe? class Livro extends Produto { private String autor; private int paginas; public Livro(String n, double p, String a, int pg) { nome = n; preco = p; autor = a; paginas = pg; // Restante da classe... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 19

Relembrando modificadores de acesso Acesso Público Protegido Amigo Privado A própria classe Sim Sim Sim Sim Classe no mesmo pacote Sim Sim Sim Não Subclasse em pacote diferente Sim Sim Não Não Não-subclasse em pacote diferente Sim Não Não Não Abril 2016 OO & Java - Herança, reescrita e polimorfismo 20

Reescrita/sobrescrita de método Um método herdado pode não fazer total sentido: preco > 100 preco > 100? preco > 100? preco > 100? preco > 100? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 21

Reescrita/sobrescrita de método Um método herdado pode não fazer total sentido: public class Loja { public static void main(string[] args) { Eletronico tv = new Eletronico("TV 40 pol.", 200.0); // TV 40 pol. por R$ 200? Uma pechincha! System.out.println(tv.ehCaro()); // true (??) Abril 2016 OO & Java - Herança, reescrita e polimorfismo 22

Reescrita/sobrescrita de método Se um método herdado não satisfaz, podemos redefinilo (reescrevê-lo / sobrescrevê-lo): class Eletronico extends Produto { /* Definições anteriores... */ // Eletronicos acima de R$ 1.000,00 são caros! @Override public boolean ehcaro() { return (preco > 1000); Que @&#%$ é essa de @Override? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 23

Anotação @Override Palavras precedidas de "@" são anotações: Meta-dados úteis para o compilador ou algum outro componente da plataforma Java; @Override indica que o método deve sobrescrever um método herdado; Caso contrário (ex.: escrevemos o nome do método errado ou esquecemos um parâmetro), gera erro de compilação. Quanto mais cedo detectamos erros, melhor! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 24

Sobrescrita vs. sobrecarga Cuidado para não confundir: class Produto { /*... */ public void dardesconto(double valor) { return (preco > 100); class Livro extends Produto { public void dardesconto(int valor) { // Foi feita return (preco > 100); // sobregarga, // não sobrescrita! @Override aqui cairia bem... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 25

Sobrescrita vs. sobrecarga Cuidado para não confundir: class Produto { /*... */ public void dardesconto(double valor) { return (preco > 100); class Livro extends Produto { @Override public void dardesconto(int valor) { // Foi feita return (preco > 100); // sobregarga, // não sobrescrita! error: method does not override or implement a method from a supertype @Override ^ Abril 2016 OO & Java - Herança, reescrita e polimorfismo 26

Entendendo a sobrecarga Quando temos vários métodos com mesmo nome, dizemos que estamos sobrecarregando aquele nome; É útil para evitar redundâncias: lave o carro, lave a camisa, lave o cachorro ; lavecarro o carro, lavecamisa a camisa, lavecachorro o cachorro. Fizemos isso quando definimos mais de um construtor para nossa classe! Podemos usar este conceito para qualquer método. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 27

Distinção entre métodos sobrecarregados Como Java distingue entre dois métodos com o mesmo nome? Pelos tipos dos parâmetros! Já vimos que não podemos ter dois métodos com mesma assinatura, ou seja, mesmo nome e mesmos tipos de parâmetros; A ordem dos tipos de parâmetro influi: /* OK! */ long multiplicar(long x, int y) { /*... */ long multiplicar(int x, long y) { /*... */ Abril 2016 OO & Java - Herança, reescrita e polimorfismo 28

Perigos da sobrecarga Devemos ter cuidado ao usar sobrecarga em duas situações: Tipos primitivos numéricos, que podem ser convertidos; Classes que participam de uma hierarquia com polimorfismo. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 29

Sobrecarga de valor de retorno? O valor de retorno de um método não é incluído em sua assinatura. Por que? public class SobreRetorno { static int retorna10() { return 10; static double retorna10() { return 10.0; public static void main(string[] args) { int x = retorna10(); // OK! double d = retorna10(); // OK! // Qual método chamar? System.out.println(retorna10()); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 30

Chamando o método original Métodos sobrescritos podem chamar sua versão original na superclasse usando a palavra super: class Produto { /*... */ public void imprimir() { System.out.println(nome + "," + preco); class Livro extends Produto { /*... */ public void imprimir() { super.imprimir(); System.out.println(autor + "," + paginas); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 31

Chamando o construtor da superclasse Posso fazer o mesmo com construtores: public class Livro extends Produto { /*... */ public Livro(String nome, double preco, String autor, int paginas) { super(nome, preco); this.autor = autor; this.paginas = paginas; public class Produto { /*... */ public Produto(String nome, double preco) { this.nome = nome; this.preco = preco; É tipo o this(), só que no super()... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 32

Herança & construção de objetos Se um Livro é um Produto, para criarmos um livro precisamos antes criar um produto. class Produto { String nome; double preco; Produto() { System.out.println("Criando produto sem nome"); // Precisa? public Produto(String nome, double preco) { System.out.println("Criando produto: " + nome); this.nome = nome; this.preco = preco; // Restante da classe... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 33

Herança & construção de objetos Se um Livro é um Produto, para criarmos um livro precisamos antes criar um produto. class Livro extends Produto { private String autor; private int paginas; public Livro(String n, double p, String a, int pg) { System.out.println("Criando livro: " + n); nome = n; preco = p; autor = a; paginas = pg; // Restante da classe... Abril 2016 OO & Java - Herança, reescrita e polimorfismo 34

Herança & construção de objetos Se um Livro é um Produto, para criarmos um livro precisamos antes criar um produto. public class Loja { public static void main(string[] args) { Livro l = new Livro("Linguagens de Programação", 74.90, "Flávio Varejão", 334); // O que vai imprimir? Criando produto sem nome Criando livro: Linguagens de Programação Abril 2016 OO & Java - Herança, reescrita e polimorfismo 35

Herança & construção de objetos O construtor sem argumentos da classe base é chamado implicitamente: Livro l = new Livro("Linguagens de Programação", 74.90, "Flávio Varejão", 334); public Livro(String n, double p, String a, int pg) { // Chamada implícita: super(); System.out.println("Criando livro: " + n); nome = n; preco = p; autor = a; paginas = pg; Produto() { System.out.println("Criando produto sem nome"); // Precisa!!! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 36

Herança & construção de objetos E se o construtor sem argumentos não existir? class Produto { /*... */ public Produto(String nome, double preco) { this.nome = nome; this.preco = preco; class Livro extends Produto { /*... */ public Livro(String n, double p, String a, int pg) { nome = n; preco = p; autor = a; paginas = pg; error: constructor Produto in class Produto cannot be applied to given types; public Livro(String n, double p, String a, int pg) { ^ required: String,double found: no arguments reason: actual and formal argument lists differ in length Abril 2016 OO & Java - Herança, reescrita e polimorfismo 37

Lembre-se da regra do construtor default class Pessoa { private String nome; public Pessoa(String nome) { this.nome = nome; class Aluno extends Pessoa { // cannot find symbol // symbol : constructor Pessoa() // location: class Pessoa // class Aluno extends Pessoa { // ^ // 1 error Abril 2016 OO & Java - Herança, reescrita e polimorfismo 38

Lembre-se da regra do construtor default Aluno não define construtor: ganha um default; Pessoa define um construtor com parâmetro: não ganha construtor default; Construtor default tenta chamar construtor sem parâmetro na superclasse (Pessoa); Pessoa não possui construtor sem parâmetro! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 39

Lembre-se da regra do construtor default A solução é chamar o construtor explicitamente; Assim como this(), super() deve ser o primeiro comando do construtor. class Aluno extends Pessoa { public Aluno() { super("sem nome"); public Aluno(String nome) { super(nome); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 40

Composição vs. herança Use herança quando: Uma classe representa um subtipo de outra classe; Construção de famílias de tipos; Use com cuidado! Use composição quando: Uma classe representa algo que faz parte de outra; Prefira composição à herança. Os dois conceitos são utilizados em conjunto a todo momento! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 41

Composição vs. herança class Lista { public void adic(int pos, Object obj) { public Object obter(int pos) { public void remover(int pos) { // Uma pilha é uma lista? class Pilha1 extends Lista { // Ou uma pilha tem uma lista? class Pilha2 { private Lista elementos; public void empilha(object obj) { public Object desempilha() { Abril 2016 OO & Java - Herança, reescrita e polimorfismo 42

Regra de bolso do ocultamento De maneira geral: Atributos de uma classe devem ser privados; Se a classe possui filhas, atributos podem ser protegidos ou possuir métodos de acesso protegidos; Métodos que pertencem à interface devem ser públicos; Alguns métodos podem ser utilizados internamente e, portanto, serem privados ou protegidos. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 43

Vantagens da herança Suportar do desenvolvimento incremental; Classes já testadas podem ser reutilizadas; Economia de tempo. Relacionamento é um : Permite substituir a classe base por uma subclasse quando a primeira é esperada; Propriedade que chamamos de polimorfismo. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 44

Desenvolvimento OO com Java - Herança, reescrita e polimorfismo A PALAVRA-CHAVE FINAL Abril 2016 OO & Java - Herança, reescrita e polimorfismo 45

A palavra reservada final Significa Isto não pode ser mudado ; Dependendo do contexto, o efeito é levemente diferente; Pode ser usada em: Dados (atributos / variáveis locais); Métodos; Classes. Objetivos: Eficiência; Garantir propriedades de projeto. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 46

Dados finais Constantes são comuns em LPs; Constantes conhecidas em tempo de compilação podem adiantar cálculos; Constantes inicializadas em tempo de execução garantem que o valor não irá mudar. Em Java, utiliza-se a palavra final: public static final int MAX = 1000; private final String NOME = "Java"; final double RAD = Math.PI / 180; Abril 2016 OO & Java - Herança, reescrita e polimorfismo 47

Referência constante Um primitivo constante nunca muda de valor; Uma referência constante nunca muda, mas o objeto pode mudar internamente: public class Teste { public static final int MAX = 1000; private final Coordenada C = new Coordenada(); public static void main(string[] args) { // Erro: MAX = 2000; // Erro: C = new Coordenada(); C.x = 100; // OK, se x for público! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 48

Dados finais não inicializados class Viagem { class DadoFinalLivre { final int i = 0; // Final inicializado final int j; // Final não inicializado final Viagem p; // Referência final não inicializada // Finais DEVEM ser inicializados em // todos os construtores e somente neles DadoFinalLivre () { j = 1; p = new Viagem(); DadoFinalLivre (int x) { j = x; p = new Viagem(); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 49

Argumentos finais Um parâmetro de um método pode ser final: Dentro do método, funciona como constante. public class Teste { public void soimprimir(final int i) { // Erro: i++; System.out.println(i); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 50

Métodos finais Métodos finais não podem ser sobrescritos por uma subclasse; Chamada do método inline (maior eficiência). class Telefone { public final void discar() { // Não compila: discar() é final! class TelefoneCelular extends Telefone { public void discar() { Abril 2016 OO & Java - Herança, reescrita e polimorfismo 51

Métodos privados são finais Métodos privados não podem ser acessados; Portanto, são finais por natureza (as subclasses não têm acesso a ele). class Telefone { private final void checarrede() { // OK. São dois métodos diferentes! class TelefoneCelular extends Telefone { private final void checarrede() { Abril 2016 OO & Java - Herança, reescrita e polimorfismo 52

Classes finais Classes finais não podem ter subclasses; Por consequência, todos os métodos de uma classe final são automaticamente finais. class Telefone { final class TelefoneCelular extends Telefone { // Erro: TelefoneCelular é final! class TelefoneAtomico extends TelefoneCelular { Abril 2016 OO & Java - Herança, reescrita e polimorfismo 53

Desenvolvimento OO com Java - Herança, reescrita e polimorfismo POLIMORFISMO Abril 2016 OO & Java - Herança, reescrita e polimorfismo 54

Polimorfismo Do grego poli + morphos = múltiplas formas; Característica OO na qual se admite tratamento idêntico 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. Enviamos nossos produtos para todo o Brasil Será que envia DVDs também? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 55

Exemplo: um aplicativo de desenho Abril 2016 OO & Java - Herança, reescrita e polimorfismo 56

Exemplo: um aplicativo de desenho class Forma { public void desenhar() { // A substituir pela implementação oficial... System.out.println("Forma"); class Circulo extends Forma { public void desenhar() { System.out.println("Círculo"); class Quadrado extends Forma { /*... */ class Triangulo extends Forma { /*... */ Abril 2016 OO & Java - Herança, reescrita e polimorfismo 57

Exemplo: um aplicativo de desenho Duas questões sobre o método desenhar(): Ele tem que existir pra todos; Ele tem que fazer algo diferente para cada forma! public class AplicativoDesenho { private static void desenhar(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() ; desenhar(formas); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 58

Ampliação Ampliação (upcasting) é a conversão implícita de uma subclasse para uma superclasse: public class AplicativoDesenhoSimples { public static void desenhar(forma f) { f.desenhar(); public static void main(string[] args) { Circulo c = new Circulo(); desenhar(c); // Upcasting! Forma f = new Quadrado(); // Upcasting! Abril 2016 OO & Java - Herança, reescrita e polimorfismo 59

Incrementando o exemplo O compilador realmente não sabe qual é o tipo. Veja um exemplo com geração aleatória: public class AplicativoDesenhoAleatorio { public static void main(string[] args) { Forma f = null; switch((int)(math.random() * 3)) { case 0: f = new Circulo(); break; case 1: f = new Quadrado(); break; case 2: f = new Triangulo(); break; default: f = new Forma(); f.desenhar(); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 60

Esquecendo o tipo do objeto Quando realizamos ampliação, esquecemos o tipo 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? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 61

Métodos mais gerais Fazemos ampliação para escrevermos métodos mais gerais, para poupar tempo e esforço: class AplicativoDesenhoTosco { public static void desenhar(circulo c) { c.desenhar(); public static void desenhar(quadrado q) { q.desenhar(); public static void desenhar(triangulo t) { t.desenhar(); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 62

Amarração No entanto, se trabalhamos com Forma, como saber qual implementação executar quando chamamos um método? public class AplicativoDesenho { private static void desenhar(forma[] fs) { for (int i = 0; i < fs.length; i++) fs[i].desenhar(); fs[i] é do tipo Forma. Chamar sempre Forma.desenhar()? Abril 2016 OO & Java - Herança, reescrita e polimorfismo 63

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 tipo 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. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 64

Amarração tardia Abril 2016 OO & Java - Herança, reescrita e polimorfismo 65

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ática (pois ele não pode ser sobrescrito); Você não pode escolher quando usar um ou outro. É importante apenas entender o que acontece. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 66

Benefícios 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"); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 67

Benefícios do polimorfismo class Reta extends Forma { public void desenhar() { System.out.println("Reta"); public class AplicativoDesenhoSimples { public static void desenhar(forma f) { f.desenhar(); public static void main(string[] args) { Forma f = new Reta(); desenhar(f); Abril 2016 OO & Java - Herança, reescrita e polimorfismo 68

Benefícios 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. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 69

Desenvolvimento OO com Java - Herança, reescrita e polimorfismo A CLASSE OBJECT Abril 2016 OO & Java - Herança, reescrita e polimorfismo 70

A classe Object Em Java, todos os objetos participam de uma mesma hierarquia, com uma raiz única; Esta raiz é a classe java.lang.object. class Produto { /* É equivalente a: */ class Produto extends Object { Abril 2016 OO & Java - Herança, reescrita e polimorfismo 71

A classe Object Possui alguns métodos úteis: 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 é garantia); 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. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 72

O método tostring() tostring() é chamado sempre que: Tentamos imprimir um objeto; Tentamos concatená-lo com uma string. public class Loja { public static void main(string[] args) { Produto p = new Produto("CD", 30.0); System.out.println(p); // Resultado (tostring() herdado de Object): // Produto@10b62c9 Abril 2016 OO & Java - Herança, reescrita e polimorfismo 73

O método tostring() class Produto { /*... */ public String tostring() { return nome + " (R$ " + preco + ")"; public class Loja { public static void main(string[] args) { Produto p = new Produto("CD", 30.0); System.out.println(p); // Resultado (tostring() sobrescrito): // CD (R$ 30.0) Abril 2016 OO & Java - Herança, reescrita e polimorfismo 74

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. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 75

O método equals() class Valor { int i; public Valor(int i) { this.i = i; public class Teste { public static void main(string[] args) { int m = 100; int n = 100; System.out.println(m == n); // true Valor v = new Valor(100); Valor u = new Valor(100); System.out.println(v == u); // false Abril 2016 OO & Java - Herança, reescrita e polimorfismo 76

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 Abril 2016 OO & Java - Herança, reescrita e polimorfismo 77

O método equals() Compara dois objetos. Retorna true se forem iguais/equivalentes, 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á contido em outro, etc. Abril 2016 OO & Java - Herança, reescrita e polimorfismo 78

Exercitar é fundamental Apostila FJ-11 da Caelum: Seção 7.6, página 94 (discussão sobre herança); Seção 7.7, página 95 (conta corrente). Abril 2016 OO & Java - Herança, reescrita e polimorfismo 79

http://nemo.inf.ufes.br/