Programação Orientada por Objetos

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

Programação por Objectos. Java

9 Classes Abstractas e Interfaces

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

4 Conceito de Herança

Classes e Objetos. Sintaxe de classe em Java

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

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

Paradigmas da Programação PPROG. Tipos Enumerados. Nelson Freire (ISEP DEI-PPROG 2013/14) 1/20

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

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

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

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

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

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

Prof. A. G. Silva. 30 de outubro de Prof. A. G. Silva INE5603 Introdução à POO 30 de outubro de / 1

Conceitos de Programação Orientada a Objetos

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

Programação Orientada por Objetos

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

Classe Abstrata e Interface

Programação por Objectos. Java

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

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

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

Paradigmas da Programação PPROG GENÉRICOS. (Livro Big Java, Late Objects Capítulo 18) Nelson Freire (ISEP DEI-PPROG 2014/15) 1/23

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

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

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

Linguagem de Programação III

Linguagens de Programação Aula 12

Linguagem de Programação II Herança

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

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

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

A Relação de Subtipo e Tipos Genéricos

COMPORTAMENTOS - Observações

Como exemplo, vamos criar uma subclasse da classe Funcionario, vista nos capítulos anteriores.

Linguagem de Programação. Diagrama de classes

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

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

Linguagem de Programação II Implementação

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

Laboratório de programação II

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Polimorfismo. O que é polimorfismo?

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

Palavras Reservadas da Linguagem Java

Programação Orientada a Objetos JAVA - NETBEANS

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

Aula 9 POO 1 Polimorfismo. Profa. Elaine Faria UFU

Programação Orientada a Objetos 2 Flávio de Oliveira Silva, M.Sc.

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

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

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

Herança e Propriedades

POO e C++: Herança e Polimorfismo

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

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

Sobrecarga, Sobreposição e Polimorfismo

1 Introdução e Conceitos básicos

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

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

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

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

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

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

Programação Estruturada e Orientada a Objetos. Objetos e Métodos

Aula 7 POO 1 Herança. Profa. Elaine Faria UFU

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

Programação por Objectos. Java

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Programação Orientada a Objetos

Extensão de classes em Java - noções elementares - PCO / PPO Departamento de Informática Faculdade de Ciências da Universidade de Lisboa

Programação Orientada a Objetos para Redes de Computadores

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

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

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

Interfaces e polimorfismo

Análise de Programação

Aprendendo. Java 2. Rodrigo Mello Ramon Chiara Renato Villela. Novatec Editora Ltda.

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

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

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

Programação Orientada a Objetos

Namespaces, Classes e Métodos.

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

Universidade Federal de Uberlândia

Orientação a Objetos AULA 06

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Introdução à Programação Orientada por Objectos em Java. Enquadramento e Objectivos Abstracção Encapsulamento Herança Polimorfismo Conclusão

Herança Sendo uma linguagem orientada a objetos Java oferece mecanismos para definir classes derivadas a partir de classes existentes; As classes deri

Classes, Métodos e Propriedades

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

Transcrição:

PPROG Paradigmas da Programação Programação Orientada por Objetos Herança de Classes Polimorfismo Classes Abstratas (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2015/16) 1/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 2/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 3/72

Reutilização de Código Mecanismos de Reutilização de Código Sumário Interesse Tipos de Mecanismos Nelson Freire (ISEP DEI-PPROG 2015/16) 4/72

Reutilização de Código Interesse dos Mecanismos de Reutilização de Código 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) Código Novo Código Existente Programa Novo Concretamente Baseada na construção de classes novas a partir de classes existentes Nelson Freire (ISEP DEI-PPROG 2015/16) 5/72

Reutilização de Código Composição Tipos de Mecanismos de Reutilização de Código Permite criar uma classe composta por outras classes (CA) Classe Nova (CN) CA1 CA2 CN contém CA1 e CA2 Classes agregadas (CA) estão ao mesmo nível CA1 CA2 Herança Permite criar uma classe que herda (acrescenta) outras classes Classe Nova (CN) CH1 CH2 CN contém CH2 contém CH1 Classes herdadas (CH) estão em níveis diferentes CH1 CH2 Nelson Freire (ISEP DEI-PPROG 2015/16) 6/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 7/72

Herança 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 8/72

Herança Noção de Herança 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 Classe Existente Nova Classe Membros de instância de uma classe existente + Membros Novos Classe Existente Pessoa Características comuns de pessoas Nova Classe Trabalhador Características: comuns de pessoas + específicas de trabalhador s de características Comuns de pessoas: nome e data de nascimento Específicas de trabalhador: salário e empresa Nelson Freire (ISEP DEI-PPROG 2015/16) 9/72

