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.