200 likes | 370 Views
Capítulo 1. Classes Internas Pág. 14 a 29. Classes internas. Classe interna Instância da classe interna Referências na classe interna Modificadores de membros. Classe interna local Classe interna anônima Classe interna estática Classes aninhadas. Classe interna.
E N D
Capítulo 1 Classes InternasPág. 14 a 29
Classes internas • Classe interna • Instância da classe interna • Referências na classe interna • Modificadores de membros • Classe interna local • Classe interna anônima • Classe interna estática • Classes aninhadas
Classe interna publicclassClasseExterna { publicintvalor = 10; publicvoidcalculaValor() { ....... } publicclassClasseInterna { private String temp; publicvoidcalcTemp() { ... } } }
Classe interna • Na aplicação principal... ClasseExternaobjExt = newClasseExterna(); System.out.println(objExt.valor); objExt.calculaValor(); ClasseExterna.ClasseInternaobjInt; objInt = objExt.newClasseInterna();
Classe interna • Uma classe interna é tratada como um dos membros da classe externa. • Como tal, a classe interna pode possuir qualquer um dos modificadores de acesso abaixo: • public • protected • Default (sem modificador) • private
Classe interna (exemplo) publicclassAlunoService { publicvoidgravarAluno(int matricula, String nome, String email) { ....... } publicvoidenviarEmailAoAluno(String nome, String email) { Thread thread = newEmailAoAlunoThread(); thread.start(); } privateclassEmailAoAlunoThreadextends Thread { publicvoidrun() { ....... } } }
Classe interna (exemplo) • Na aplicação principal... publicclassInicio { publicstaticvoidmain(String args[]) { AlunoServiceservice = newAlunoService(); /* Grava os dados do aluno na base de dados. */ service.gravarAluno(1022, “Manuel”, “manuel@portugal.com”); /* Envia um email ao aluno de forma assíncrona (thread). */ service.enviarEmailAoAluno(“Manuel”, “manuel@portugal.com”); } }
Classe interna local publicclassClasseExterna { publicintmembroExterno = 3; publicvoidcalculaValor() { finalint local = 5; classClasseLocal { privateintmembroInterno = 8; publicintcalcTemp() { returnmembroExterno * memboInterno* local; } } ClasseLocal local = newClasseLocal(); System.out.println(local.calcTemp()); } }
Classe interna local • Uma classe interna local pode ser utilizada apenas dentro do método em que foi criada. • Desta forma, uma classe interna local não deve possuir modificadores de acesso (public, private, etc). • Uma classe interna local só pode utilizar uma variável local ao método onde ela se encontra se a variável local for uma constante (final).
Classe interna anônima publicclassClasseExterna { publicvoidcalculaValor() { TipoXtemp = newTipoX() { publicvoidmetodo1() { ... } }; temp.metodo1(); } } ... onde TipoX é uma interface, classe abstrata ou classe comum previamente declarada com o metodo1();
Classe interna anônima (exemplo) publicclassCadastroAlunoextendsJFrame { privateJButtonbtnOK = newJButton(); privateJPanelpnlRaiz = (JPanel) getContentPane(); publicCadastroAluno() { btnOk.setBounds(100, 80, 60, 30); btnOk.setText(“Clique aqui”); btnOk.addActionListener( newActionListener() { voidactionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, “Olá!”); } } ); pnlRaiz.add(btnOk); } }
Classe interna anônima • Ao criar uma classe anônima, estamos implementando ou estendendo uma classe ou interface para uso imediato; • Ao criar uma classe anônima, podemos: • Implementar uma interface com os seus métodos; • Estender uma classe abstrata implementando os seus métodos abstratos; • Estender uma classe comum sobrescrevendo algum de seus métodos.
Classe interna anônima • Forma Geral publicintefaceInterfaceExemplo { publicvoidmetodo1(); publicvoidmetodo2(); } InterfaceExemplovariavel = newInterfaceExemplo() { publicvoidmetodo1() { ..... } publicvoidmetodo2() { ..... } }; variavel.metodo1(); variavel.metodo2(); ... dentro de algum método
Classe interna estática publicclassClasseExterna { publicstaticintvalor = 10; publicstaticvoidcalculaValor() { ....... } publicstaticclassClasseInterna { private String temp; publicvoidcalcTemp() { ... } } }
Classe interna estática • Na aplicação principal... ClasseExternaobjExt = newClasseExterna(); System.out.println(ClasseExterna.valor); ClasseExterna.calculaValor(); ClasseExterna.ClasseInternaobjInt; objInt = newClasseExterna.ClasseInterna(); Não é necessário criar instância
Classe interna estática • Uma classe interna estática é semelhante a uma classe comum, sendo sua classe externa semelhante a um package. • Geralmente uma classe interna estática é utilizada como uma classe pública auxiliar de sua classe externa.
Classes aninhadas • Embora seja pouco recomendado, as classes podem ser “internalizadas” em diversos níveis publicclassAlpha { publicvoid metodo1() { System.out.println(“Metodo da classe Alpha"); } protectedclass Beta { publicvoid metodo2() { System.out.println(“Metodo da classe Beta"); } privateclass Gama { publicvoid metodo3() { System.out.println(“Metodo da classe Gama"); } } } }
Exercício (parte 1) • Crie uma classe chamada Carro contendo uma classe interna pública e estática chamada Roda; • A classe interna Roda deverá possuir 2 atributos: aro (int) e ligaLeve (boolean) e seus respectivos métodos get e set. Também deverá conter um método construtor público contendo ambos os atributos;
Exercício (parte 2) • A classe externa Carro deverá possuir 4 atributos: • rodaDianteiraEsquerda (tipo Roda); • rodaDianteiraDireita (tipo Roda); • rodaTraseiraEsquerda (tipo Roda); • rodaTraseiraDireita (tipo Roda). ... e seus respectivos métodos get e set; • A classe externa Carro também deverá possuir um método construtor que permitirá inicializar o carro com os atributos descritos acima;
Exercício (parte 3) • Crie uma classe CarroStart contendo o método main() que deverá criar uma instância da classe Carro assinalando nesta 4 instâncias da classe Roda e, em seguida exiba os dados da instância da classe Carro conforme abaixo: