Buscar

Herança e Reflexão em Java

Prévia do material em texto

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.

Continue navegando