Linguagens e Técnicas de Programação - JAVA José  Marcos  Barbosa da Silveira [email_address]
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  { . . . }
Mais de uma classe no mesmo arquivo – exemplo  (1) 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  (*2) 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()); } }
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:
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.

Java11

  • 1.
    Linguagens e Técnicasde Programação - JAVA José Marcos Barbosa da Silveira [email_address]
  • 2.
    Tópicos Avançados Objetivosdeste 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.
  • 3.
    Mais de umaClasse em um mesmo arquivo public class ClassPrincipal { . . . } class ClassSecundaria { . . . }
  • 4.
    Mais de umaclasse no mesmo arquivo – exemplo (1) 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; } }
  • 5.
    Mais de umaclasse no mesmo arquivo – exemplo (*2) 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()); } }
  • 6.
    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.
  • 7.
    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:
  • 8.
    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 }
  • 9.
    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 .
  • 10.
    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.
  • 11.
    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
  • 12.
    Classes Abstratas Quandoa 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).
  • 13.
    Classes Abstratas: Exemplopublic 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) { ... } }
  • 14.
    Interface Visão domundo real: Na nossa vida, estamos acostumados a lidar com objetos através de sua interface, ignorando sua complexidade.
  • 15.
    Interface Mecanismo queobjetos 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!
  • 16.
    Interfaces em JavaCriadas com a palavra reservada interface . são sempre públicas . implementadas pelas classes com a palavra reservada implements .
  • 17.
    Interfaces Interfaces são(sintaticamente) semelhantes classe abstratas Diferenças:
  • 18.
    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) {...} }
  • 19.
    Adapter É muitocomum 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;
  • 20.
    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
  • 21.
    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.
  • 22.
    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.