Sie sind auf Seite 1von 39

HERANA E POLIMORFISMO

Professora: Lcia Saccomori

O PROBLEMA DA REPETIO DE CDIGO


Um Banco possui funcionrios. Um modelo bsico da classe Funcionrio seria como segue abaixo.
public class Funcionario { private String nome; private String cpf; private double salario; }

O PROBLEMA DA REPETIO DE CDIGO


Alm de um funcionrio comum, h tambm outros cargos Os gerentes guardam a mesma informao que um funcionrio comum, mas possuem outras informaes, alm de ter funcionalidades um pouco diferentes. Um gerente possui tambm uma senha numrica que permite o acesso ao sistema interno do banco. Uma classe Gerente bsica poderia ser como segue.

public class Gerente { private String nome; private String cpf; private double salario; private int senha; public boolean autenticar (int senha) { if (this.senha == senha) { return true; } else { return false; } } public int getSenha() { return senha; } public void setSenha(int senha) { this.senha = senha; } }

preciso mesmo trabalhar com classes diferentes?


Pode-se deixar a classe Funcionario mais genrica, mantendo nela senha de acesso. Caso um funcionrio no seja um gerente, o atributo senha ficar vazio. Essa uma possibilidade. Mas e em relao aos mtodos? A classe Gerente tem o mtodo autenticar(), que no faz sentido existir em um funcionrio que no gerente. Seguindo tal raciocnio melhor deixar as classes separadas.

Herana
Existe um jeito, em Java, e na prpria orientao a objetos, de relacionar classes de tal maneira que uma delas herda tudo que a outra tem. Isto uma relao de classe me e classe filha. A herana uma forma de reutilizao de software na qual uma nova classe criada, absorvendo membros de uma classe existente e aprimorada com capacidades novas ou modificadas.

Extends
No exemplo o Gerente tem tudo que um Funcionario tem, isto , que ela seja uma extenso de Funcionario (pois habitual dizer-se que uma subclasse estende uma superclasse). Isto ocorre atravs da palavra-chave extends, e pode ser observado no exemplo a seguir.

extends
A sintaxe para uso de extends a seguinte:

public class Gerente extends Funcionario { private int senha; public boolean autenticar (int senha) { if (this.senha == senha) { return true; } else { return false; } } public int getSenha() { return senha; } public void setSenha(int senha) { this.senha = senha; } }

import javax.swing.JOptionPane; public class Principal { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Gerente gerente = new Gerente(); gerente.setNome("Joo da Silva"); gerente.setSenha(4231); boolean senha = gerente.autenticar(4231);

A classe Gerente herda todos os atributos e mtodos da classe me, no caso, a Funcionrio. Ela tambm herda os atributos e mtodos privados, porm no consegue acess-los diretamente, transmitindo a impresso de que no os herdou. Da mesma maneira pode-se ter uma classe Diretor que estenda Gerente, e a classe Presidente pode estender diretamente de Funcionrio.

if (senha ==true){ JOptionPane.showMessageDialog (null,"senha OK"); }else { JOptionPane.showMessageDialog (null,"senha Invlida"); } } }

Herana
Uma classe pode ter vrias filhas, mas pode ter apenas uma me, a chamada herana simples do Java. O Java no suporta herana mltipla. A nomenclatura mais encontrada que Funcionrio a superclasse de Gerente, e Gerente a subclasse de Funcionrio.

ESPECIFICADOR DE ACESSO
Sobre os especificadores de acesso j estudados: public As caractersticas de uma classe so acessveis onde quer que o programa tenha uma referncia a um objeto dessa classe ou uma de suas subclasses; private As caractersticas de uma classe s so acessveis dentro da prpria classe, nem mesmo sendo acessados pelas suas subclasses.

E se for preciso acessar os atributos herdados?

ESPECIFICADOR DE ACESSO
Existe um outro modificador de acesso, o

protected, que fica entre o private e


o public. Um atributo protected s pode ser acessado (visvel) pela prpria classe, suas subclasses, ou outras classes do mesmo pacote.

protected
protected a palavra-chave que permite atribuir tal caracterstica de encapsulamento a atributos e mtodos de uma classe. A linguagem Java permite que certos dados sejam encapsulados de forma a estarem disponveis apenas entre classes de uma mesma hierarquia, estando protegidos de acesso pblico.

UML
Vale relembrar a semntica relacionada aos smbolos utilizados para representar o nvel de encapsulamento de um atributo ou mtodo, de acordo com a terminologia da linguagem UML

