aula 9 – herança
TRANSCRIPT
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?
Sobrescrita ou sobreposição de métodos!
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