Herança

Propaganda
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
Manager boss = (Manager) staff[0];
• E se essa relação entre as classes não existir?
Conversão de Tipo Explícita (Cast)
• Converte a referência de um objeto de uma
classe para outra
Manager boss = (Manager) staff[0];
• E se essa relação entre as classes não existir?
– Utilizar o operador “instanceof” evita erros!
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:
Employee e;
Class c1 = e.getClass();
System.out.println(e.getClass.getName);
• Cria um novo objeto dessa classe, chamando o
construtor padrão:
Object obj = e.getClass().newInstance();
A Classe “Class”
• Identifica tipo em tempo de execução:
Employee e;
Class c1 = e.getClass();
System.out.println(e.getClass.getName);
• Cria um novo objeto dessa classe, chamando o
construtor padrão:
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.
Download