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.
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
Exemplo
Regras de Acesso
Uma classe aninhada tem acesso total aos campos e
do acesso privado, j que a classe aninhada tambm pertence classe que a envolve.
Modificadores de Acesso
Classes internas pode ter modificadores:
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.
envoltria. Exemplo:
relao com os objetos da classe envoltria Instncias das variveis no podem ser referenciadas. Mtodos no estticos no podem ser invocados
Convenes de Chamada
Para chamar um mtodo de uma classe esttica
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
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.
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
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"); } }
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
(como um if ou um for)
variveis de instncia da classe que as envolve variveis locais final do bloco que as envolve.
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( )
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
21
Classes Annimas
Em algum momento podemos no nos importar com
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.
23
Exemplo
MeuBotao.addActionListener (new ActionListener(){ public void actionPerformed (ActionEvent evt){ : } });
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
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.
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: