Tópicos Avançados• Objetivos deste capítulo• Demonstrar como utilizar mais de uma classe
dentro de um arquivo;• Apresentar os conceitos de classes: internas e
anônimas;• Apresentar e mostrar as diferenças entre classes
abstratas e interfaces;• Mostrar a diferença entre interface e classe adapter.
Mais de uma Classe em um mesmo arquivo
public class ClassPrincipal
{
. . .
}
class ClassSecundaria
{
. . .
}
class Data { private int dia, mes, ano; public void setDia(String dia) { this.dia = Integer.parseInt(dia); } public int getDia() { return dia; } public int amanha() { return dia + 1; }}
Mais de uma classe no mesmo arquivo – exemplo (1)
public class TesteData{ public static void main(String args[ ]) { Data objData = new Data(); objData.setDia(args[0]); System.out.println("Hoje = " + objData.getDia()); System.out.println("Amanha = " + objData.amanha()); }}
Mais de uma classe no mesmo arquivo – exemplo (*2)
Classes Aninhadas - internas
• Java permite que uma classe seja definida como membro de outra classe. Esta classe é chamada de classe aninhada:
public class EnclosingClass
{
class NestedClass
{
}
{
• Classes aninhadas são usadas para reforçar o relacionamento entre as duas classes.
Classes Aninhadas - internas
• A classe aninhada tem acesso ilimitado aos membros da classe a qual foi definida, mesmo que o membro tenha sido declarado private.
• Uma classe aninhada pode ter a declaração static. As classes aninhadas não estáticas são chamadas de classes internas (inner classes).
• As classes internas são classe declaradas e implementadas dentro de uma dada classe como podemos observar a seguir:
Classes Aninhadas - internas• public class Outter {• // Declaração de campos e métodos
• // Declaração de classes internas• class Inner1 {• :• }• class Inner2 {• : • }• // Assim como campos e métodos• // as classes internas podem ser• // declaradas em qualquer ponto• // da classe externa• }
Classes Aninhadas - internas• Cada classe interna se comporta como um campo privado
da classe externa, ou seja, a classe interna pode ser livremente utilizada dentro da implementação da classe externa embora seja inacessível externamente, tal como um campo private.
• Ao ser compilado são produzidos um arquivo .class para cada classe, incluindo-se aí as inner classes que recebem a seguinte denominação especial: NomeOutterClass$NomeInnerClass.class, assim para o exemplo acima teríamos os arquivos Outter.class, Outter$Inner1.class e Outter$Inner2.class.
Classes Aninhadas - internas• As inner classes são particularmente úteis nos seguintes casos:
na definição de classes de serviço, isto é, classe utilizadas com propósito específico dentro de outras classes, tal como armazenar informações num formato especial.
na construção de event handlers, ou seja, dos listeners a partir das interfaces ou classes adaptadoras.
• A única desvantagem do uso das inner classes é que seu código fica restrito a outer class na qual está contida. Isto indica que seu uso é adequado para implementação de código específico de uma certa classe ou aplicação, não sendo apropriado para criação de classes de propósito geral.
Classes Aninhadas - anônimas• Uma classe aninhada pode ser declarada sem nome. Estas classes são chamadas de
“anonymous classes”.• Classes anônimas tornam o código difícil de ser lido. O seu uso deveria ficar
restrito ao tratamento de eventos com classes listener e adapter.import java.awt.*;import java.awt.event.*;import javax.swing.*;public class WindowListenerDemo { public static void main (String args[]) { JFrame j = new JFrame("Evento de Janela"); j.setSize(200,200);
j.addWindowListener (new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //classe anônima interna de tratamento do evento
j.setVisible(true); }} // este assunto será detalhado no próximo capítulo
Classes Abstratas• Quando a palavra-chave “abstract” aparece
no início de uma declaração de classe, significa que um ou mais métodos são abstratos.
• Um método abstrato não tem corpo; o seu propósito é forçar uma subclasse a sobrepô-lo e fornecer uma implementação concreta do método.
• Não pode ter instâncias (objetos).
Classes Abstratas: Exemplo
public abstract class VeiculoAquatico {
abstract void definirRumo (int n);abstract void definirVelocidade (int n);
}class Canoa extends VeiculoAquatico {
void definirRumo (int n) { .... }
void definirVelocidade (int n) { ... }}
Interface
Visão do mundo real:• Na nossa vida, estamos acostumados a lidar com objetos através de sua interface, ignorando sua complexidade.
Interface Mecanismo que objetos não relacionados entre si usam para
interagir entre si; Protocolo de comunicação aonde existe um comportamento
concordado; Ao invés de forçar relacionamento que não existem
naturalmente entre as classes que fazem parte do sistema, cria-se um protocolo de comunicação;
Uma interface define um conjunto de métodos que uma classe deve implementar mas não define como esses métodos devem ser implementados;
Quando uma classe implementa uma interface, ela concorda em implementar todos os métodos declarados pela interface;
Não confundir com classes abstratas: as interfaces não servem para criar novas classes, mas sim para implementar funcionalidades diversas!
Interfaces em Java
• Criadas com a palavra reservada interface.• são sempre públicas.• implementadas pelas classes com a palavra
reservada implements.
Interfaces
• Interfaces são (sintaticamente) semelhantes classe abstratas
• Diferenças:
Classe Abstrata Interface
Pode implementar métodos Não pode implementar nenhum método É parte da hierarquia de classes Não faz parte da hierarquia de classes. Classes que
não são relacionadas entre si podem implementar a mesma interface.
Uma classe não pode ser derivada de mais de uma classe.
Uma classe pode implementar mais de uma interface.
Interface - exemplo
public interface ControleRemoto
{
public void ligaTV();
public void desligaTV();
public void mudaCanalTV(int canalNovo);
}
public class TV implements ControleRemoto
{
public void ligaTV() {...}
public void desligaTV() {...}
public void mudaCanalTV(int canalNovo) {...}
}
Adapter É muito comum querer uma classe que
implemente uma interface fazendo nada para a maioria dos métodos e fazendo algo útil apenas para alguns poucos métodos;
Para ajudar o programador, é comum, em Java, criar uma classe "adapter" que implemente todos os métodos de uma interface com métodos que nada fazem;
As classes que devem implementar a interface podem herdar do adapter e fazer override de alguns poucos métodos;
Exercícios
• 1 - Considerando a hierarquia de contas anterior, fazer um programa
• que faça a simulação de 1000 transações de débito e crédito nas
• diversas contas. Utilize a função Math.randon() (consulte a
• documentação para esta função). Eis as funcionalidades:
• a) a classe conta possui o atributo saldo e os métodos abstratos: void
• debito(float valor), void crédito (float valor) e float
• saldo();
• b) a classe poupança possui os atributos: int diasJuro, final float
• PERCENTUALJURO=0.007 e o método: void calculaJuros().
• c) a classe pessoa física possui o atributo: float limite.
• d) a classe pessoa jurídica somente os membros definidos na
• superclasse.
Conta
PessoaFisica PessoaJuridica Poupanca
Exercícios - cont.• Lógica dos métodos:• a) fazer o débito em uma conta e o crédito em outra. O débito só deve ser• feito se houver saldo. O valor a ser debitado e as contas envolvidas na• transação calculados de forma randômica.• b) o saldo total da conta física é: saldo + limite.• c) a cada lançamento de crédito na conta poupança, adicionar 1 nos• diasJuro e calcular os juros.• d) o cálculo do juros da conta poupança é o saldo mais o acréscimo dos• juros no período de 30 dias. Da seguinte forma:• se diasJuro > 30 então• juros = saldo * 0.007;• diasJuro = diasJuro - 30;• senao• juros = 0;• saldo = saldo + juros;• e) Implemente uma classe Principal que cria 3 contas: poupança, física e• jurídica e faça os 1000 lançamentos nas diversas contas. No final• informar o saldo de cada conta. Os atributos definidos como private• e criar os métodos get e set apropriados.
Bibliografia
- FURGERI, Sérgio. Java 2: Ensino didático: Desenvolvendo e Implementando Aplicações –
- São Paulo: Érica, 372p. 2002. - TAMASSIA, R.; GOODRICH, M.T. Estrutura
de Dados e Algoritmos em Java. Bookman, 2002.
- DEITEL,H.M.; DEITEL, P.J. Java: Como Programar, Bookman, 2002.