Programação Orientada por Objetosnfreire/POO 2 - Herança... · 2016-02-29 · public double...
Transcript of Programação Orientada por Objetosnfreire/POO 2 - Herança... · 2016-02-29 · public double...
Nelson Freire (ISEP–DEI-PPROG 2015/16) 1/72
Programação Orientada por ObjetosHerança de Classes
Polimorfismo
Classes Abstratas
(Livro Big Java, Late Objects – Capítulo 9)
Paradigmas da ProgramaçãoPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 2/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 3/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 4/72
Mecanismos de Reutilização de Código
Interesse
Tipos de Mecanismos
SumárioReutilização de Código
Nelson Freire (ISEP–DEI-PPROG 2015/16) 5/72
Redução do esforço de programação redução dos custos de produção de software
Uma das vantagens da POO
Como?
Programa novo obtido programando
Não todo o programa
Apenas uma pequena parte nova sobre código existente (reutilização)
Concretamente
Baseada na construção de classes novas a partir de classes existentes
Código Existente
Código Novo
ProgramaNovo
Interesse dos Mecanismos de Reutilização de CódigoReutilização de Código
Nelson Freire (ISEP–DEI-PPROG 2015/16) 6/72
Composição
Permite criar uma classe composta por outras classes (CA)
Classes agregadas (CA) estão ao mesmo nível
Herança
Permite criar uma classe que herda (acrescenta) outras classes
Classes herdadas (CH) estão em níveis diferentes
CA1 CA2Classe
Nova (CN)
CN contém CA1 e CA2
Classe Nova (CN)
CH2CH1
CN contém CH2 contém CH1
CH1
CH2
CA1 CA2
Tipos de Mecanismos de Reutilização de CódigoReutilização de Código
Nelson Freire (ISEP–DEI-PPROG 2015/16) 7/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 8/72
Noções Básicas
Noção de Herança de Classes
Superclasse e Subclasse de uma Classe
Relacionamento É-UM
Hierarquia de Classes Hierarquia de Especialização
Herança Transitiva
Tipos de Herança em POO Simples Múltipla
Java Hierarquia Simples
Classe Object
Declaração de uma Subclasse
Tipos de Membros de uma Subclasse Membros Herdados
Acessíveis Inacessíveis
Membros Locais Definidos Redefinidos (ou Reescritos)
Sumário
Java (continuação)
Referência super Acesso a Membros Reescritos Distinguir Métodos Locais de
Métodos Herdados
Invocação super() Acesso a Construtores da
Superclasse
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 9/72
Mecanismo
Permite criar uma nova classe por herança (ou extensão) de uma classe existente // 1 em Java
Nova classe
Herda membros de instância de uma classe existente
Variáveis de Instância
Métodos de Instância
Acrescenta novos membros particulares
Exemplo
Exemplos de características
Comuns de pessoas: nome e data de nascimento
Específicas de trabalhador: salário e empresa
Pessoa
Trabalhador
Características comuns de pessoas
Características: comuns de pessoas + específicas de trabalhador
Classe Existente
Nova Classe
Noção de HerançaHerança
Classe Existente
Nova Classe Membros de instância de uma classe existente + Membros Novos
Nelson Freire (ISEP–DEI-PPROG 2015/16) 10/72
Exemplo
Subclasse da classe A
Classe que herda a classe A // classe derivada de A
Mais específica do que A
i.e., é uma especialização de A // contém mais membros: métodos e/ou variáveis
Exemplo
Classe Trabalhador herda classe Pessoa
Superclasse da classe B
Classe herdada pela classe B
Mais genérica do que B // contém menos membros: métodos e/ou variáveis
Exemplo
Classe Pessoa é herdada pela classe Trabalhador
Superclasse e Subclasse de uma Classe
A
B
Superclasse de B
Subclasse de A + Específica
+ Genérica
GeneralizaçãoEspecialização
Pessoa
Trabalhador
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 11/72
Tipo de Relacionamento entre
Superclasse
Suas subclasses
Exemplo
Trabalhador é uma Pessoa
Interesse
Determinar o uso do mecanismo de herança
Relacionamento É-UM(A) (IS-A)
Pessoa
Trabalhador
Superclasse
Subclasse
É-UMA
+ Específica
+ Genérica
GeneralizaçãoEspecialização
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 12/72
Noção
Estrutura de classes organizadas em diferentes níveis
Construção permitida pelo mecanismo da herança
Classes
Níveis inferiores: subclasses
Níveis superiores: superclasses
Superclasses e Subclasses podem ser
Diretas // nível imediato
Indiretas
A
E GF
Hierarquia de Classes (Simples)
Superclasse de todas as subclassesSuperclasse direta de B, C e D
D é superclasse directa de F e G Subclasse direta de A
F/G: subclasses diretas de D e indiretas de A
B C D
Hierarquia de Classes 1/3Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 13/72
Hierarquia de Especialização de Classes
Qualquer subclasse é uma especialização das suas superclasses
Topo da hierarquia: classe mais genérica // membros comuns a todas as subclasses
Base da hierarquia: classes mais específicas // membros particulares
Sentido Topo Base
Há especialização de classes
A
E GF
+ Genérica
+ Específicas
Hierarquia de Classes (Simples)
EspecializaçãoB C D
Hierarquia de Classes 2/3Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 14/72
Exemplo de uma hierarquia de classes de uma aplicação sobre contas bancárias As subclasses são especializações da superclasse Conta (classe genérica)
Superclasse Conta: possui variáveis e métodos comuns a todos os tipos de contas Subclasses: acrescentam variáveis e métodos específicos
Declaração de atributo sublinhadosignifica atributo de classe (static)
Hierarquia de Classes 3/3Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 15/72
Noção
Herança acima da superclasse direta
Uma classe herda membros de instância
Da sua superclasse
Esta, por sua vez, herda da sua superclasse
E, assim sucessivamente, até ao topo da hierarquia
Exemplo
F herda de A, porque herda de D e esta, por sua vez, herda de A
Herança Transitiva
Herança Transitiva
A
F
D Herda diretamente de A
Herda diretamente de D e indiretamente de A
Herança Transitiva
Legenda:indiretadireta
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 16/72
Tipos de Herança em POO (Programação Orientada por Objetos )
Simples
Múltipla
Herança Simples
Uma classe apenas pode herdar diretamente de outra classe
Java
Única permitida em hierarquias de classes
Herança Múltipla
Uma classe pode herdar diretamente de múltiplas classes
Exemplo
Classe Z
Permitida pelo C++
Java
Não permite em hierarquias de classes
Permite em hierarquias de interfaces
Tipos de Herança em POO
A
GF
B C D
E
Herança Simples
X
VU
Y
Z
W
T
Herança Múltipla
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 17/72
Classe Java mais Genérica
Está no topo de todas as hierarquias de classes Java
Superclasse de todas as classes
Qualquer classe em Java é subclasse, pelo menos, de Object
Membros
Comuns a todas as classes Java
Interessam a todas as classes
Exemplos de Métodos
toString
equals
Nome Object
Objeto ... é característica comum a todas as classes
Hierarquia de Classes Java
Object
Trabalhador
Pessoa Carro
Herança Classe Object
Nelson Freire (ISEP–DEI-PPROG 2015/16) 18/72
Sintaxe
[...] = opcional
modificador de acesso public private protected sem modificador = package
• final
Classe não pode ser herdada
É considerada classe completa
Não há especializações
Exemplo
Classe String
Exemplo
public class Trabalhador extends Pessoa { ... }
Declaração de uma Subclasse
public final class String ... { ... }
public class SubString extends String { ... }
Pessoa
Trabalhador ...
Herança
[modificador de acesso] [final] class subclasse extends superclasse { ... }
Nelson Freire (ISEP–DEI-PPROG 2015/16) 19/72
Em Java
Qualquer classe herda código
Pelo menos da classe Object
Então, relativamente à Herança, qualquer classe tem dois tipos de membros
Herdados
Locais
Membros Herdados
Definidos nas suas superclasses
Membros Locais
Definidos na própria classe
Tipos de Membros de ClassesHerança
Classe
Membros Herdados
Membros Locais
Nelson Freire (ISEP–DEI-PPROG 2015/16) 20/72
Definição
Membros de instância definidos nas superclasses de uma classe (até à classe Object)
Apenas, variáveis e métodos de instância
Membros não Herdados
Membros de classe // variáveis e métodos de classe
Mas podem estar acessíveis // p. ex., os métodos de classe públicos
Construtores
Porque não são membros de uma classe
Mas podem estar acessíveis
Através da invocação super() // abordada mais adiante
Membros Herdados 1/3Herança
Membros Herdados
Variáveis de Instância
Membros Locais
Métodos de Instância
Classe
Nelson Freire (ISEP–DEI-PPROG 2015/16) 21/72
Relativamente ao acesso, podem ser
Acessíveis
Inacessíveis
Acesso depende (em Java)
Package da sua classe
Nível de acesso (visibilidade)
public // acessível
protected // acessível
package (sem modificador) // acessível se classe pertencer à package da superclasse (direta)
private // inacessível
Membros Herdados 2/3Herança
Membros Herdados
Variáveis de Instância• Inacessíveis
(sendo privados)
Membros Locais
Métodos de Instância• Acessíveis• Inacessíveis
Classe
Nelson Freire (ISEP–DEI-PPROG 2015/16) 22/72
Membros Herdados 3/3
Conceitos diferentes: herdar e aceder
Um membro pode ser herdado ....... mas pode não estar acessível à subclasse
Exemplo: método de instância privado
Um membro pode estar acessível ... e não ser herdado
Exemplo: membros de classe públicos
Para simplificar a programação
Podemos considerar herdado o que está acessível
Herança
Membros Herdados
Variáveis de Instância• Inacessíveis
(sendo privados)
Membros Locais
Métodos de Instância• Acessíveis• Inacessíveis
Classe
Nelson Freire (ISEP–DEI-PPROG 2015/16) 23/72
Definição
Membros especificados na própria classe
Variáveis
Instância
Classe
Métodos
Instância
Classe
Relativamente à definição, podem ser
Definidos
Redefinidos (Override ou Reescritos)
Membros Locais 1/8Herança
Variáveis de Classe
Membros Locais
Variáveis de Instância
Membros Herdados
Métodos de Instância• Definidos• Redefinidos
Métodos de Classe• Definidos• Redefinidos
Variáveis de Classe
Classe
Nelson Freire (ISEP–DEI-PPROG 2015/16) 24/72
Membros Locais Definidos
Cujas definições residem apenas na própria classe
Definições inexistentes nas suas superclasses
Membros Locais Redefinidos
São redefinições de membros das superclasses
Interesse Quando os membros de superclasses não são apropriados
para uma subclasse
Exemplo Método toString() herdado, pelo menos, da classe
Object
Suportado pelo Mecanismo da Sobreposição (Overriding)
Mais pormenores nos próximos slides
Membros Locais 2/8Herança
Classe X
Classe Ymetodo() Definido
Membro Local Definido
Classe Xmetodo1()
Classe Ymetodo1()metodo2()
Definido
Redefinido
Definido
Membro Local Reescrito
Nelson Freire (ISEP–DEI-PPROG 2015/16) 25/72
Membros Locais 3/8
Requisitos de Método Redefinido (1/5)
Assinatura
Igual ao do método definido
i.e, mesmo nome e mesma lista de tipos de parâmetros
Exemplo
Classe A
private static int metodo1(long x, String s)
public static Pessoa metodo2(int x, float y)
public double metodo3(String s)
Classe B
public static int metodo1(long a, String b)
public static Trabalhador metodo2(int z, float w)
public double metodo3(String s)
Definidos
Redefinidos
SuperclassePessoa
SubclasseTrabalhador
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 26/72
Membros Locais 4/8
Requisitos de Método Redefinido (2/5)
Tipo de retorno
Depende da visibilidade (nível de acesso) do método definido
Inacessível Pode ser qualquer tipo
Acessível Desde Java 5, também pode ser qualquer subtipo (subclasse) do tipo de retorno da
definição do método Tipos de retorno primitivos, definido e redefinido, têm de ser iguais
Exemplos
Herança
Classe A
private static int metodo1(long x, String s)
public static Pessoa metodo2(int x, float y)
public double metodo3(String s)
Classe B
public static long metodo1(long a, String b)
public static Trabalhador metodo2(int z, float w)
public double metodo3(String s)
Definidos
Redefinidos
SuperclassePessoa
SubclasseTrabalhador
Nelson Freire (ISEP–DEI-PPROG 2015/16) 27/72
Membros Locais 5/8
Requisitos de Método Redefinido (3/5)
Nível de acesso (visibilidade)
Depende da visibilidade do método definido
Inacessível
Método redefinido pode especificar qualquer nível de acesso
Acessível
Regra geral
Método redefinido não pode diminuir o nível de acesso do método definido
Exemplo
Slide seguinte
Método Definido Método Redefinido
public public
protected protected ou public
package qualquer, excepto private
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 28/72
Membros Locais 6/8
Requisitos de Método Redefinido (4/5)
Nível de acesso (visibilidade)
Exemplo
Classe Aprivate static int metodo1(long x, String s)
public static Pessoa metodo2(int x, float y)
protected int metodo4(String s)
Classe Bpublic static int metodo1(long a, String b)
public static Trabalhador metodo2(int z, float w)
public int metodo4(String s)
Definidos
Redefinidos
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 29/72
Requisitos de Método Redefinido (5/5)
Métodos declarados final
Não podem ser redefinidos
Exemplo
Membros Locais 7/8
Classe A...public final int metodo_X(long x){ ...}
public static final String metodo_Y() { ... }...
Classe B...public final int metodo_X(long x){ ...}
public static final String metodo_Y() { ... }...
Métodos Definidos
Métodos Redefinidos
Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 30/72
Variável Redefinida (classe/instância)
Definição
Variável com o mesmo nome de variável definida nas suas superclasses
Definição local
Esconde (hidden) a definição da variável acessível
Irrelevante para variáveis privadas
Membros Locais 8/8Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 31/72
Definição
Referência da superclasse (direta) da classe da instância-recetora de uma mensagem
Interesse
Invocar um membro de instância herdado e acessível da superclasse direta
Particularmente útil para acesso a métodos que foram sobrepostos
Exemplo
super.toString() // invoca método toString() da superclasse
super não se deveaplicar a variáveis e métodos de classe
Referência super 1/2Herança
public class Trabalhador extends Pessoa {
private double salario;private String empresa;...
public String toString () { // baseado no toString() da superclasse
return String.format("%s Salário:%s, Empresa:%s", super.toString(), salario, empresa);
}...
}
Nelson Freire (ISEP–DEI-PPROG 2015/16) 32/72
Não pode ser usada de forma encadeada
Exemplo
super.super.metodo(); // expressão ilegal
Outro interesse de super
Distinguir dois tipos de métodos de instância
Herdados da superclasse direta // com prefixo super
Locais da classe // sem prefixo super
Referência super 2/2Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 33/72
Sintaxe
super(lista_parâmetros); // lista pode ser vazia
Interesse
Acesso aos construtores da superclasse (direta) para inicialização das suas variáveis de instância
Uso
Só em construtores
Obrigatoriamente a 1ª instrução do construtor
Exemplo
Invocação super() 1/2Herança
public class Trabalhador extends Pessoa {
// variável de instância local (própria)
private double salario;
// construtor
public Trabalhador( String nome, double salario) {
super( nome ); // garante inicialização das variáveis de instância da superclasse
this.salario = salario;}
}
Nelson Freire (ISEP–DEI-PPROG 2015/16) 34/72
Quando não é declarado
Compilador adiciona automaticamente super() aos construtores // super sem parâmetros
Criação de instância de subclasse
Obriga chamada em cadeia dos construtores de todas as suas superclasses
Invocação super() 2/2Herança
Nelson Freire (ISEP–DEI-PPROG 2015/16) 35/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 36/72
Classe é Tipo de Dados
Tipo Referência
Tipo e Subtipo Referência
Tipo Referência
Estático
Dinâmico
Conversão de Tipos Referência
Tipos Referência Compatíveis
Tipos de Conversão
Upcasting
Downcasting
Tipos Referência da mesma Variável
Um Estático
Múltiplos Dinâmicos
SumárioPolimorfismo
Procura de Métodos
Tipos de Procura
Estática
Dinâmica
Determinação do Tipo Dinâmico de uma Variável
Operador instanceof
Noção de Polimorfismo
Programação Genérica
Vantagens
Classe Object
Mecanismo de Sobreposição de Métodos (Overriding)
Nelson Freire (ISEP–DEI-PPROG 2015/16) 37/72
Classe é também Tipo de Dados
Tipo referência
Variável deste tipo guarda referência de instância // referência = endereço de memória
Exemplo
Pessoa p = new Pessoa("Nico");
Classe Pessoa especifica tipo da variável p
Variável p guarda referência de instância Pessoa
Porque define
Conjunto de instâncias que podem ser atribuídas a variável // instâncias: dados de programa
Conjunto de operações sobre essas instâncias // operações: métodos instância
Classe é Tipo de DadosPolimorfismo
RAM
...
referência
...
p
...
Nico
Instância Heap
Stack
atributo N
Nelson Freire (ISEP–DEI-PPROG 2015/16) 38/72
Tipo Referência
Especificado por
Classe
Interface // próxima aula
Subtipo de Tipo Referência
Tipo especificado por classe
Tipo de uma subclasse
Exemplo
Trabalhador é subtipo de Pessoa
Tipo e Subtipo ReferênciaPolimorfismo
Pessoa
Trabalhador
Tipo
Pessoa
Tipo
Trabalhador
Superclasse
SubclasseSubtipo de
Pessoa
Tipo e Subtipo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 39/72
Tipo Referência
Estático
Dinâmico
Tipo Estático
Considerado pelo compilador
Tempo de compilação (compile-time) // tradução do código fonte para código executável
Tempo de programação no Netbeans // verificação sintática do programa fonte
Tipo declarado
Exemplo
Tipo Dinâmico
Considerado em tempo de execução (run-time)
Exemplo
Tipo Estático e Tipo DinâmicoPolimorfismo
Pessoa p; // tipo estático da variável p = Pessoa // tipo declarado
p = new Pessoa(); // tipo dinâmico da variável p = Pessoa
p = new Trabalhador(); // tipo dinâmico da variável p = Trabalhador
Nelson Freire (ISEP–DEI-PPROG 2015/16) 40/72
Requisito
Tipos compatíveis // (tipo_2) tipo _1 tipo_1 e tipo_2 compatíveis
Tipos Referência Compatíveis
Tipos // Ex: tipo Pessoa
Respetivos Subtipos // Ex: subtipo Trabalhador Mesmo ramo da hierarquia
Variável
Tipo // Pessoa p1, p2 = new Pessoa(), p3 = new Pessoa();
Pode guardar objetos de subtipos // p1 = new Trabalhador();
Subtipo // Trabalhador t;
Pode guardar objetos do tipo // t = (Trabalhador) p2;
Justificação
Possuem métodos semelhantes // Ex: Pessoa e Trabalhador possuem ambos getNome() Aplicam-se
Objetos do Tipo // ... p2.getNome() // invoca getNome() de Pessoa// p2 = (Pessoa) t; // conversão
Objetos do Subtipo // ... p2.getNome() // invoca getNome() de Trabalhador
// t = new Trabalhador();// ... t.getNome() // invoca getNome() de Trabalhador// t = (Trabalhador) p3; // conversão// ... t.getNome(); // invoca getNome() de Pessoa
Pessoa
Trabalhador
Conversão de Tipos Referência 1/3Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 41/72
Conversão Upcasting
Subtipo Tipo
Exemplo
Conversão Implícita
Não precisa de ser declarada // Ex: p = t em vez de p = (Pessoa) t
Conversão de tipos segura
Não provoca erros de execução
Porque todos os métodos do tipo são possuídos pelo subtipo // Ex: Trabalhador e Pessoa
Pessoa
Trabalhador
Tipo
Pessoa
Tipo
Trabalhador
Tipo e Subtipo
Superclasse
SubclasseSubtipo de
Pessoa
Conversão de Tipos
Upcasting Downcasting
Pessoa p = new Pessoa(); // p guarda referência de objeto do mesmo tipo
Trabalhador t = new Trabalhador();
p = t; // p guarda referência de objeto de um subtipo
String nome = p.getNome(); // executado getNome() de Trabalhador
Conversão de Tipos Referência 2/3Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 42/72
Conversão Downcasting
Tipo Subtipo
Exemplo
Conversão explícita (declarada)
Compilador passa responsabilidade para programador
Conversão de tipos insegura
Pode provocar erros de execução
Porque tipo, geralmente, não possui todos métodos do subtipo // Ex: Pessoa e Trabalhador
Pessoa
Trabalhador
Tipo
Pessoa
Tipo
Trabalhador
Tipo e Subtipo
Superclasse
SubclasseSubtipo de
Pessoa
Conversão de Tipos
Upcasting Downcasting
Pessoa p = new Pessoa(); // p guarda referência de objeto do mesmo tipo
Trabalhador t = new Trabalhador();
t = (Trabalhador) p; // t guarda referência de objeto de um tipo
String nome = t.getNome(); // executado getNome() de Pessoa
String empresa = t.getEmpresa(); // gera erro de execução ; p não possui getEmpresa()
Conversão de Tipos Referência 3/3Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 43/72
Variável Tipo Referência
Tem um tipo estático
Pode ter múltiplos tipos dinâmicos
Tipo Estático
Tipo declarado
Único tipo considerado pelo compilador // não se altera
Exemplo
Tipos Dinâmicos
Considerados em tempo de execução
Exemplo
p = new Trabalhador(); // tipo p: estático = Pessoa e dinâmico = Trabalhador
Exemplo de variável com diferentes tipos dinâmicos
Pessoa p; // p é do tipo dinâmico Pessoa
p = new Pessoa(); // p mantêm-se do tipo dinâmico Pessoa
p = new Trabalhador(); // p passa a ser do tipo dinâmico Trabalhador
Tipos Referência da mesma Variável
ClassePessoa
SubclasseTrabalhador
Tipo
Pessoa
Subtipo
Trabalhador
Tipo e Subtipo
Polimorfismo
Pessoa p; // tipo estático de p = Pessoa
p = new Trabalhador(); // tipo estático de p = Pessoa
Nelson Freire (ISEP–DEI-PPROG 2015/16) 44/72
Redefinição de métodos permite a uma classe
Possuir múltiplos métodos de instância com a mesma assinatura
Um redefinido + outros herdados
Ou apenas herdados
Aceder a múltiplos métodos de classe com a mesma assinatura, das suas superclasses
Questão
Como é procurado o método a executar entre vários alternativos ?
Exemplo
instânciaB.metodo1(12, 23.4f) // método1 da classe B ou de A?
B.metodo2("Mensagem") // método2 da classe B ou de A?
Classe Apublic Pessoa metodo1(int x, float y)
public static int metodo2(String s)
Classe Bpublic Trabalhador metodo1(int z, float w)
public static int metodo2(String s)
Definidos
Redefinidos
ClassePessoa
SubclasseTrabalhador
Procura de Métodos 1/2Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 45/72
Tipos de Procura
Estática // em tempo de compilação (compile-time) pelo compilador
// em tempo de programação no Netbeans pelo compilador
Dinâmica // em tempo de execução (run-time)
Procura Estática
Métodos de Classe
Métodos de Instância
Procura Dinâmica
Métodos de Instância
Procura de Métodos 2/2Polimorfismo
Métodos de Classe
Métodos de Instância
Métodos de uma Classe
Nelson Freire (ISEP–DEI-PPROG 2015/16) 46/72
• Algoritmo de Procura Estática de Métodos
Procura do método solicitado começa sempre na classe do objeto-recetor de mensagem
Chamada procura local
Se o método pretendido não for encontrado nessa classe, a procura continua nas suas superclasses, segundo a ordem hierárquica e até à classe Object
Se a procura chegar à classe Object e o método pretendido não for encontrado, é gerado um errode compilação
Algoritmo de Procura Estática de Métodos
Procura Estática de Métodos 1/3Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 47/72
Métodos de Classe
Procurados apenas em tempo de compilação
Exemplos de Métodos Acessíveis
Aplicados a Classes
A.m1(); // tipo estático de A é A determinado m1 de A
B.m1(); // tipo estático de B é B determinado m1 de B
B.m2(); // encontrado m2 de A
Aplicados a Instâncias
B b1 = new B();
b1.m1(); // tipo estático de b1 é B determinado m1 de B
A a1 = b1;
a1.m1(); // tipo estático de a1 é A determinado m1 de A
Classe Apublic static m1()public static m2()
Classe Bpublic static m1()
Exemplo
Procura Estática de Métodos 2/3Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 48/72
Métodos de Instância
Acessíveis só podem ser aplicados a instâncias
Exemplo
Procura Estática de Métodos 3/3
Classe Cpublic m1()public m2()
Classe Dpublic m1()
Exemplo
Polimorfismo
D d1 = new D();
C c1 = new C();
c1.m1(); // tipo estático de c1 é C determinado m1 de C
c1 = d1;
c1.m1(); // tipo estático de c1 é C determinado m1 de C
d1.m2(); // tipo estático de d1 é D determinado m2 de C
Nelson Freire (ISEP–DEI-PPROG 2015/16) 49/72
Algoritmo de Procura Dinâmica
Permite à instância-recetora de uma mensagem
Determinar o método apropriado para responder, entre múltiplos métodos sobrepostos
Métodos com a mesma assinatura
Método será sempre encontrado
Código garantido pelo compilador
Tudo exceto downcastings
Responsabilidade do programador
Procura Dinâmica de Métodos de Instância
Algoritmo de Procura Dinâmica de Métodos
em Código Garantido pelo Compilador (tudo
exceto downcastings)
1/2Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 50/72
Métodos de Instância
Métodos acessíveis só podem ser aplicados a instâncias
Exemplo
Observações
Mesma variável p
Com diferentes tipos dinâmicos
Mesma expressão sintática p.toString()
Com diferentes semânticas
Procura Dinâmica de Métodos de Instância
ObjecttoString()definido
PessoatoString()redefinido
TrabalhadortoString()redefinido
2/2Polimorfismo
Pessoa p; // p é do tipo Pessoa
p = new Pessoa(); // p mantêm-se do tipo Pessoa
System.out.println( p.toString() ); // executado toString() da classe Pessoa
p = new Trabalhador(); // p passa a ser do tipo Trabalhador
System.out.println( p.toString() ); // executado toString() de Trabalhador
Nelson Freire (ISEP–DEI-PPROG 2015/16) 51/72
Operador instanceof
Sintaxe: nomeInstância instanceof nomeClasse
Retorna: true ou false
true se Instância for da Classe ou de qualquer uma das suas subclasses Instância de subclasse é considerada instância de qualquer superclasse sua
Porque responde às mesmas mensagens das suas instâncias Exemplo
Pessoa
Trabalhador Estudante
Determinação do Tipo Dinâmico de uma Variável Polimorfismo
// Declaração de contentor de instâncias de diferentes tipos Pessoa
Pessoa[] pessoas = new Pessoa[100];
// Preenchimento do contentor
pessoas[0] = new Trabalhador() ;
pessoas[1] = new Pessoa() ;...// Mostrar nomes de todas as pessoas do contentor
for (int i=0; i<pessoas.length; i++)
System.out.println(" Nome: " + pessoas[i].getNome() ); // instâncias Pessoa, Trabalhador e Estudante
// Mostrar as empresas dos trabalhadores
for (int i=0; i<pessoas.length; i++)
if (pessoas[i] instanceof Trabalhador)
System.out.println( "Empresa: "+ ( (Trabalhador) pessoas[i] ).getEmpresa() ); // conversão tipo estático
Nelson Freire (ISEP–DEI-PPROG 2015/16) 52/72
Polimorfismo Noção
Mecanismo da POO que permite a variável de um tipo estático assumir múltiplos tipos dinâmicos
i.e., permite a uma variável assumir múltiplas formas (polimorfismo ... das variáveis)
Interesse
Permitir uma Programação Genérica para criar programas
Mais simples
Mais facilmente estendíveis a novas classes
Programação Incremental
Programação Genérica
Princípios
Todas as classes da hierarquia devem possuir a mesma API:
Mesmos métodos públicos para responderem às mesmas mensagens
Programação deve ser feita para o tipo mais genérico da hierarquia (topo)
Programador não tem de se preocupar com subtipos (existentes e futuros)
É particularmente simples
Usando contentores de instâncias
Figurapublico area()
Poligonopublico area()
Retangulopublico area()
Elipsepublico area()
Triangulopublico area()
1/2Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 53/72
Exemplo: programa para mostrar áreas de diferente figuras geométricas
Todas as classes da hierarquia têm a mesma API (método area())
Definido na classe mais genérica (topo da hierarquia )
Redefinido nas subclasses
Programação mais simples feita para o tipo mais genérico (Figura) requer um contentor desse tipo
Tipo genérico é o tipo compatível com todos os subtipos da hierarquia
// Estrutura de Dados para guardar todas as instâncias da hierarquia de classes: contentor
Figura[] figuras = new Figura[100];
// Preenchimento do contentor
figuras[0] = new Elipse();
figuras[1] = new Retangulo();
figuras[2] = new Triangulo();
// Algoritmo para calcular e mostrar áreas
for( int i=0; i<figuras.length; i++)
System.out.println( figuras[i].area() );
Polimorfismo 2/2
Figura
area()
Poligono
area()
Retangulo
area()
Elipse
area()
Triangulo
area()
Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 54/72
Permite a criação de programas
Mais Simples
Mais Compactos
Mais fáceis de escrever, ler, perceber e manter
Facilita a extensão dos programas a novos subtipos da hierarquia
Porque o código genérico também funciona para novos subtipos da hierarquia
Minimiza as alterações necessárias
Apenas ao nível do preenchimento de Estruturas de Dados
Algoritmo mantêm-se intacto
Exemplo Extensão do programa anterior para suportar um novo subtipo Circulo
Basta acrescentar apenas uma linha de código
figuras[3] = new Circulo();
Propriedade dos programas muito importante
Garante a continuidade do código
Exige um menor esforço de programação
Menores custos de produção de software
Programação Genérica : Vantagens
Figura
area()
Poligono
area()
Retangulo
area()
Elipse
area()
Triangulo
area()
Circulo
area()
Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 55/72
Tipo Object
Compatível com todos os tipos referência
Variável deste tipo
Pode representar, dinamicamente
Instâncias de qualquer classe
Exemplo
API (Métodos Públicos)
Muito limitada
Poucas mensagens para enviar a instâncias Object
Ex: obj.toString() // mensagem toString() enviada a obj
Programação para tipo Object
Aumento de mensagens para enviar a instâncias Object
Requer downcastings para subtipos de Object
Exemplo
((Trabalhador) pessoas[i] ).getEmpresa() // mensagem getEmpresa() enviada a pessoas[i]
Há preocupações com os tipos das instâncias
Membros de Object
Classe ObjectPolimorfismo
Object obj = new Pessoa();
obj = new Trabalhador();
Nelson Freire (ISEP–DEI-PPROG 2015/16) 56/72
Suporta
Redefinição de métodos acessíveis (classe/instância)
Sobreposição
Porque a redefinição local de método acessível sobrepõe-se à sua definição
Método redefinido (sobreposto), segundo o algoritmo de procura de métodos
Primeiro a ser encontrado
Tem maior prioridade
Objeto-recetor de mensagem executa sempre
o método sobreposto
Não confundir com Overloading
Mecanismo de sobrecarga de métodos/construtores numa classe
Permite a definição de múltiplos métodos/construtores com o mesmo nome
Exemplo
Múltiplos construtores na mesma classe
Mecanismo de Sobreposição (Overriding)
ObjecttoString()
Classe XtoString()
Definido
Redefinido
Método Redefinido (Sobreposto)
Polimorfismo
Nelson Freire (ISEP–DEI-PPROG 2015/16) 57/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 58/72
Noção de Classe
Abstrata
Concreta
Classe Abstrata
Declaração
Método Abstrato
Herança
Interesse
Construtores
Tipo Referência
SumárioClassesAbstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 59/72
Classe Abstrata
Pode definir métodos abstratos
Métodos de instância
Não privados
Declarados apenas sintaticamente // só cabeçalho; corpo vazio; não implementados
Classe não instanciável
Sem capacidade para criar instâncias
Caso contrário, instâncias não seriam capazes de responder a mensagens correspondentes a métodos abstratos erros de execução
Classe com definição incompleta
Se possuir métodos abstratos // métodos não implementados
Exemplo
Noção de Classe AbstrataClasses Abstratas
public abstract class Exemplo { // modificador abstract declara classe abstrata...
public abstract double m1(); // método abstrato (declarado abstract)
public abstract int m2( String s );
public int m3( int x ) { return x*20; } // método não abstrato (implementado)}
Nelson Freire (ISEP–DEI-PPROG 2015/16) 60/72
Classe Concreta
Classe não abstrata
Tem definição completa // todos os métodos não-abstratos
Pode ser instanciável
Exemplo
Noção de Classe Concreta
public class Exemplo2 { // sem modificador abstract
...
// métodos de instância
public double m1() { return Math.random() * 100; // implementado
}
public String m2( String s ) { return String.format("%-7s",s); // implementado
}
public double m3( int x ) { return Math.random() * x; // implementado
}}
Classes Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 61/72
Sintaxe
[...] opcional
modificador de acesso public ou sem modificador = package
NomeClasse letra inicial maiúscula
extends aplica-se a classe que estende outra classe (herança)
implements aplica-se a classe que implementa um ou mais interfaces
Exemplo
[modificador de acesso] abstract class NomeClasse [extends SuperClasse] [implements Interfaces] {
//membros da classe
}
public abstract class Exemplo { // Nome da classe iniciado com letra maiúscula
...
}
Declaração de Classe Abstrata 1/3Classes
Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 62/72
Organização dos Membros da Classe
Declaração de Classe Abstrata 2/3Classes
Abstratas
[modificador de acesso] abstract class NomeClasse [extends SuperClasse] [implements Interfaces] {
// variáveis de instância
// constantes de classe
// variáveis de classe
// membros públicos
// construtores
// métodos de instância
// métodos de consulta (gets)
// métodos de modificação (sets)
// métodos complementares e auxiliares // podem ser abstratos
// métodos de classe
// organização
// outros membros privados
// métodos de instância
// organização
// métodos de classe
// organização}
Nelson Freire (ISEP–DEI-PPROG 2015/16) 63/72
Método Abstrato
Sintaxe
[...] opcional
modificador de acesso public, protected ou sem modificador = package
nome_método letra inicial minúscula
lista_parâmetros tipo1 nome1, tipo2 nome2, ... ; pode ser lista vazia
Exemplo
[modificador de acesso] abstract tipo_retorno nome_método( lista_parâmetros );
public abstract class Exemplo2 {
...
public abstract double m1();
protected abstract String m2( int x );
abstract void m3( Pessoa p, int n );
...
}
Declaração de Classe Abstrata 3/3Classes
Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 64/72
Herança de Classes Abstratas Classe Abstrata
Pode ser Herdada
Exemplo
Subclasse de Classe Abstrata
Herda métodos abstratos
Se implementar
Todos Classe Concreta
Alguns Classe Abstrata
Circulo Retangulo
Figura Classe Abstrata
Classes Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 65/72
Garantir uma Programação Genérica (i.e., programação simples)
Quando é difícil criar uma hierarquia de classes todas concretas, devido à impossibilidade deimplementação de todos os métodos em classes genéricas
Exemplo
Classes para representação e manipulação de figuras geométricas
Como implementar os métodos comuns, área() e perímetro(), na classe genérica Figura?
Uma classe abstrata colocada no topo de uma hierarquia de classes pode garantir que todas as classes concretas (instanciáveis) da hierarquia implementem a mesma API
Tenham implementações dos mesmos métodos de instância públicos
Sejam classes cujas instâncias respondam às mesmas mensagens
Circulo Retangulo
Figura Classe Abstrata
Interesse de Classes AbstratasClasses Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 66/72
Construtores de Classes Abstratas Classe Abstrata
Pode declarar construtores
Interesse
Para subclasses
Inicializarem variáveis de instância herdadas
Não servem para criar instâncias // classe abstrata não é instanciável
Exemplo
public abstract class Exemplo3 {...
private int x;
public Exemplo3( int x ) { this.x = x; };...
}
public class Exemplo4 extends Exemplo3 {...
public Exemplo4( int x ) { super(x); };...
}
Classes Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 67/72
Tipo Referência de Classe Abstrata Classe Abstrata define
Tipo referência // como qualquer classe concreta
Exemplo
Tipo Figura
Definido por classe abstrata Figura
Usado na declaração de variável
Tipo compatível com seus subtipos
Exemplo
Figura compatível com subtipos Circulo e Retangulo
f pode representar instâncias Circulo e Retangulo
Circulo Retangulo
Figura Classe Abstrata
Figura f = new Circulo();
f = new Retangulo();
Figura f;
Classes Abstratas
Nelson Freire (ISEP–DEI-PPROG 2015/16) 68/72
Mecanismos de Reutilização de Código
Herança de Classes
Polimorfismo
Classes Abstratas
Classe Object
Sumário GeralPPROG
Nelson Freire (ISEP–DEI-PPROG 2015/16) 69/72
Classe Java mais Genérica
Está no topo de todas as hierarquias de classes Java
Superclasse de todas as classes
Qualquer classe em Java é subclasse, pelo menos, de Object
Membros
Comuns a todas as classes Java
Interessam a todas as classes
Exemplos de Métodos
toString
equals
Nome Object
Objeto ... é característica comum a todas as classes
Hierarquia de Classes Java
Object
Trabalhador
Pessoa Carro
Herança Classe Object 1/4
Nelson Freire (ISEP–DEI-PPROG 2015/16) 70/72
Métodos (instância) que classes instanciáveis devem reescrever (1/3)
public String toString() { ... }
Deve retornar representação textual legível do objeto
Em Object
Retorna nome da classe e identificador interno hexadecimal
protected Object clone() { ... }
Java não garante implementação adequada
Construtor de cópia (ou clone)
Herança Classe Object 2/4
public class Pessoa {
private String nome;private int idade;...public Pessoa(Pessoa p){ // construtor de cópia
this.nome = p.nome;this.idade = p.idade;
}...public Pessoa clone(){ return new Pessoa(this); }
}
Nelson Freire (ISEP–DEI-PPROG 2015/16) 71/72
Métodos (instância) que classes instanciáveis devem reescrever (2/3)
public boolean equals(Object obj) { ... }
Deve testar a igualdade de características de 2 objetos // equivalência
Mesma classe
Estados iguais
Em Object
Testa apenas igualdade de endereços // Object não tem estado
obj == this (objeto recetor da mensagem)
Exemplo de método reescrito ...
Herança Classe Object 3/4
public class Pessoa {
private String nome;private int idade;
...
public boolean equals(Object obj){if(this==obj) return true;if(obj==null || this.getClass()!=obj.getClass()) return false;Pessoa p = (Pessoa) obj;return nome.equals(p.getNome()) && idade==p.getIdade();
}}
Método getClass() Retorna objeto
da classe Classque representaclasse do objetorecetor.
Nelson Freire (ISEP–DEI-PPROG 2015/16) 72/72
Métodos (instância) que classes instanciáveis devem reescrever (3/3)
public boolean equals(Object obj) { ... } Exemplo de método reescrito ... numa hierarquia de classes
Herança Classe Object 4/4
public class Pessoa { // superclasse
private String nome;private int idade;...
public boolean equals(Object obj){if(this==obj) return true;if(obj==null || this.getClass()!=obj.getClass()) return false;Pessoa p = (Pessoa) obj;return nome.equals( p.getNome() ) && idade==p.getIdade();
}}
public class Trabalhador extends Pessoa { // subclasse
private String empresa;...
public boolean equals(Object obj){if( !super.equals(obj) ) return false;Trabalhador t = (Trabalhador) obj;return empresa.equals( t.getEmpresa() );
}}
Método getClass() Retorna objeto
da classe Classque representaclasse do objetorecetor.