PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤...

20
06/04/17 1 MC302 PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇA Esther Luna Colombini – Instituto de Computação (Unicamp) Esther Luna Colombini – Instituto de Computação (Unicamp) Generalização e Herança ¨ Relação do tipo generalização/especialização ¤ Objetos de um elemento especializado (um filho) podem ser substituídos por objetos do elemento geral (o pai) ¤ É uma maneira natural de modelar o mundo real ¤ Relação transitiva e anti-simétrica entre classes ¤ A modelagem pode ser testada verificando se o elemento especializado é do tipodo elemento geral ¨ Generalização ¤ nome do relacionamento ¨ Herança ¤ mecanismo que implementa o relacionamento 2 MC302

Transcript of PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤...

Page 1: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

1

MC302

PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇA

Esther Luna Colombini – Instituto de Computação (Unicamp)

Esther Luna Colombini – Instituto de Computação (Unicamp)

Generalização e Herança

¨  Relação do tipo generalização/especialização ¤  Objetos de um elemento especializado (um filho) podem ser

substituídos por objetos do elemento geral (o pai) ¤  É uma maneira natural de modelar o mundo real ¤  Relação transitiva e anti-simétrica entre classes ¤  A modelagem pode ser testada verificando se o elemento

especializado “é do tipo” do elemento geral

¨  Generalização ¤  nome do relacionamento

¨  Herança ¤  mecanismo que implementa o relacionamento

2

MC302

Page 2: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

2

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança

¨  Herança é o mecanismo através do qual elementos mais específicos incorporam a estrutura e comportamento de elementos mais gerais ¤  Super-Classe (classe mãe ou classe base) - Elemento mais geral utilizado

para evitar as redundâncias de descrição. ¤  Sub-Classe (classe filha ou classe) Elemento mais específico utilizado para

descrever as particularidades das classes.

¨  A sub-classe pode ser utilizada onde a super-classe é mas não o contrário.

¨  Serve para reutilizar campos e métodos já criados, descrevendo as diferenças entre classes existentes e novas classes

¨  Um objeto de uma subclasse também é um objeto de uma superclasse.

3

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança

¨  Atributos, operações e relacionamentos comuns devem ser representados no mais alto nível da hierarquia

¨  O que é herdado: ¤ As sub-classes criadas herdam o estado (atributos e

relacionamentos) e o comportamento (operações) da(s) super-classe(s) associada(s) (herança simples ou múltipla)

¤ As sub-classes podem incluir, alterar ou suprimir atributos, operações e relacionamentos da super-classe

¤ Os métodos construtores não herdados, mas são acessíveis às subclasses

4

MC302

Page 3: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

3

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança 5

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança 6

¨  Classe primordial Object ¤ Em Java, a classe Object é denominada classe

primordial, pois não possui superclasse e é superclasse de todas as demais classes.

¤ Uma hierarquia de classes começa com a classe Object (pacote java.lang), a partir da qual todas as classes herdam direta ou indiretamente.

¤ Os métodos da classe Object são herdados por todas as classes.

MC302

Page 4: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

4

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Representação

¨  ClasseHerdeira herda todos os campos e métodos da ClasseAncestral

¨  Classe herdeira só pode acessar diretamente campos e métodos públicos da classe ancestral!

¨  Importância de métodos setXXX e getXXX para acessar e modificar valores de campos

ClasseHerdeiraClasseAncestral

7

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Herança Múltipla

¨  Herança Múltipla: classe herdeira herda de duas ou mais classes ancestrais: não existe em Java*

¨  Uma classe ancestral pode ter várias classes descendentes

¨  Uma classe herdeira pode ter, por sua vez, outras classes herdeiras.

ClasseFilha

ClasseMae

ClassePai

ItemDeBiblioteca

MapaParaEmprestimo

LivroParaEmprestimo

LivroRaroParaEmprestimo

8

MC302

Page 5: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

5

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Exemplos

¨  ContaEspecial é um tipo de ContaBancaria ¨  ContaPoupanca é um tipo de ContaBancaria ¨  Gerente é um tipo de Funcionario ¨  LivroParaEmprestimo é um tipo de ItemDoAcervo

9

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 1

¨  ContaEspecial herdará todos os métodos de ContaBancaria menos o construtor e mais os definidos para ContaEspecial

¨  Conta especial simulada como tendo saldo adicional (limite)

¨  Problema: método getSaldo() de ContaBancaria não serviria para ContaEspecial!

¨  Solução: sobrescrita do método.

MC302

ContaBancaria ContaEspecial- nomeCorrentista: String- saldo: double

- limite: double

+ ContaBancaria(String,double)+ deposita(double):void+ retira(double):void+ getSaldo():double+ getNome():String

+ ContaEspecial(String,double,double)+ getSaldo():double

10

Page 6: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

6

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 1: ContaBancaria

MC302

11

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 1: ContaEspecial

MC302

12

Indica qual classe será usada como base (ancestral) para herança

Chamada do construtor da classe ancestral com os argumentos

Chamada do método getSaldo da classe ancestral

