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
Download

Classes Internas