public class Outer{
public class Inner{
}
}
public class Main {
public static void main(String[] args) {
Outer objOut = new Outer();
//Outer.Inner object1= objOut.new Inner(); // runes without a problem
//objOut.Inner object2= objOut.new Inner(); //gives error
}
}
Esto puede sonar poco aficionado, pero, ¿Cuáles son las diferencias entre Outer.Inner
vs objOut.Inner
.
No puede utilizar un nombre de variable como el tipo de otra variable, que es lo que estamos tratando de hacer con el objOut.Inner
. El tipo de la variable es Inner
(o opcionalmente Outer.Inner
).
Debido a que Inner
es una clase interna , que está asociado con una instancia de su clase externa (su ejemplo de cerramiento ). Cuando se crea una instancia del mismo, puede optionally¹ especificar qué instancia del objeto que está asociado con, que es lo que está haciendo con objOut.new Inner
.
Este ejemplo puede ayudar a que sea un poco más claro:
public class Example {
private String str;
public class Inner {
void show() {
// Show the string for the Example this Inner is part of
System.out.println(Example.this.str);
}
}
public Example(String s) {
this.str = s;
}
public static void main(String[] args) {
Example e1 = new Example("e1");
Example e2 = new Example("e2");
Inner i1 = e1.new Inner();
i1.show(); // "e1"
Inner i2 = e2.new Inner();
i2.show(); // "e2"
}
}
Observe cómo el i1
Inner
ejemplo pone e1
como su envolvente Example
ejemplo, y así ve e1
's str
, pero i2
se pone e2
como ejemplo que encierra por lo que ve e2
' s str
.
Sugiero este tutorial de Java para obtener más información.
¹ A veces no es opcional, como en mi Example
clase por encima, desde donde new Inner
se usa, no hay ninguna instancia predeterminada que podría utilizar. Sería opcional en una instancia método de Example
, pero no en ese static
método.