Page 7: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

7

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança 13

¨  A subclasse ContaEspecial possui os atributos e métodos da superclasse ContaBancaria, mas o adicional da subclasse só implementa o que for necessário na mesma ¤  Isso torna o código da subclasse mais fácil de entender ¤  tem um atributo a mais que a superclasse

n  limite

13

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Construtores 14

¨  Os métodos construtores não herdados, mas são acessíveis às subclasses ¤  Chamada de construtores da superclasse

n  A primeira tarefa de um construtor de uma subclasse é chamar o construtor da superclasse, explícita ou implicitamente, para assegurar que as variáveis de instância herdadas serão inicializadas corretamente

n  Se o construtor da subclasse não chama o construtor da superclasse explicitamente, então o compilador gera uma instrução que chama o construtor default ou o construtor sem argumento da superclasse. Se não houver tal construtor na superclasse ocorre um erro de compilação

n  A chamada explícita de um construtor de superclasse deve ser a primeira instrução a ser chamada no construtor da subclasse e sua sintaxe é fornecida a seguir:

n  super(argumentos);

14

MC302

Page 8: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

8

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Sobrescrita de métodos 15

¨  Sobrescrita (override) está diretamente relacionada à herança

¨  Permite especializar os métodos herdados das superclasses, alterando o seu comportamento nas subclasses por um mais específico.

¤  Cria-se um novo método na classe filha contendo a mesma assinatura e mesmo tipo de retorno do método sobrescrito

¤  O método deve possuir a mesma assinatura n  nome n  quantidade de parâmetros n  tipo de parâmetros

¨  Tipo de retorno

¤  pode ser um subtipo do tipo de retorno do método sobrescrito n  exemplo: List (superclasse) -> ArrayList (subclasse)

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Sobrescrita de métodos 16

¨  Como se sabe que método invocar? ¤ Primeiramente busca-se um método com o nome indicado

na classe atual ¤ Caso o método exista na subclasse, este método será

executado ¤ Caso contrário, busca-se e se o método na superclasse

MC302

Método da superclasse Método da subclasse

Page 9: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

9

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: anotação @Override 17

¨  Podemos deixar explícito no código que determinado método é a reescrita de um método da sua classe mãe. ¤  Isso pode ser feito colocando @Override em cima do

método. Isso é chamado anotação. Existem diversas anotações e cada uma vai ter um efeito diferente sobre seu código

¤  Por questões de compatibilidade, esta anotação não é

obrigatória, mas caso um método esteja anotado com @Override, ele necessariamente precisa estar sobrescrevendo um método da classe mãe.

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Ocultamento de métodos 18

¨  Ocultamento de métodos de classes: ¤ Se uma subclasse redefine um método estático da

superclasse, então esse processo é denominado ocultamento (hiding)

¤ A diferença entre sobreposição e ocultamento de métodos possui implicações importantes: n O método de instância executado quando há uma

sobreposição será o método declarado na classe mais especializada (subclasse) referente ao objeto.

n O método estático executado quando há um ocultamento depende exclusivamente de onde partiu a chamada, seja ela da superclasse ou da subclasse.

MC302

Page 10: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

10

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Ocultamento de métodos 19

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Ocultamento de atributos 20

¨  Ocultamento de atributos: ¤ Ocultamento também ocorre com atributos, estáticos ou

de instância, quando a subclasse declara um atributo com a mesma identificação de um atributo da superclasse. n Ocultar um atributo é diferente de sombrear um atributo, pois

o primeiro ocorre em uma relação subclasse/superclasse, enquanto o segundo se verifica entre um atributo e um parâmetro ou variável local da mesma classe.

n Ocultamento de atributos é uma má prática de programação, pois diminui a legibilidade do código.

MC302

Page 11: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

11

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Ocultamento de atributos 21

MC302

¨  No atributo estático, o que prevalece é a classe de referência e não a que foi efetivamente instanciada.

Esther Luna Colombini – Instituto de Computação (Unicamp)

Sobrescrita x Sobrecarga 22

¨  Sobrescrita ¤  Mesmo nome

¤  Mesma assinatura

¤  Requer herança

¨  Sobrecarga

¤  Mesmo nome

¤  Assinaturas diferentes (ordem ou tipo dos parâmetros – não inclui o retorno)

¤  Mesma classe ou na hierarquia

MC302

Sobrecarga

Sobrescrita

Page 12: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

12

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 1: Main

MC302

23

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: super

¨  Regras para métodos: ¤ Chamar super.nomeDoMétodo com argumentos se existirem ¤ Qualquer método público da classe ancestral pode ser

chamado a partir de qualquer método da classe descendente

¤  Pode ser usado para distinguir entre métodos da classe ancestral e métodos superpostos da própria classe

¤  super representa a classe ancestral onde necessário ¤  Pode ser usado para acessar métodos e campos públicos ¤  Só pode ser usado com relação à classe imediatamente

superior n  super.super.metodoInstancia(); L Não!!!!

MC302

24

Page 13: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

13

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 2: ContaPoupanca

