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