Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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
2
Herança: mais informações
Herança Múltipla: classe ClassePai
* 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
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;
}
}
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
}
}
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
7
Exemplo 2: classe ContaPoupanca
Indica qual classe será usada como base (ancestral) para herança
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
9
Exemplo de Polimorfismo – classe Pedido
import java.util.Vector;
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
{
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.
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
}
}
14