protected
class Funcionario { protected String nome; protected String cpf; protected double salario; // mtodos devem vir aqui }

REESCRITA DE MTODO
Todo fim de ano, os funcionrios do banco recebem uma bonificao. Os funcionrios comuns recebem 10% do valor do salrio e os gerentes, 15%. A classe Funcionrio deve ficar assim:

class Funcionario { private String nome; private String cpf; private double salario; public double getBonificacao() { return this.salario * 0.10; }

REESCRITA DE MTODO
Se a classe Gerente ficar como ela est, vai herdar o mtodo getBonificacao(). Vai apresentar um resultado em cima da bonificao do funcionrio e no do gerente. Para consertar isso, uma das opes seria criar um novo mtodo na classe Gerente, chamado, por exemplo, getBonificacaoDoGerente().

REESCRITA DE MTODO
O problema que agora teria-se dois mtodos em Gerente com funcionalidades similares, confundindo bastante quem for usar essa classe, alm de que cada um apresenta uma resposta diferente.

override
No Java, quando herda-se um mtodo, podese alterar seu comportamento. Ou seja, podese reescrever (sobrescrever, override). Para sobrescrever um mtodo de superclasse, uma subclasse deve declarar um mtodo com a mesma assinatura (nome do mtodo, nmero de parmetros e tipos de parmetro) do mtodo correspondente na superclasse.

override
A utilidade se d no fato do programador poder criar um comportamento prprio a um mtodo aps sobrescrev-lo, quando o respectivo mtodo da superclasse no suficiente.

override
Outra restrio em relao ao especificador de acesso: no possvel sobrescrever o mtodo com um especificador de acesso mais restritivo na subclasse, isso ocorre para manter o fato de que uma subclasse uma superclasse e portanto deve apresentar as mesmas caractersticas.

override
E a classe Gerente apresentaria o cdigo:
class Gerente extends Funcionario { int senha; public double getBonificacao() { return this.getSalario() * 0.15; } // ... }

Invocando o mtodo reescrito


Depois de reescrito, no possvel chamar o mtodo antigo que fora herdado da classe me (Funcionario), quando se estiver em um objeto-cliente que acesse um objeto Gerente. Realmente alteramos o seu comportamento. Mas possvel invoc-lo no caso de se estar dentro da prpria classe Gerente.

POLIMORFISMO
a capacidade de um objeto poder ser referenciado de vrias formas. Juntamente com a herana, a reescrita de mtodo diminuem o acoplamento entre as classes, para evitar que novos cdigos resultem em modificaes em inmeros lugares.

Construtores
No funcionamento do mecanismo de herana com um construtor padro, os construtores da superclasse e subclasses no possuem argumentos, o compilador descobre facilmente que deve chamar implicitamente o construtor da superclasse.

Construtor parametrizado
public class Funcionario { protected String nome; protected String cpf; public Funcionario(String nome){ this.nome = nome; } public String getNome() { return nome; } }

Construtor parametrizado
import javax.swing.JOptionPane; public class Principal { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Funcionario funcionario = new Funcionario("AAAAAA"); JOptionPane.showMessageDialog (null,funcionario.getNome()); }

super
Por outro lado, quando h construtores parametrizados, o compilador no faz este trabalho implcito, impondo ao programador que realize uma chamada ao construtor
correto atravs da palavrachave

super.

super
public class Dependente extends Funcionario { private int idade; private String nomeMae; private String nomePai; public Dependente(){ super("BBBBB"); } }

import javax.swing.JOptionPane; public class Principal { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Funcionario funcionario = new Funcionario("AAAAAA");
JOptionPane.showMessageDialog (null,funcionario.getNome());

Dependente dependente = new Dependente(); JOptionPane.showMessageDialog (null,dependente.getNome()); } }

Evitando a Herana
A palavra-chave final possui basicamente trs tipos de utilizao na linguagem Java:
1. Criao de atributos constantes em classes, de forma que ao ser declarado como final, o atributo tem de receber um valor no ato da declarao, que no vai poder ser modificado ao longo do programa (esta a forma que a linguagem permite definir constantes).

Evitando a Herana
2.Marcao de mtodos de tal forma que eles que no possam ser sobrescritos em subclasses, ou seja, o comportamento do mtodo permanece o mesmo em qualquer subclasse derivada da classe que o definiu. 3.Marcao de classes para que as mesmas no possam servir como base de uma herana. Isso significa que uma classe final no pode ser superclasse de nenhuma outra.

Atributo bloqueada para Herana


public class Carro {
public final int numeroDeRodas = 4; }

Mtodo bloqueada para Herana


public class Transacao {
public final boolean verificarSenha() { ... } }

Classe bloqueada para Herana


public final class Imutavel {} se public class Impossivel extends Imutavel {} Ocorre erro de compilao

Referncias
Captulo 9 Programao Orientada a Objetos: herana; Captulo 10 Programao Orientada a Objetos:polimorfismo. Livro: Java Como Programar, Deitel & Deitel, 6. Edio;

Das könnte Ihnen auch gefallen