¨  Herda praticamente tudo de ContaBancaria ¨  Não sobrepõe nenhum método

¨  Método atualiza calcula juros e atualiza saldo (deve ser chamado todo mês) ContaBancaria ContaPoupanca

- nomeCorrentista: String- saldo: double

- jurosAoMês: double

+ ContaBancaria(String,double)+ deposita(double):void+ retira(double):void+ getSaldo():double+ getNome():String

+ ContaPoupanca(String,double,double)+ atualiza():void

MC302

25

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 2: ContaPoupanca

MC302

26

Indica qual classe será usada como base (ancestral) para herança

Chamada do construtor da classe ancestral com os argumentos

Chamada do método getSaldo da classe ancestral

Chamada do método deposita da classe ancestral com o argumento

Page 14: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

14

Esther Luna Colombini – Instituto de Computação (Unicamp)

Exemplo 2: Main

MC302

27

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Circularidade de Herança 28

MC302

¨  Circularidade de Herança ¤ Dada a hieraquia ao lado: ¤ Uma classe A não pode herdar de C

devido à circularidade na herança de classes, ou seja, a classe C é subclasse e superclasse de A.

A

B

C

Page 15: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

15

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Visibilidade 29

¨  O modificador de acesso protected oferece uma visibilidade intermediária entre public e private. ¤ As entidades (métodos, atributos e classes internas) de uma

superclasse com acesso protected podem ser acessados pela superclasse, subclasses e classes do mesmo pacote que a superclasse (<= ruim)

¤ Uma subclasse mantém os modificadores de acesso das entidades da superclasse

¤ Atributos protected tem um acesso mais eficiente nas subclasses por não precisarem de métodos de acesso. No entanto, na maior parte dos casos, é recomendável o uso de atributos private, promovendo as boas práticas de encapsulamento que tornam o código mais fácil de manter, modificar e depurar.

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: Visibilidade 30

¨  Redução de visibilidade ¤ Não é possível reduzir a visibilidade de um método em

uma sobrescrita n Um método definido como public na superclasse só pode ser

sobrescrito como public n A promoção da visibilidade porém, pode ocorrer

n  Um método definido como protected em uma superclasse pode ser sobrescrito como public

MC302

Page 16: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

16

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: classe Object 31

¨  A classe Object é superclasse de todas as classes, exceto dela mesma, dado que a classe Object não é subclasse de ninguém ¤  Ao criar uma nova classe, se não for especificado uma superclasse,

implicitamente a nova classe herdará da classe Object, o que equivale a incluir extends Object na declaração da nova classe.

¤  Podemos sobrescrever métodos da classe Object: n  clone: Esse método realiza uma cópia do objeto (Não é usado

diretamente). n  equals: Esse método compara se dois objetos são iguais. n getClass: Todo objeto em Java tem acesso à própria classe a

que pertence (propriedade conhecida como reflexão). n hashcode: são valores int que representam uma chave do

objeto, n  toString: Esse método retorna uma representação String de um

objeto.

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Herança: classe Object 32

MC302

Page 17: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

17

Esther Luna Colombini – Instituto de Computação (Unicamp)

A palavra final 33

¨  A palavra final também pode ser usada, em diferentes circunstâncias: ¤ Quando usada na definição de uma variável, significa

que a variável não pode assumir outro valor, tornando-se uma constante.

¤ Quando usada na definição de um método, significa que o método não poderá ser sobrescrito.

¤ Quando usada na definição de uma classe, significa que a classe não vai admitir herança.

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

A palavra final 34

¨  Variáveis de instância: ¤ Podem ser inicializadas, mesmo não sendo de classe.

Entretanto, não pode ser mais alteradas.

MC302

Page 18: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

18

Esther Luna Colombini – Instituto de Computação (Unicamp)

A palavra final 35

¨  Variáveis de instância:

¨  Varáveis de classe: também podem receber o modificador final. Torna a variável uma constante.

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

A palavra final 36

¨  Métodos de instância:

MC302

Page 19: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

19

Esther Luna Colombini – Instituto de Computação (Unicamp)

A palavra final 37

¨  Classes:

MC302

Esther Luna Colombini – Instituto de Computação (Unicamp)

Atividades extra-classe 38

Aula 7 ¨  Atividades •  Exercícios:

•  Quando devemos usar herança? O que é herdado?

•  Proponha uma hierarquia de classes que envolva:

•  1 superclasse •  2 subclasses •  Sobrescrita de métodos

MC302

Page 20: PROGRAMAÇÃO ORIENTADA A OBJETOS AULA 7 – HERANÇAesther/teaching/2017s1/mc302/Aula7.pdf · ¤ Em Java, a classe Object é denominada classe primordial, pois não possui superclasse

06/04/17

20

Esther Luna Colombini – Instituto de Computação (Unicamp)

Referências 39

Aula 7 ¨  Java: Como Programar, Paul Deitel & Heivey Deitel; Pearson; 7a. Ed

¨  Object-Oriented Programming with Java: An Introduction, David J. Barnes; Prentice Hall (2000).

MC302