Beruflich Dokumente
Kultur Dokumente
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; } }
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.
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.
ESPECIFICADOR DE ACESSO
Existe um outro modificador de acesso, o
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; } // ... }
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());
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.
Referncias
Captulo 9 Programao Orientada a Objetos: herana; Captulo 10 Programao Orientada a Objetos:polimorfismo. Livro: Java Como Programar, Deitel & Deitel, 6. Edio;