Classes Abstratas
• Um caso em que não faz sentido ter um objeto, apesar
da classe existir:
– imagine a classe Pessoa e duas filhas, PessoaFisica e
PessoaJuridica.
– Quando puxamos um relatório de nossos clientes (uma
array de Pessoa por exemplo), queremos que cada um
deles seja ou uma PessoaFisica, ou uma PessoaJuridica.
– A classe Pessoa, nesse caso, estaria sendo usada apenas
para ganhar o polimorfismo e herdar algumas coisas: não
faz sentido permitir instanciá-la.
• Para resolver esses problemas, temos as classes
abstratas.
Classes Abstratas
• Usamos a palavra chave abstract para impedir
que uma classe possa ser instanciada.
• Ela é uma classe que apenas idealiza um tipo,
define apenas um rascunho.
Classes Abstratas
• Servem para aplicar o polimorfismo e herança
dos atributos e métodos, que são recursos
muito poderosos.
Métodos Abstratos
• Cada classe filha terá um método diferente de
bonificação
– Queremos que cada pessoa que escreve a classe
de um Funcionario diferente (subclasses
de Funcionario) reescreva o
método getBonificacao de acordo com as suas
regras.
Métodos Abstratos
• Existe um recurso em Java que, em uma classe
abstrata, podemos escrever que determinado
método será sempre escrito pelas classes filhas.
Isto é, um método abstrato.
• Ele indica que todas as classes filhas (concretas,
isto é, que não forem abstratas) devem
reescrever esse método ou não compilarão. É
como se você herdasse a responsabilidade de ter
aquele método
Classes Abstratas + Métodos Abstratos
• Repare que não colocamos o corpo do método e usamos a
palavra chave abstract para definir o mesmo.
• Esse método nunca vai ser chamado, sempre que alguém
chamar o método getBonificacao, vai cair em uma das suas
filhas, que realmente escreveram o método.
• Qualquer classe que estender a classe Funcionario será
obrigada a reescrever este método, tornando-o "concreto".
Se não reescreverem esse método, um erro de compilação
ocorrerá.
• Uma classe abstrata não precisa necessariamente ter um
método abstrato.
Exercício
• Implemente com o uso de interface gráfica em
Swing e classes abstratas um programa que
modele a seguinte situação:
– Uma Conta Corrente possui seu saldo atual, que
corresponde a 99% do valor corrente disponível,
devido a impostos cobrados.
– Uma Conta Poupança possui seu saldo atual, que
corresponde a 102% do valor corrente disponível,
devido à aplicação valorizada.
• Crie uma classe abstrata Conta com um método
abstrato determinarSaldo() para representar essa
situação.
Interface
• Toda classe define 2 itens:
– o que uma classe faz (as assinaturas dos métodos)
– como uma classe faz essas tarefas (o corpo dos
métodos e atributos privados)
• Podemos criar um "contrato" que define tudo o
que uma classe deve fazer se quiser ter um
determinado status.
• A classe que quiser, pode "assinar" esse contrato.
Interface
• Interface é a maneira através da qual conversamos
com um objeto.
• Uma interface pode definir uma série de métodos,
mas nunca conter implementação deles. Ela só
expõe o que o objeto deve fazer, e não como ele faz,
nem o que ele tem. Como ele faz vai ser definido em
uma implementação dessa interface.
Interface
• Uma classe deve implementar essa interface,
escrevendo os métodos pedidos pela interface
– Semelhante com o efeito de herdar métodos abstratos
– Métodos de uma interface são públicos e abstratos
Interface
• A partir de agora, podemos tratar
um Gerente como sendo um Autenticavel.
• Mais uma forma de referenciar a um Gerente.
• Polimorfismo
Exercício
• Crie a interface AreaCalculavel, com o método abstrato
calculaArea, que quando implementado deve calcular a
área geométrica da classe.
• Desenvolva as seguintes classes implementando a
interface AreaCalculavel:
– a classe Quadrado, com o atributo lado
– Retangulo, com largura e altura
• Teste ambas as classes utilizando o polimorfismo de
AreaCalculavel.
• Crie uma inteface gráfica em Swing que calcule tanto a
área do quadrado como de um retângulo utilizando o
código desenvolvido.
Classes Internas
• Classes internas são classes declaradas dentro
de outras classes.
• Uma classe interna tem
nome Externa.Interna pois faz parte do objeto
da classe externa.
Classes Internas
• A vantagem é não precisar de um arquivo
separado e que classes internas podem
acessar tudo que a externa possui (métodos,
atributos etc).
• É possível até encapsular essa classe interna
marcando-a como private. Dessa forma,
apenas a externa pode enxergar.
• São classes normais, que podem implementar
interfaces, ter métodos, ser instanciadas etc.
Classe Anônima
• Uma forma mais específica de classe interna é
a chamada classe anônima que é muito vista
em códigos com Swing.
• De forma simples, cria-se uma classe sem
mesmo declarar seu nome em momento
algum.
Classe Anônima
• É necessário um objeto do tipo ActionListener para passar
para nosso botão.
• Normalmente criaríamos uma nova classe para isso e
daríamos new nela.
• Usando classes anônimas damos new e implementamos a
classe ao mesmo tempo, usando a sintaxe a seguir.
Classe Anônima
• Como criamos uma classe no momento que
precisamos, é comum nos perguntarmos qual é o
nome dessa classe criada.
• Ninguém definiu o nome para essa implementação
particular de um ActionListener, então, por não ter
nome definido, classes como essas são chamadas de
classes anônimas.
Exercícios
• Desenvolva uma interface gráfica em Swing para o
seguinte problema.
• Em um jogo, existem aviões e pássaros.
• Ambos são Objetos do Jogo e possuem em comum o
seu tamanho, ponto x e ponto y.
• No entanto, Aviões podem atirar e pássaros não.
Desenvolva uma interface, denominada Atirador, com
o método atirar, que deve ser obrigatoriamente
implementado por avião como uma linha que se
tornará visível entre o avião e um pássaro no jogo.
• Obs: na interface, o avião e o pássaro podem ser
definidos como botões de diferentes tamanhos. O
avião irá atirar quando seu botão for pressionado.