Você está na página 1de 27

Classes Internas e Annimas

Prof. Ricardo Linden

Classes Internas e Annimas

Classes Internas
Classes Internas so classes dentro de classes.
Declaramos

classes exatamente como fazamos antes, mas agora ela est dentro do corpo de outra classe Consequentemente dentro do arquivo .java desta outra classe). As suas regras de acesso so um pouquinho diferentes. O uso mais comum das classes internas para lidar com eventos, como veremos mais a frente.

Classes Internas e Annimas

Como declarar?
Uma classe aninhada (tipo de classe internas)

declarada dentro de uma classe existente Exemplo: public class MyRegularClass { . class myInnerClass { . } }
Classes Internas e Annimas

Classes Internas
Os objetos das classes internas so associados com objetos das

classes envoltrias

Para criar um objeto de uma classe interna necessrio criar

primeiro um objeto da classe externa.

Exemplo

BankAccount account = new BankAccount(); BankAccount.money amount = account.new Money(41.99); System.out.println(amount.getAmount());

Classes Internas e Annimas

Regras de Acesso
Uma classe aninhada tem acesso total aos campos e

mtodos da classe que a envolve, incluindo aqueles de acesso privado.

De acordo com a Sun, isto no quebra o conceito de

do acesso privado, j que a classe aninhada tambm pertence classe que a envolve.

Classes Internas e Annimas

Modificadores de Acesso
Classes internas pode ter modificadores:

public protected private

Ou ter acesso package-level (sem modifiadores)

Classes Internas e Annimas

Static No-Static
Uma classe aninhada pode ser declarada como static

ou no. Se ela no for static, chamada de classe interna. Se for static, chamada de classe esttica aninhada. Uma classe esttica aninhada est associada classe que a envolve e no pode referenciar nenhuma das variveis de instncia. Entretanto, elas podem acessar todos os membros (variveis e mtodos) estticos da classe envoltria. como se fosse um mtodo esttico.

Classes Internas e Annimas

Classes Aninhadas Estticas


Exemplo:
public abstract class Elipse2D { public static class Float extends Elipse2D { } }

A referncia a elas feita usando o nome da classe

envoltria. Exemplo:

new Elipse2D.Float (10., 20., 30., 40.)

Classes Internas e Annimas

Classes Aninhadas Estticas


Uma classe aninha esttica no tem nenhuma

relao com os objetos da classe envoltria Instncias das variveis no podem ser referenciadas. Mtodos no estticos no podem ser invocados

Classes Internas e Annimas

Convenes de Chamada
Para chamar um mtodo de uma classe esttica

aninhada na classe envoltria: InnerClassName.staticMethodName

Para referenciar uma varive sttica de uma classe

esttica aninhada: InnerClassName.staticVariableName

Classes Internas e Annimas

10

Classes Internas
Uma

instncia de uma classe interna existe efetivamente dentro de uma instncia da classe que a envolve.
Instncia da OuterClass

Instncia da InnerClass

Classes Internas e Annimas

11

Classes Internas
Se voc declarar new myInnerClass() em algum

ponto no cdigo, um novo objeto ser criado com acesso a todas as variveis de instncia ao objeto que o envolve.

Ele ser declarado com acesso a todas as variveis

internas da classe que o envolve.

Classes Internas e Annimas

12

Exemplo Simples
public class FixedStack { Object array[]; int top = 0; FixedStack(int limit) {array = new Object(limit);} public void push(Object item) { array[top++] = item; } public boolean isEmpty() { return top == 0; } class Enumerator implements java.util.Enumeration { int count = top; public boolean hasNoreElements() { return count > 0; } public Object nextElement() { if (count == 0) throw new NoSuchElementException(FixedStack); return array[--count]; } } public java.util.Enumeration elements() { return new Enumeration(); } }
Classes Internas e Annimas 13

Comentrios sobre exemplo


Neste caso, a interface java.util.Enumeration

indispensvel para o funcionamento da classe interna.


A instncia que contm um Enumerator da classe

FixedStack. Para se referir a ela, use FixedStack.this

Em uma classe esttica aninhada, proibido se

referir instncia FixedStack.this

Classes Internas e Annimas

14

