Hay 4 tipos diferentes de clases internas en Java. Esta publicación los ilustra usando 4 ejemplos simples.
1. Clases anidadas estáticas
class Outer { static class Inner { void go() { System.out.println("Inner class reference is: " + this); } } } public class Test { public static void main(String[] args) { Outer.Inner n = new Outer.Inner(); n.go(); } } |
Inner class reference is: [email protected]
2. Miembro de la clase interna
La clase de miembro es específica de la instancia. Tiene acceso a todos los métodos, campos y esta referencia externa.
public class Outer { private int x = 100; public void makeInner(){ Inner in = new Inner(); in.seeOuter(); } class Inner{ public void seeOuter(){ System.out.println("Outer x is " + x); System.out.println("Inner class reference is " + this); System.out.println("Outer class reference is " + Outer.this); } } public static void main(String [] args){ Outer o = new Outer(); Inner i = o.new Inner(); i.seeOuter(); } } |
Outer x is 100 Inner class reference is [email protected] Outer class reference is [email protected]
3. Clases internas de método local
public class Outer { private String x = "outer"; public void doStuff() { class MyInner { public void seeOuter() { System.out.println("x is " + x); } } MyInner i = new MyInner(); i.seeOuter(); } public static void main(String[] args) { Outer o = new Outer(); o.doStuff(); } } |
x is outer
public class Outer { private static String x = "static outer"; public static void doStuff() { class MyInner { public void seeOuter() { System.out.println("x is " + x); } } MyInner i = new MyInner(); i.seeOuter(); } public static void main(String[] args) { Outer.doStuff(); } } |
x is static outer
4. Clases internas anónimas
Esto se usa con frecuencia cuando agrega un escucha de acción a un widget en una aplicación GUI.
button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ comp.setText("Button has been clicked"); } }); |