Você está na página 1de 14

Herança

O que é Herança
„ Visto até agora: reutilizamos classes através de
associação, agregação e composição
… Automovel usa Motor
… Pedido usa Item e Data
… Evento usa Data
… Aluno usa Disciplina

„ Classe que usa as outras contém instâncias das


outras: relação usa ou contém

1
O que é Herança
„ Outro tipo de relação: é um tipo de
„ Serve para reutilizar campos e métodos já criados,
descrevendo as diferenças entre classes existentes
e novas classes
„ Não aplicável aos exemplos anteriores
„ Também conhecida como relação de
generalização/especialização

Herança: Diagrama UML e detalhes


ClasseAncestral ClasseHerdeira

„ ClasseHerdeira herda todos os campos e métodos da


ClasseAncestral
„ Classe herdeira só pode acessar diretamente campos e
métodos públicos da classe ancestral!
„ Importância de métodos setXXX e getXXX para acessar
e modificar valores de campos

2
Herança: mais informações
„ Herança Múltipla: classe ClassePai

herdeira herda de duas ou ClasseFilha


mais classes ancestrais:
não existe em Java* ClasseMae

„ Uma classe ancestral pode


ter várias classes
descendentes
ItemDeBiblioteca LivroParaEmprestimo
„ Uma classe herdeira
pode ter, por sua vez,
outras classes MapaParaEmprestimo LivroRaroParaEmprestimo
herdeiras.

* Existe implementação de múltiplas interfaces, o que está fora do escopo deste curso.

Herança: exemplos
„ ContaEspecial é um tipo de
ContaBancaria
„ ContaPoupanca é um tipo de
ContaBancaria
„ Gerente é um tipo de Funcionario
„ LivroParaEmprestimo é um tipo de
ItemDoAcervo

3
Exemplo 1: ContaBancaria e ContaEspecial
ContaBancaria ContaEspecial
- n omeCo rrentista: String - l imite: double
- s aldo: double + C ontaEspecial(String,doubl e,double)
+ C ontaB ancaria(String,double) + g etSaldo():double
+ d eposi ta(double):void
+ r etira (double):void
+ g etSal do():double
+ g etNom e():String

„ ContaEspecial herdará todos os métodos de


ContaBancaria menos o construtor e mais os definidos para
ContaEspecial
„ Conta especial simulada como tendo saldo adicional (limite)
„ Problema: método getSaldo() de ContaBancaria não
serviria para ContaEspecial!
„ Solução: sobreposição do método.

Exemplo 1: classe ContaBancaria


public class ContaBancaria
{
private String nomeCorrentista;
private double saldo;
public ContaBancaria(String n,double s)
{
nomeCorrentista = n;
saldo = s;
}
public void deposita(double quantia)
{
saldo = saldo + quantia;
}

4
Exemplo 1: classe ContaBancaria
public void retira(double quantia)
{
if (quantia < saldo)
saldo = saldo - quantia;
}
public double getSaldo()
{
return saldo;
}
public String getNome()
{
return nomeCorrentista;
}
}

Exemplo 1: classe ContaEspecial


Indica qual classe será usada como base (ancestral) para herança

public class ContaEspecial extends ContaBancaria


{
private double limite;
public ContaEspecial(String n,double s,double l)
{
Chamada do construtor da classe
super(n,s); ancestral com os argumentos
limite = l;
deposita(limite); // simula dinheiro a mais !
}
public double getSaldo()
{
return super.getSaldo()-limite; // saldo verdadeiro
}
}
Chamada do método getSaldo da
classe ancestral

5
Exemplo 1: classe TesteContaEspecial
public class TesteContaEspecial
{
public static void main(String[] args)
{
ContaBancaria minha = new ContaBancaria("Eu",200);
minha.retira(120);
minha.retira(100);
System.out.println(minha.getSaldo()); // 80
ContaEspecial gugu =
new ContaEspecial("Gugu",10000,2000);
gugu.retira(5000);
gugu.retira(6000);
System.out.println(gugu.getSaldo()); // -1000
}
}

Herança: explicação do super


„ super representa a classe ancestral onde
necessário.
… Pode ser usado para acessar métodos e campos
públicos.
„ Regras para construtores:
… Chamar super sem nome de método, somente com
argumentos se existirem.
… Chamada do super deve ser a primeira instrução do
construtor da classe herdeira.
… Chamada do super (construtor) somente pode ser
feita por um construtor.

6
Herança: explicação do super
„ Regras para métodos:
… Chamar super.nomeDoMétodo com argumentos
se existirem
… Qualquer método público da classe ancestral pode ser
chamado a partir de qualquer método da classe
descenente
… Pode ser usado para distinguir entre métodos da classe
ancestral e métodos superpostos da própria classe

Exemplo 2: classe ContaPoupanca


ContaBancaria ContaPoupanca
- n omeCo rrentista: String - j urosAoMês: double
- s aldo: double + C ontaPoupanca(String,doubl e,double)
+ C ontaB ancaria(String,double) + a tualiza():void
+ d eposi ta(double):void
+ r etira (double):void
+ g etSal do():double
+ g etNom e():String

„ Herda praticamente tudo de ContaBancaria


„ Não sobrepõe nenhum método
„ Método atualiza calcula juros e atualiza saldo (deve
ser chamado todo mês)

7
Exemplo 2: classe ContaPoupanca
Indica qual classe será usada como base (ancestral) para herança

public class ContaPoupanca extends ContaBancaria


{
private double jurosAoMês;
public ContaPoupanca(String n,double s,double j)
{
Chamada do construtor da classe
super(n,s); ancestral com os argumentos
jurosAoMês = j;
}
Chamada do método getSaldo da
public void atualiza()
classe ancestral
{
double valor = getSaldo()*(jurosAoMês/100);
deposita(valor);
}
} Chamada do método deposita da
classe ancestral com o argumento

Exemplo 2: classe ContaPoupanca


public class TesteContaPoupanca
{
public static void main(String[] args)
{
ContaPoupanca cp =
new ContaPoupanca("Poupador",1000,2);
cp.atualiza(); // mais 20: 1020
cp.deposita(100); // mais 100: 1120
cp.atualiza(); // mais 22.40: 1142.40
cp.retira(100); // menos 100: 1042.40
}
}

8
Polimorfismo
„ Literalmente, várias formas
„ Se a classe X é um tipo de Y, podemos executar
operações em X como se fossem para Y
… Podemos declarar métodos com argumentos ou tipos
de retorno Y e passar ou retornar instâncias de X
… Podemos declarar objetos como sendo da classe Y e
inicializá-los (new) como sendo X
„ Se ContaEspecial é um tipo de
ContaBancaria podemos processá-los, sob
certas condições, da mesma forma

Exemplo de Polimorfismo – classe Item


public class Item
{
private String descrição;
private double custoUnitário;
private int unidadesCompradas;

public Item(String d,double c,int u)


{
descrição = d; custoUnitário = c; unidadesCompradas = u;
}
public double calculaTotal()
{
return custoUnitário * unidadesCompradas;
}
public void imprime()
{
System.out.print(unidadesCompradas+" unidades de ");
System.out.print(descrição+" a R$ ");
System.out.print(custoUnitário+" cada");
System.out.println();
}
}

9
Exemplo de Polimorfismo – classe Pedido
import java.util.Vector;

public class Pedido


{
private Data data;
private int código;
private Vector lista;

public Pedido(int c,Data d)


{
código = c; data = d;
lista = new Vector();
}

public void adicionaItem(Item i)


{
lista.add(i);
}

Exemplo de Polimorfismo – classe Pedido


public double calculaTotal()
{
double total = 0;
for(int i=0;i<lista.size();i++)
{
Item umItem = (Item)lista.get(i);
total = total + umItem.calculaTotal();
}
return total;
}

10
Exemplo de Polimorfismo – classe TestaPedido
public class TestaPedido
{
public static void main(String[] args)
{
Item i1 = new Item("Rebimbocas",1.5,10);
Item i2 = new Item("Parafusetas",2.8,5);
Item i3 = new Item("Traquetes",17,1);
Data hoje = new Data((byte)11,(byte)5,(short)2004);
Pedido p = new Pedido(1,hoje);
p.adicionaItem(i1);
p.adicionaItem(i2);
p.adicionaItem(i3);
System.out.println(p.calculaTotal()); // 46.0
}
}

Exemplo de Polimorfismo
„ Até aqui tudo bem, mas....
… E se tivermos outra categoria de item, cujo cálculo de
preço deve ser diferente?
… Quais classes devem ser modificadas?

„ Exemplos
… Eletrônicos tem taxa de 20% de seguro
… Livros podem ou não ser elegíveis para receber 10% de
desconto

11
Exemplo de Polimorfismo – classe Eletronico
public class Eletronico extends Item
{

public Eletronico(String d,double c,int u)


{
super(d,c,u);
}

public double calculaTotal()


{
return super.calculaTotal()*1.2; // +20 por cento
}

Exemplo de Polimorfismo – classe Livro


public class Livro extends Item
{
private boolean elegívelParaDesconto;

public Livro(String d,double c,int u,boolean e)


{
super(d,c,u);
elegívelParaDesconto = e;
}

public double calculaTotal()


{
if (elegívelParaDesconto)
return super.calculaTotal()*0.9; // 10 por cento
else
return super.calculaTotal(); // sem desconto
}

12
Exemplo de Polimorfismo
„ E se tivermos outra categoria de item, cujo cálculo
de preço deve ser diferente?
… Definimos uma classe que herda de Item e tem método
de cálculo diferenciado
„ Quais classes devem ser modificadas?
… Nenhuma! Se a classe Pedido sabe processar
instâncias de Item, saberá processar instâncias de
classes que herdam de Item automaticamente.
… Não precisamos encher a classe Item de ifs.

Exemplo de Polimorfismo – classe Pedido revista


import java.util.Vector;
public class Pedido
{
private Data data;
private int código;
private Vector lista;
Qualquer herdeiro de Item é um tipo
public Pedido(int c,Data d)
{ de Item
código = c; data = d;
lista = new Vector();
}
public void adicionaItem(Item i)
{
lista.add(i);
} Todos herdeiros de Item tem um
método calculaTotal()
public double calculaTotal()
{
double total = 0;
for(int i=0;i<lista.size();i++)
{
Item umItem = (Item)lista.get(i);
total = total + umItem.calculaTotal();
}
return total;
}
}

13
Exemplo de Polimorfismo – classe TestaPedido
public class TestaPedido
{
public static void main(String[] args)
{
Item i1 = new Item("Rebimbocas",1.5,10);
Item i2 = new Item("Parafusetas",2.8,5);
Item i3 = new Item("Traquetes",17,1);
Livro l1 = new Livro("Extreme Programming",100,2,true);
Livro l2 = new Livro("Pattern Recognition",120,1,false);
Eletronico e1 = new Eletronico("WordTank",1800,1);
Data hoje = new Data((byte)11,(byte)5,(short)2004);
Pedido p = new Pedido(1,hoje);
p.adicionaItem(i1);
p.adicionaItem(i2);
p.adicionaItem(i3);
p.adicionaItem(l1);
p.adicionaItem(l2);
p.adicionaItem(e1);
System.out.println(p.calculaTotal()); // 2506.0
}
}

Polimorfismo, dicas e truques


„ Se temos instâncias de várias classes no Vector, como
saber quem é quem ?
public int quantosLivros()
{
int total = 0;
for(int i=0;i<lista.size();i++)
{
Item umItem = (Item)lista.get(i);
if (umItem instanceof Livro) total++;
}
return total;
}

„ Note que não é necessário saber quem é quem para


executar métodos de herdeiros da classe Item.

14

Você também pode gostar