Exemplo
public class TestInstanceInnerClass { private JButton button1, button2; class Listener implements ActionListener { public void actionPerformed ( ActionEvent evt){ Object src = evt.getSource(); if (src == button1) System.out.println ("One"); else if (src == button2) System.out.println ("Two"); else if (src == button3) System.out.println ("Three"); } }

Classes Internas e Annimas

15

Exemplo (continuao)
public TestInstanceInnerClass() { JFrame frame; button1 = new JButton ("One"); button2 = new JButton ("Two"); frame = new JFrame ("Test Instance Class"); Container cp = frame.getContentPane(); cp.add ("North", button1); cp.add ("Center", button2); Listener lstnr = new Listener(); button1.addActionListener (lstnr); button2.addActionListener (lstnr); frame.setSize(175, 150); frame.setVisible (true); } public static void main (String[] args) { new TestInstanceInnerClass(); } }
Classes Internas e Annimas 16

Classes Internas Locais


So definidas dentro de um mtodo ou outro bloco

(como um if ou um for)

S podem ser referenciadas dentro daquele bloco. Podem referenciar:

variveis de instncia da classe que as envolve variveis locais final do bloco que as envolve.

Classes Internas e Annimas

17

Exemplo
import javax.swing.*;

import java.awt.*; import java.awt.event.*; public class TestLocalInnerClass { public static void main (String[] args) { JFrame frame; final JButton button1, button2; button1 = new JButton ("One"); button2 = new JButton ("Two"); frame = new JFrame ("Test Local Class"); Container cp = frame.getContentPane(); cp.add ("North", button1); cp.add ("Center", button2); frame.setSize(175, 150);
Classes Internas e Annimas 18

Exemplo (continuao)
class Listener implements ActionListener { public void actionPerformed(ActionEvent evt) { Object src = evt.getSource(); if (src == button1) System.out.println (Um"); else if (src == button2) System.out.println ("Two"); } } Listener lstnr = new Listener(); button1.addActionListener (lstnr); button2.addActionListener (lstnr); frame.setVisible (true); }
}
Classes Internas e Annimas 19

Observaes...
possvel ter classes internas s classes internas.
Exemplo: Classe A tem classe interna pblica B que

tem uma classe interna pblica B C: A.aObject = new A( ); A.B bObject = aObject.new B( ); A.B.C cObject = bObject.new C( )

Classes Internas e Annimas

20

Regras de herana
Seja OuterClass que contm uma classe interna InnerClass.

Logo: Se DerivedClass uma subclasse de OuterClass, ento DerivedClass tambm tem InnerClass como classe interna No possvel sobrepor a definio de InnerClass em DerivedClass. InnerClass pode extender uma classe. OuterClass pode externder uma classe diferente de InnerClass

Classes Internas e Annimas

21

Classes Annimas
Em algum momento podemos no nos importar com

o nome das variveis.

Se no quisermos dar nome s nossas classes,

estaremos criando classes annimas.

Classes annimas so classes que so declaradas

on-the-fly, isto , onde so necessrias, dentro de um bloco de cdigo.

Classes Internas e Annimas

22

Classes Annimas
Ns sabemos que no vamos precisar de outra

instncia dela aps, logo no temos necessidade de dar-lhe um nome que permita o acesso posterior.

Estas classes no pode ter construtores

no tm nome para colocar depois do new!

Classes Internas e Annimas

23

Exemplo
MeuBotao.addActionListener (new ActionListener(){ public void actionPerformed (ActionEvent evt){ : } });

Ns sabemos que o ActionListener deste boto

muito especfico e no ser usado por mais ningum. Logo, podemos declar-lo imediatamente. No se preocupem com os conceitos de programao grfica. Ns vamos discuti-los com detalhes depois. Note que ns no definimos um construtor, s o mtodo que nos interessava naquele momento.
Classes Internas e Annimas

24

Quando usar classes annimas


Crie classes annimas apenas quando suas classes forem muito

pequenas (um ou dois mtodos).

Mais que isto e seu programa ser ilegvel.

Eventos de botes, que so muito especficos, so bons

candidatos ao uso delas.

Mantenha-as curtas: j que voc tem acesso a todos os

mtodos da classe envoltria, mantenha o grosso do cdigo dentro dela.

Classes Internas e Annimas

25

Resultados da Compilao
Quando voc compilar uma classe interna, voc ver

no seu diretrio um arquivo com o nome OuterClass$InnerClass.class Quando voc compilar uma classe annima, voc ver no seu diretrio um arquivo chamado OuterClass$n.class, onde n um nmero inteiro crescente.

Classes Internas e Annimas

26

Questes de Implementao
Implementada

atravs de traduo para os mecanismos habituais do Java A instncia da classe envoltria referenciada por this$0 A varivel local x da classe envoltria referenciada por val$x O compilador se encarrega de copiar os cdigos de this$ e todos val$ no momento da criao do objeto.

Referenciando:

instncia do objeto que contm classe: classe_env.this


No pode conter variveis estticas Quebram o conceito dos modificadores private e protected
Classes Internas e Annimas 27