Herança Superclasse e Subclasse de uma Classe A B Superclasse de B Subclasse de A + Genérica Especialização Generalização + Específica 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 Classe Trabalhador herda classe Pessoa Pessoa Superclasse da classe B Trabalhador Classe herdada pela classe B Mais genérica do que B // contém menos membros: métodos e/ou variáveis Classe Pessoa é herdada pela classe Trabalhador Nelson Freire (ISEP DEI-PPROG 2015/16) 10/72

Herança Tipo de Relacionamento entre Superclasse Suas subclasses Relacionamento É-UM(A) (IS-A) Trabalhador é uma Pessoa Superclasse Pessoa É-UMA Especialização + Genérica Generalização Subclasse Trabalhador + Específica Interesse Determinar o uso do mecanismo de herança Nelson Freire (ISEP DEI-PPROG 2015/16) 11/72

Herança 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 Hierarquia de Classes 1/3 A B C D E F G Hierarquia de Classes (Simples) Superclasse de todas as subclasses Superclasse 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 12/72

Herança Hierarquia de Classes 2/3 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 + Genérica B C D Especialização E F G Hierarquia de Classes (Simples) + Específicas Nelson Freire (ISEP DEI-PPROG 2015/16) 13/72

Herança Hierarquia de Classes 3/3 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 sublinhado significa atributo de classe (static) Nelson Freire (ISEP DEI-PPROG 2015/16) 14/72

Herança Noção Herança acima da superclasse direta Herança Transitiva 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 F herda de A, porque herda de D e esta, por sua vez, herda de A A Herança Transitiva F D Herda diretamente de A Herda diretamente de D e indiretamente de A Legenda: indireta direta Herança Transitiva Nelson Freire (ISEP DEI-PPROG 2015/16) 15/72

Herança Tipos de Herança em POO Tipos de Herança em POO (Programação Orientada por Objetos ) Simples Múltipla A 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 B C D E F Herança Simples X G Classe Z Y W Permitida pelo C++ Java Não permite em hierarquias de classes Permite em hierarquias de interfaces T U Z Herança Múltipla V Nelson Freire (ISEP DEI-PPROG 2015/16) 16/72

Herança Classe Object 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 Pessoa Object Carro Membros Comuns a todas as classes Java Interessam a todas as classes s de Métodos tostring equals Trabalhador Hierarquia de Classes Java Nome Object Objeto... é característica comum a todas as classes Nelson Freire (ISEP DEI-PPROG 2015/16) 17/72

Herança Sintaxe Declaração de uma Subclasse [modificador de acesso] [final] class subclasse extends superclasse {... } [...] = 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 public final class String... {... } public class SubString extends String {... } Classe String public class Trabalhador extends Pessoa {... } Pessoa Trabalhador... Nelson Freire (ISEP DEI-PPROG 2015/16) 18/72

Herança Em Java Tipos de Membros de Classes 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 Membros Locais Membros Herdados Definidos nas suas superclasses Classe Membros Locais Definidos na própria classe Nelson Freire (ISEP DEI-PPROG 2015/16) 19/72

Herança Membros Herdados 1/3 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 Herdados Variáveis de Instância Métodos de Instância Membros Locais Classe 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 20/72

Herança Relativamente ao acesso, podem ser Acessíveis Inacessíveis Membros Herdados 2/3 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 Variáveis de Instância Inacessíveis (sendo privados) Métodos de Instância Acessíveis Inacessíveis Membros Locais Classe Nelson Freire (ISEP DEI-PPROG 2015/16) 21/72

Herança Conceitos diferentes: herdar e aceder Membros Herdados 3/3 Um membro pode ser herdado... mas pode não estar acessível à subclasse : método de instância privado Um membro pode estar acessível... e não ser herdado : membros de classe públicos Para simplificar a programação Podemos considerar herdado o que está acessível Membros Herdados Variáveis de Instância Inacessíveis (sendo privados) Métodos de Instância Acessíveis Inacessíveis Membros Locais Classe Nelson Freire (ISEP DEI-PPROG 2015/16) 22/72

Herança Definição Membros especificados na própria classe Variáveis Instância Classe Métodos Instância Classe Membros Locais 1/8 Membros Herdados Membros Locais Variáveis de Instância Variáveis de de Classe Relativamente à definição, podem ser Definidos Redefinidos (Override ou Reescritos) Métodos de Instância Definidos Redefinidos Métodos de Classe Definidos Redefinidos Classe Nelson Freire (ISEP DEI-PPROG 2015/16) 23/72

Herança Membros Locais 2/8 Membros Locais Definidos Cujas definições residem apenas na própria classe Classe X Definições inexistentes nas suas superclasses Classe Y metodo() Definido Membro Local Definido 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 Método tostring() herdado, pelo menos, da classe Object Suportado pelo Mecanismo da Sobreposição (Overriding) Mais pormenores nos próximos slides Classe X metodo1() Classe Y metodo1() metodo2() Definido Redefinido Definido Membro Local Reescrito Nelson Freire (ISEP DEI-PPROG 2015/16) 24/72

Herança 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 Membros Locais 3/8 Classe A private static int metodo1(long x, String s) public static Pessoa metodo2(int x, float y) public double metodo3(string s) Definidos Superclasse Pessoa Classe B public static int metodo1(long a, String b) public static Trabalhador metodo2(int z, float w) public double metodo3(string s) Redefinidos Subclasse Trabalhador Nelson Freire (ISEP DEI-PPROG 2015/16) 25/72

Herança 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 Membros Locais 4/8 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 s Classe A private static int metodo1(long x, String s) public static Pessoa metodo2(int x, float y) public double metodo3(string s) Definidos Superclasse Pessoa Classe B public static long metodo1(long a, String b) public static Trabalhador metodo2(int z, float w) public double metodo3(string s) Redefinidos Subclasse Trabalhador Nelson Freire (ISEP DEI-PPROG 2015/16) 26/72

Herança Requisitos de Método Redefinido (3/5) Membros Locais 5/8 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 Método Definido public protected package Método Redefinido public protected ou public qualquer, excepto private Slide seguinte Nelson Freire (ISEP DEI-PPROG 2015/16) 27/72

Herança Requisitos de Método Redefinido (4/5) Membros Locais 6/8 Nível de acesso (visibilidade) Classe A private static int metodo1(long x, String s) public static Pessoa metodo2(int x, float y) protected int metodo4(string s) Definidos Classe B public static int metodo1(long a, String b) public static Trabalhador metodo2(int z, float w) public int metodo4(string s) Redefinidos Nelson Freire (ISEP DEI-PPROG 2015/16) 28/72

Herança Requisitos de Método Redefinido (5/5) Membros Locais 7/8 Métodos declarados final Não podem ser redefinidos Classe A... public final int metodo_x(long x){...} public static final String metodo_y() {... }... Métodos Definidos Classe B... public final int metodo_x(long x){...} public static final String metodo_y() {... }... Métodos Redefinidos Nelson Freire (ISEP DEI-PPROG 2015/16) 29/72

Herança Variável Redefinida (classe/instância) Membros Locais 8/8 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 30/72

Herança Referência super 1/2 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 super.tostring() // invoca método tostring() da superclasse super não se deve aplicar a variáveis e métodos de classe 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) 31/72

Herança Não pode ser usada de forma encadeada 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/2 Nelson Freire (ISEP DEI-PPROG 2015/16) 32/72

Herança Invocação super() 1/2 Sintaxe super(lista_parâmetros); // lista pode ser vazia Interesse Uso Acesso aos construtores da superclasse (direta) para inicialização das suas variáveis de instância Só em construtores Obrigatoriamente a 1ª instrução do construtor 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) 33/72

Herança Invocação super() 2/2 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 34/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 35/72

Polimorfismo 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ário 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 Classe Object Vantagens Mecanismo de Sobreposição de Métodos (Overriding) Nelson Freire (ISEP DEI-PPROG 2015/16) 36/72

Polimorfismo Classe é também Tipo de Dados Classe é Tipo de Dados Tipo referência Variável deste tipo guarda referência de instância // referência = endereço de memória Pessoa p = new Pessoa("Nico"); Classe Pessoa especifica tipo da variável p Variável p guarda referência de instância Pessoa RAM... p referência Stack Instância... Nico... atributo N Heap 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 37/72

Polimorfismo Tipo Referência Tipo e Subtipo Referência Especificado por Classe Interface // próxima aula Subtipo de Tipo Referência Tipo especificado por classe Tipo de uma subclasse Trabalhador é subtipo de Pessoa Superclasse Pessoa Tipo Pessoa Subclasse Trabalhador Tipo Trabalhador Subtipo de Pessoa Tipo e Subtipo Nelson Freire (ISEP DEI-PPROG 2015/16) 38/72

