Considere siguiente ejemplo:
public class OuterClass {
private AnonymousInnerClass anonymousInnerClass = new AnonymousInnerClass() {
@Override
protected void printAboutme() {
System.out.println("AnonymousInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
};
public void displayAnonymousInnerClass() {
anonymousInnerClass.printAboutme();
}
public void displayStaticInnerClass() {
NestedStaticClass staticInnerClass = new NestedStaticClass();
staticInnerClass.printAboutMe();
}
public void displayInnerClass() {
InnerClass innerClass = new InnerClass();
innerClass.printAboutMe();
}
public void displayMethodInnerClass(){
class MethodInnerClass {
private String sampleField = "Method Inner Class";
public void printAboutMe() {
System.out.println("MethodInnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
MethodInnerClass methodInnerClass = new MethodInnerClass();
methodInnerClass.printAboutMe();
}
class InnerClass {
private String sampleField = "Inner Class";
public void printAboutMe() {
System.out.println("InnerClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
abstract class AnonymousInnerClass {
protected String sampleField = "Anonymous Inner Class";
protected abstract void printAboutme();
}
static class NestedStaticClass {
private String sampleField = "NestedStaticClass";
public void printAboutMe() {
System.out.println("NestedStaticClass.printAboutMe.........");
Class clazz = this.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
String message = Modifier.isPublic(field.getModifiers()) ? "public":(Modifier.isPrivate(field.getModifiers())?"private":"protected");
message = message + " " + field.getType().getSimpleName();
message = message + " " + field.getName();
System.out.println(message);
}
}
}
}
en este ejemplo no hay comparación de cada tipo de clase anidada estática no con class.Now anidada estática si se ejecuta el método de visualización de la clase externa para cada clase anidada verá la salida de cada clase anidada método printAboutMe(), que tiene un código de reflexión para imprimir todas las variables miembro de las clases anidadas.
Verá que para las clases no anidadas hay una variable de miembro adicional distinta de la cadena de variable declarada en el código, que solo está presente en el tiempo de ejecución.
por ejemplo si ejecutamos el siguiente código para InnerClass. : -
public class NestedClassesDemo {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.displayInnerClass();
}
}
salida es la siguiente: -
InnerClass.printAboutMe.........
private String sampleField
protected OuterClass this$0
en cuenta que es variable miembro misterio esta clase $ 0 de tipo envolvente (clase externa).
Ahora ya está claro que las clases internas mantienen referencia a la imagen externa escenario class.So por donde sale la referencia de clase interna a otra clase de mundo exterior y luego hacer referencia no se libera a su vez OuterClass también se refiere, por lo tanto, tener fugas.
Esto hace que el uso de clases internas sea malo si no se usa por primera vez.
No existe este caso con clases internas estáticas.Por favor, ejecute todos los métodos de visualización.También si algún problema en el código, por favor, señalar.
http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –
"Terminología: las clases anidadas se dividen en dos categorías: estáticas y no estáticas. Clases anidadas que son declaradas estáticas simplemente se llaman clases anidadas estáticas. Las clases anidadas no estáticas se llaman clases internas ". - De http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –
Posible duplicado http://stackoverflow.com/questions/487126/is-usage-of-anonymous-classes -in-java-considered-bad-style-or-good –