Classes Internas Pág. 14 a 29
200 likes | 384 Vues
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.
Classes Internas Pág. 14 a 29
E N D
Presentation Transcript
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: