Consider the following example:
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); } } }
}
this example compares each type of non-static nested class with a static nested class. Now, if you run the Outer class mapping method for each nested class, you will see the output of each printstable () method of the nested class, which has some reflection code for printing all member variables of the nested classes.
You will see that for non-nested classes there is one additional member variable that is different from the declared variable string in the code, which is present only at run time.
for example, if we execute the following code for InnerClass .: -
public class NestedClassesDemo { public static void main(String[] args) { OuterClass outerClass = new OuterClass(); outerClass.displayInnerClass(); }
}
the output is as follows: -
InnerClass.printAboutMe......... private String sampleField protected OuterClass this$0
Note that there is a mystery this $ 0 member variable of the type of the enclosing class (Outer class).
Now you understand that inner classes maintain a reference to an outer class. The script of the image in which you pass the link of the inner class to another outside world, and then the link will never be released, in turn, OuterClass also refers, therefore, to the leak.
Thus, this makes using inner classes bad if not used prpperly.
There is no such case with static inner classes. Please run all display methods. Also, if there is any problem in the code, please indicate.
Gagandeep Singh Feb 03 '16 at 2:03 2016-02-03 02:03
source share