Polimorfismo Tipo Referência Estático Dinâmico Tipo Estático e Tipo 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 Pessoa p; // tipo estático da variável p = Pessoa // tipo declarado Tipo Dinâmico Considerado em tempo de execução (run-time) 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) 39/72

Polimorfismo 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; Justificação Conversão de Tipos Referência 1/3 Pode guardar objetos do tipo // t = (Trabalhador) p2; Pessoa Trabalhador 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 40/72

Polimorfismo Conversão Upcasting Conversão de Tipos Referência 2/3 Subtipo Tipo Superclasse Subclasse Pessoa Trabalhador Tipo Pessoa Tipo Trabalhador Subtipo de Pessoa Upcasting Downcasting Tipo e Subtipo Conversão de Tipos Pessoa p = new Pessoa(); Trabalhador t = new Trabalhador(); p = t; String nome = p.getnome(); // p guarda referência de objeto do mesmo tipo // p guarda referência de objeto de um subtipo // executado getnome() de Trabalhador 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 41/72

Polimorfismo Conversão Downcasting Conversão de Tipos Referência 3/3 Tipo Subtipo Superclasse Subclasse Pessoa Trabalhador Tipo Pessoa Tipo Trabalhador Subtipo de Pessoa Upcasting Downcasting Tipo e Subtipo Pessoa p = new Pessoa(); Trabalhador t = new Trabalhador(); t = (Trabalhador) p; String nome = t.getnome(); String empresa = t.getempresa(); Conversão de Tipos // p guarda referência de objeto do mesmo tipo // t guarda referência de objeto de um tipo // executado getnome() de Pessoa // gera erro de execução ; p não possui getempresa() 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 42/72

Polimorfismo Variável Tipo Referência Tem um tipo estático Pode ter múltiplos tipos dinâmicos Tipos Referência da mesma Variável Classe Pessoa Tipo Pessoa Tipo Estático Tipo declarado Único tipo considerado pelo compilador // não se altera Pessoa p; // tipo estático de p = Pessoa p = new Trabalhador(); // tipo estático de p = Pessoa Subclasse Trabalhador Tipo e Subtipo Subtipo Trabalhador Tipos Dinâmicos Considerados em tempo de execução p = new Trabalhador(); // tipo p: estático = Pessoa e dinâmico = Trabalhador de variável com diferentes tipos dinâmicos Pessoa p; p = new Pessoa(); p = new Trabalhador(); // p é do tipo dinâmico Pessoa // p mantêm-se do tipo dinâmico Pessoa // p passa a ser do tipo dinâmico Trabalhador Nelson Freire (ISEP DEI-PPROG 2015/16) 43/72

Polimorfismo Procura de Métodos 1/2 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? 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 A public Pessoa metodo1(int x, float y) public static int metodo2(string s) Definidos Classe Pessoa Classe B public Trabalhador metodo1(int z, float w) public static int metodo2(string s) Redefinidos Subclasse Trabalhador Nelson Freire (ISEP DEI-PPROG 2015/16) 44/72

Polimorfismo Tipos de Procura Procura de Métodos 2/2 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 Métodos de Classe Métodos de Instância Métodos de uma Classe Nelson Freire (ISEP DEI-PPROG 2015/16) 45/72

Polimorfismo 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 Procura Estática de Métodos 1/3 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 erro de compilação Algoritmo de Procura Estática de Métodos Nelson Freire (ISEP DEI-PPROG 2015/16) 46/72

Polimorfismo Métodos de Classe Procurados apenas em tempo de compilação Procura Estática de Métodos 2/3 s de Métodos Acessíveis Aplicados a Classes A.m1(); // tipo estático de A é A determinado m1 de A Classe A public static m1() public static m2() B.m1(); B.m2(); // tipo estático de B é B determinado m1 de B // encontrado m2 de A Classe B public static m1() Aplicados a Instâncias Exemplo 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 47/72

Polimorfismo Métodos de Instância Procura Estática de Métodos 3/3 Acessíveis só podem ser aplicados a instâncias D d1 = new D(); C c1 = new C(); c1.m1(); c1 = d1; c1.m1(); d1.m2(); // tipo estático de c1 é C determinado m1 de C // tipo estático de c1 é C determinado m1 de C // tipo estático de d1 é D determinado m2 de C Classe C public m1() public m2() Classe D public m1() Exemplo Nelson Freire (ISEP DEI-PPROG 2015/16) 48/72

Polimorfismo Algoritmo de Procura Dinâmica Procura Dinâmica de Métodos de Instância 1/2 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 Algoritmo de Procura Dinâmica de Métodos em Código Garantido pelo Compilador (tudo exceto downcastings) Nelson Freire (ISEP DEI-PPROG 2015/16) 49/72

Polimorfismo Métodos de Instância Procura Dinâmica de Métodos de Instância 2/2 Métodos acessíveis só podem ser aplicados a instâncias Pessoa p; p = new Pessoa(); System.out.println( p.tostring() ); p = new Trabalhador(); System.out.println( p.tostring() ); // p é do tipo Pessoa // p mantêm-se do tipo Pessoa // executado tostring() da classe Pessoa // p passa a ser do tipo Trabalhador // executado tostring() de Trabalhador Observações Mesma variável p Com diferentes tipos dinâmicos Mesma expressão sintática p.tostring() Com diferentes semânticas Object tostring() definido Pessoa tostring() redefinido Trabalhador tostring() redefinido Nelson Freire (ISEP DEI-PPROG 2015/16) 50/72

Polimorfismo Operador instanceof Sintaxe: nomeinstância instanceof nomeclasse Retorna: true ou false Determinação do Tipo Dinâmico de uma Variável 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 // 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() ); // Mostrar as empresas dos trabalhadores for (int i=0; i<pessoas.length; i++) if (pessoas[i] instanceof Trabalhador) Trabalhador Pessoa Estudante // instâncias Pessoa, Trabalhador e Estudante System.out.println( "Empresa: "+ ( (Trabalhador) pessoas[i] ).getempresa() ); // conversão tipo estático Nelson Freire (ISEP DEI-PPROG 2015/16) 51/72

Polimorfismo 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) 1/2 Interesse Permitir uma Programação Genérica para criar programas Mais simples Mais facilmente estendíveis a novas classes Programação Incremental Elipse publico area() Figura publico area() Poligono publico area() Programação Genérica Princípios Retangulo publico area() Triangulo publico area() 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 52/72

Polimorfismo Polimorfismo 2/2 : 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(); Elipse area() Figura area() Poligono area() // Algoritmo para calcular e mostrar áreas for( int i=0; i<figuras.length; i++) System.out.println( figuras[i].area() ); Retangulo area() Triangulo area() Nelson Freire (ISEP DEI-PPROG 2015/16) 53/72

Polimorfismo Programação Genérica : Vantagens 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 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 Elipse area() Circulo area() Figura area() Retangulo area() Poligono area() Triangulo area() Nelson Freire (ISEP DEI-PPROG 2015/16) 54/72

Polimorfismo Tipo Object Compatível com todos os tipos referência Variável deste tipo Pode representar, dinamicamente Instâncias de qualquer classe Object obj = new Pessoa(); obj = new Trabalhador(); Classe Object API (Métodos Públicos) Muito limitada Poucas mensagens para enviar a instâncias Object Ex: obj.tostring() // mensagem tostring() enviada a obj Membros de Object Programação para tipo Object Aumento de mensagens para enviar a instâncias Object Requer downcastings para subtipos de Object ((Trabalhador) pessoas[i] ).getempresa() // mensagem getempresa() enviada a pessoas[i] Há preocupações com os tipos das instâncias Nelson Freire (ISEP DEI-PPROG 2015/16) 55/72

Polimorfismo 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 Mecanismo de Sobreposição (Overriding) Object tostring() Classe X tostring() Definido Redefinido Método Redefinido (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 Múltiplos construtores na mesma classe Nelson Freire (ISEP DEI-PPROG 2015/16) 56/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 57/72

Classes Abstratas Sumário Noção de Classe Abstrata Concreta Classe Abstrata Declaração Método Abstrato Herança Interesse Construtores Tipo Referência Nelson Freire (ISEP DEI-PPROG 2015/16) 58/72

Classes Abstratas 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 Noção de Classe Abstrata Se possuir métodos abstratos // métodos não implementados public abstract class Exemplo {... public abstract double m1(); public abstract int m2( String s ); public int m3( int x ) { return x*20; } } // modificador abstract declara classe abstrata // método abstrato (declarado abstract) // método não abstrato (implementado) Nelson Freire (ISEP DEI-PPROG 2015/16) 59/72

Classes Abstratas Classe Concreta Classe não abstrata Tem definição completa // todos os métodos não-abstratos Pode ser instanciável Noção de Classe Concreta public class Exemplo2 {... // métodos de instância public double m1() { return Math.random() * 100; } public String m2( String s ) { return String.format("%-7s",s); } public double m3( int x ) { return Math.random() * x; } } // sem modificador abstract // implementado // implementado // implementado Nelson Freire (ISEP DEI-PPROG 2015/16) 60/72

Classes Abstratas Sintaxe Declaração de Classe Abstrata 1/3 [modificador de acesso] abstract class NomeClasse [extends SuperClasse] [implements Interfaces] { } //membros da classe [...] 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 public abstract class Exemplo { }... // Nome da classe iniciado com letra maiúscula Nelson Freire (ISEP DEI-PPROG 2015/16) 61/72

Classes Abstratas Organização dos Membros da Classe Declaração de Classe Abstrata 2/3 [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) 62/72

Classes Abstratas Método Abstrato Declaração de Classe Abstrata 3/3 Sintaxe [modificador de acesso] abstract tipo_retorno nome_método( lista_parâmetros ); [...] 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 public abstract class Exemplo2 {... public abstract double m1(); protected abstract String m2( int x ); abstract void m3( Pessoa p, int n ); }... Nelson Freire (ISEP DEI-PPROG 2015/16) 63/72

Classes Abstratas Classe Abstrata Herança de Classes Abstratas Pode ser Herdada Figura Classe Abstrata Circulo Retangulo Subclasse de Classe Abstrata Herda métodos abstratos Se implementar Todos Classe Concreta Alguns Classe Abstrata Nelson Freire (ISEP DEI-PPROG 2015/16) 64/72

Classes Abstratas Garantir uma Programação Genérica (i.e., programação simples) Quando é difícil criar uma hierarquia de classes todas concretas, devido à impossibilidade de implementação de todos os métodos em classes genéricas Interesse de Classes Abstratas 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? Figura Classe Abstrata Circulo Retangulo 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 Nelson Freire (ISEP DEI-PPROG 2015/16) 65/72

Classes Abstratas Classe Abstrata Pode declarar construtores Construtores de Classes Abstratas Interesse Para subclasses Inicializarem variáveis de instância herdadas Não servem para criar instâncias // classe abstrata não é instanciável 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); };... Nelson Freire (ISEP DEI-PPROG 2015/16) 66/72

Classes Abstratas Classe Abstrata define Tipo Referência de Classe Abstrata Tipo referência // como qualquer classe concreta Tipo Figura Definido por classe abstrata Figura Figura Classe Abstrata Circulo Retangulo Usado na declaração de variável Figura f; Tipo compatível com seus subtipos Figura compatível com subtipos Circulo e Retangulo f pode representar instâncias Circulo e Retangulo Figura f = new Circulo(); f = new Retangulo(); Nelson Freire (ISEP DEI-PPROG 2015/16) 67/72

PPROG Sumário Geral Mecanismos de Reutilização de Código Herança de Classes Polimorfismo Classes Abstratas Classe Object Nelson Freire (ISEP DEI-PPROG 2015/16) 68/72

Herança Classe Object 1/4 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 Pessoa Object Carro Membros Comuns a todas as classes Java Interessam a todas as classes s de Métodos tostring equals Trabalhador Hierarquia de Classes Java Nome Object Objeto... é característica comum a todas as classes Nelson Freire (ISEP DEI-PPROG 2015/16) 69/72

Herança Classe Object 2/4 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) public class Pessoa { } private String nome; private int idade;... public Pessoa(Pessoa p){ this.nome = p.nome; this.idade = p.idade; }... public Pessoa clone(){ return new Pessoa(this); } // construtor de cópia Nelson Freire (ISEP DEI-PPROG 2015/16) 70/72

Herança Classe Object 3/4 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) de método reescrito... 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 Class que representa classe do objeto recetor. Nelson Freire (ISEP DEI-PPROG 2015/16) 71/72

Herança Classe Object 4/4 Métodos (instância) que classes instanciáveis devem reescrever (3/3) public boolean equals(object obj) {... } de método reescrito... numa hierarquia de classes public class Pessoa { } private String nome; private int idade;... // superclasse 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 Class que representa classe do objeto recetor. public class Trabalhador extends Pessoa { } private String empresa;... public boolean equals(object obj){ if(!super.equals(obj) ) return false; Trabalhador t = (Trabalhador) obj; return empresa.equals( t.getempresa() ); } // subclasse Nelson Freire (ISEP DEI-PPROG 2015/16) 72/72