Capítulo 1 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 2 Classe interna public class ClasseExterna { public int valor = 10; public void calculaValor() { ....... } public class ClasseInterna { private String temp; public void calcTemp() { ... } } } 3 Classe interna Na aplicação principal... ClasseExterna objExt = new ClasseExterna(); System.out.println(objExt.valor); objExt.calculaValor(); ClasseExterna.ClasseInterna objInt; objInt = objExt.new ClasseInterna(); 4 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 5 Classe interna (exemplo) public class AlunoService { public void gravarAluno(int matricula, String nome, String email) { ....... } public void enviarEmailAoAluno(String nome, String email) { Thread thread = new EmailAoAlunoThread(); thread.start(); } private class EmailAoAlunoThread extends Thread { public void run() { ....... } } } 6 Classe interna (exemplo) Na aplicação principal... public class Inicio { public static void main(String args[]) { AlunoService service = new AlunoService(); /* Grava os dados do aluno na base de dados. */ service.gravarAluno(1022, “Manuel”, “[email protected]”); /* Envia um email ao aluno de forma assíncrona (thread). */ service.enviarEmailAoAluno(“Manuel”, “[email protected]”); } } 7 Classe interna local public class ClasseExterna { public int membroExterno = 3; public void calculaValor() { final int local = 5; class ClasseLocal { private int membroInterno = 8; public int calcTemp() { return membroExterno * memboInterno* local; } } ClasseLocal local = new ClasseLocal(); System.out.println(local.calcTemp()); } } 8 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). 9 Classe interna anônima public class ClasseExterna { public void calculaValor() { TipoX temp = new TipoX() { public void metodo1() { ... } }; temp.metodo1(); } } ... onde TipoX é uma interface, classe abstrata ou classe comum previamente declarada com o metodo1(); 10 Classe interna anônima (exemplo) public class CadastroAluno extends JFrame { private JButton btnOK = new JButton(); private JPanel pnlRaiz = (JPanel) getContentPane(); public CadastroAluno() { btnOk.setBounds(100, 80, 60, 30); btnOk.setText(“Clique aqui”); btnOk.addActionListener( new ActionListener() { void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, “Olá!”); } } ); pnlRaiz.add(btnOk); } } 11 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. 12 Classe interna anônima Forma Geral public inteface InterfaceExemplo { public void metodo1(); public void metodo2(); } InterfaceExemplo variavel = new InterfaceExemplo() { public void metodo1() { ..... } public void metodo2() { ..... } ... dentro de algum método }; variavel.metodo1(); variavel.metodo2(); 13 Classe interna estática public class ClasseExterna { public static int valor = 10; public static void calculaValor() { ....... } public static class ClasseInterna { private String temp; public void calcTemp() { ... } } } 14 Classe interna estática Na aplicação principal... Não é necessário criar instância ClasseExterna objExt = new ClasseExterna(); System.out.println(ClasseExterna.valor); ClasseExterna.calculaValor(); ClasseExterna.ClasseInterna objInt; objInt = new ClasseExterna.ClasseInterna(); 15 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. 16 Classes aninhadas Embora seja pouco recomendado, as classes podem ser “internalizadas” em diversos níveis public class Alpha { public void metodo1() { System.out.println(“Metodo da classe Alpha"); } protected class Beta { public void metodo2() { System.out.println(“Metodo da classe Beta"); } private class Gama { public void metodo3() { System.out.println(“Metodo da classe Gama"); } } } } 17 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; 18 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; 19 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: Roda Aro Liga-leve ------------------------------ ----- -------------dianteira-esquerda 17 Sim dianteira-direita 17 Sim traseira-esquerda 36 Não traseira-direita 36 Não 20