Herança É-UM e TEM-UM Professora Lucélia Oliveira Herança (É-UM) • A herança na orientação a objetos, ocorre quando uma classe herda as características (variáveis e métodos) definidas em outra classe, chamada de ancestral ou superclasse. • O principal objetivo da herança é o reaproveitamento de código e conseqüentemente a redução de códigos reescritos desnecessariamente. Professora Lucélia Oliveira Herança • Por mais simples que seja uma aplicação em Java, praticamente todas usam a herança em seus códigos. Professora Lucélia Oliveira Exemplo de Diagrama de Classes da UML Professora Lucélia Oliveira A Classe Pessoa do diagrama apresentado no slide anterior: public class Pessoa { private String nome; public void setNome(String nome) { this.nome = nome; } public String getNome() { return (nome); } } Professora Lucélia Oliveira A Classe Pessoa possui uma variável de instância (nome) e dois métodos (setNome e getNome) para manipular o seu conteúdo. Classes PessoaFisica e PessoaJuridica public class PessoaFisica extends Pessoa { public class PessoaJuridica extends Pessoa { private String rg; private String cnpj; public void setRg(String rg) { this.rg = rg; } public void setCnpj(String cnpj) { this.cnpj = cnpj; } public String getRg() { return (rg); } } } public String getCnpj() { return (cnpj); } As Classes PessoaFisica e PessoaJuridica estendem a funcionalidade da classe Pessoa adicionando uma variável em cada e dois métodos. Professora Lucélia Oliveira Classes Funcionario public class Funcionario extends PessoaFisica { private int cartao; public void setCartao(int cartao) { this.cartao = cartao; } public int getCartao() { return (cartao); } } Professora Lucélia Oliveira A Classe Funcionario herda todas as características da classe PessoaFisica que , por sua vez, herda as características da classe Pessoa. • Se a superclasse Pessoa for alterada, essas alterações serão refletidas nas classes PessoaFisica, PessoaJuridica e Funcionario, sem a necessidade de alterar o código das classes, são como engrenagens que se encaixam umas nas outras. Professora Lucélia Oliveira Classe que contém o método main() public class UsaFuncionario { public static void main(String args[]) { Funcionario funcionario = new Funcionario( ); funcionario.setNome("Samuel"); funcionario.setRg("10.243.897-x"); funcionario.setCartao("FN100"); System.out.println(funcionario.getNome( )); System.out.println(funcionario.getRg( )); System.out.println(funcionario.getCartao( )); }} Professora Lucélia Oliveira Na terminologia da OO, você pode dizer: • Pessoa é a superclasse de PessoaFisica e PessoaJuridica; • PessoaFisica é uma subclasse de Pessoa; • Funcionario é uma subclasse de PessoaFisica; • PessoaFisica é superclasse de Funcionario; • PessoaFisica herda de Pessoa; • Funcionario é derivado de PessoaFisica; • PessoaFisica é derivada de Pessoa; • Funcionario é um subtipo de PessoaFisica Professora Lucélia Oliveira Relacionamento (TEM-UM) • Os relacionamentos tem-um são baseados na utilização, em vez de herança. • A classe A tem-um B ocorrerá quando o código da classe A apresentar uma referência a uma instância da classe B. Professora Lucélia Oliveira Relacionamento (TEM-UM) • Exemplo: Um cavalo É-UM animal. Um cavalo TEM-UMA rédea. E o código teria um formato assim: public class Animal{ } public class Cavalo extends Animal{ private Redea minhaRedea; } public class Redea{ ...} Professora Lucélia Oliveira Relacionamento (TEM-UM) Professora Lucélia Oliveira • O objetivo da ênfase no projeto apropriado é simples: redução de custos. • O custo de distribuição de um sistema mal projetado é 10 vezes mais caro. • Até os melhores projetistas que usam o modelo orientado a objetos cometem erros. Quando os erros são descobertos durante a fase de implementação de um projeto, a quantidade de códigos a ser reescrita pode fazer com que equipes de desenvolvimento tenham que começar tudo do zero. Professora Lucélia Oliveira Polimorfismo • O uso do polimorfismo pressupõe duas condições: a existência de herança entre as classes e a redefinição de métodos nas classes. • Para caracterizar um polimorfismo, é necessário que as classes possuam métodos com a mesma assinatura, isto é, retorno, nome e argumentos, porém, com funcionalidades diferentes. Professora Lucélia Oliveira Polimorfismo • Utilizando o polimorfismo, uma classe mais genérica (uma superclasse) pode assumir diferentes comportamentos, gerando objetos diferentes dependendo da implementação do método. Professora Lucélia Oliveira • Exemplo: • Vamos criar um método polimórfico chamado mostraClasse, que utilize, em todas as classes: – o mesmo nome: mostraClasse; – o mesmo retorno: void; – os mesmos argumentos: no caso nenhum ( ) public void mostraClasse( ) { System.out.println(“classe nome-da-classe”); } Professora Lucélia Oliveira Agora vamos criar uma classe para executar os métodos polimórficos: package heranca; import javax.swing.JOptionPane; public class Polimorfismo { public static void main(String args[]){ Pessoa pessoa = null; String tip; int tipo; tip = JOptionPane.showInputDialog("Qual o construtor deseja utilizar? "+ "\n1- Pessoa\n2 PessoaFisica\n3 - PessoaJuridica \n4 Funcionario"); tipo = Integer.parseInt(tip); switch (tipo){ case 1: pessoa = new Pessoa(); break; case 2: pessoa = new PessoaFisica(); break; case 3: pessoa = new PessoaJuridica(); break; case 4: pessoa = new Funcionario(); break; default: System.out.println("Tipo desconhecido!"); } pessoa.mostraClasse(); }} Professora Lucélia Oliveira Métodos Sobrecarregados • Devem alterar a lista de argumentos; • Podem alterar o tipo de retorno; • Podem alterar o modificador de acesso; Professora Lucélia Oliveira