Aula 9 – Herança

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

Transcript of Aula 9 – Herança

Aula 9 – Herança

Prof. Jefersson Alex dos Santos

Roteiro

• Introdução

• Conversão de tipo explícita (Cast)

• Acesso Protegido

• A classe Object

• A classe Class

• Reflexão

• Recomendações de Projeto

Herança

• Técnica necessária para derivar novas classes a partir de classes existentes

• Técnica essencial em Java

• Conceito essencial para quem vem de uma linguagem “estruturada”, baseada em procedimentos

Exemplo: Gerente e Empregado

• Palavra-chave “extends”

• Superclasse

• Subclasse

As subclasses tem mais dados e funcionalidades que as superclasses!

Palavra-chave “super”

• Chama o construtor da superclasse

• Todo construtor de uma subclasse precisa chamar os construtores da superclasse

• A chamada “super” deve ser sempre a primeira instrução de um construtor

• O que acontece se isso não for feito explicitamente?

• Por que isso é necessário?

Subclasse X Superclasse

• Uma subclasse sempre usa os métodos da superclasse

• Quando se implementa uma subclasse por herança, basta indicar as diferenças

– A capacidade de reutilizar métodos é automática

Aproveitamento de funcionalidades!

Exemplo: Gerente e Empregado

• Como computar aumento de salário?

Exemplo: Gerente e Empregado

• Como computar aumento de salário?

Sobrescrita ou sobreposição de métodos!

Hierarquia de Heranças

• Qual o limite de heranças ?

Hierarquia de Heranças

• Qual o limite de heranças ?

• Não há limites. Exemplo:

Quando Usar Herança ?

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

– Códigos da subclasse são utilizáveis em qualquer parte que use a superclasse

– O inverso geralmente é falso!

Evitando Herança

• Classes e métodos “final”

– Em classes, evita herança

– Em métodos, evita sobreposição

• Motivos:

– Eficiência: chamadas a procedimentos são caras, o compilador substitui por chamadas inline

– Segurança: evita ambiguidades nas chamadas aos métodos

Conversão de Tipo Explícita (Cast)

• Converte a referência de um objeto de uma classe para outra

• E se essa relação entre as classes não existir?

Manager boss = (Manager) staff[0];

Conversão de Tipo Explícita (Cast)

• Converte a referência de um objeto de uma classe para outra

• E se essa relação entre as classes não existir?

– Utilizar o operador “instanceof” evita erros!

Manager boss = (Manager) staff[0];

Conversão de Tipo Explícita (Cast)

• Em geral, não é uma boa ideia

– Fonte de erros!

– Os métodos da subclasse são os mesmos da superclasse (sobrescritos, em alguns casos)

• Única razão:

– Usar métodos que só existem na subclasse

• Útil na implementação de plugins!

Classes Abstratas

• Palavra-chave “abstract”

– Indica que um método não pode ser especificado nessa classe

• Podem conter dados e métodos concretos

• Ajuda a combinar e reunir operações comuns

• Funciona como um modelo

• “Guardam lugar” para métodos

Classes Abstratas

• Não se podem criar objetos a partir de classes abstratas

• Pode-se criar variáveis objetos (apontadores)

Person p = new Employee();

Classes Abstratas

• Não se podem criar objetos a partir de classes abstratas

• Pode-se criar variáveis objetos (apontadores)

Person p = new Employee();

Object: A Superclasse Cósmica

• Todas as classes derivam de “Object”

• Não é necessário herdar explicitamente

• Serviços:

– Útil em múltiplas linhas de execução (threads)

– Útil como container genérico

– Possui o método equals(Object obj)

– Possui o método toString()

Object: A Superclasse Cósmica

• Todas as classes derivam de “Object”

• Não é necessário herdar explicitamente

• Serviços:

– Útil em múltiplas linhas de execução (threads)

– Útil como container genérico

– Possui o método equals(Object obj)

– Possui o método toString()

A Classe “Class”

• Identifica tipo em tempo de execução:

• Cria um novo objeto dessa classe, chamando o construtor padrão:

Employee e;

Class c1 = e.getClass();

System.out.println(e.getClass.getName);

Object obj = e.getClass().newInstance();

A Classe “Class”

• Identifica tipo em tempo de execução:

• Cria um novo objeto dessa classe, chamando o construtor padrão:

Employee e;

Class c1 = e.getClass();

System.out.println(e.getClass.getName);

Object obj = e.getClass().newInstance();

Muito útil para fazer sistemas que aceitam plugins!

Reflexão

• Permite manipular códigos dinamicamente

• Permite analisar os recursos das classes em tempo de execução

• Implementa código genérico de manipulação de arrays

• Permite a utilização de objetos “Method”, que funcionam como ponteiros de funções em C++

Herança: Recomendações de Projeto

1. Coloque operações e campos comuns na superclasse

2. Use herança para modelar uma relação de “estar contido em”

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

4. Use polimorfismo quando métodos apresentam conceito comum

Herança Múltipla

• Conceito de herança de duas ou mais classes

• Pode levar a uma codificação confusa que dificultaria a manutenção do código.

• Não é permitido em Java:

– “interfaces” é a maneira com que Java lida com situações em que é necessária

Referências

• C. S. HORSTMANN, G. CORNELL. Core Java 2: Volume I – Fundamentos. Capítulos 5 e 6.