उदाहरण निम्नलिखित पर विचार करें:
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);
}
}
}
}
इस उदाहरण में
वहाँ स्थिर नेस्टेड class.Now के साथ गैर स्थिर नेस्टेड वर्ग की हर प्रकार की तुलना है अगर आप प्रत्येक के लिए बाहरी वर्ग के प्रदर्शन विधि चलाने नेस्टेड क्लास आपको प्रत्येक नेस्टेड क्लास printAboutMe() विधि का आउटपुट दिखाई देगा, जिसमें घोंसला वाले वर्गों के सभी सदस्य चर मुद्रित करने के लिए कुछ प्रतिबिंब कोड हैं।
आप गैर नेस्टेड कक्षाओं के लिए देखेंगे कोड में घोषित चर स्ट्रिंग के अलावा एक अतिरिक्त सदस्य चर है, जो केवल रन टाइम पर मौजूद है।
उदाहरण के लिए यदि हम इनर क्लास के लिए निम्नलिखित कोड निष्पादित करते हैं। : -
public class NestedClassesDemo {
public static void main(String[] args) {
OuterClass outerClass = new OuterClass();
outerClass.displayInnerClass();
}
}
उत्पादन इस तरह है: -
InnerClass.printAboutMe.........
private String sampleField
protected OuterClass this$0
नोट है रहस्य सदस्य चर प्रकार संलग्नित क्लास (बाहरी वर्ग) के इस $ 0।
अब आप स्पष्ट हैं कि आंतरिक वर्ग बाहरी वर्ग के संदर्भ में रहते हैं। इसलिए छवि परिदृश्य जहां आप आंतरिक कक्षा के अन्य बाहरी विश्व वर्ग में संदर्भ पारित करते हैं और फिर संदर्भ में कभी भी रिलीज़ नहीं होता है, बाहरी क्लाउड भी संदर्भित किया जाता है, इसलिए रिसाव।
तो यह आंतरिक वर्गों का उपयोग खराब बनाता है अगर प्रयुक्त रूप से उपयोग नहीं किया जाता है।
स्थिर आंतरिक कक्षाओं के साथ ऐसा कोई मामला नहीं है। कृपया सभी प्रदर्शन विधियों को चलाएं। अगर कोड में कोई समस्या कृपया इंगित करें।
स्रोत
2016-02-03 02:03:15
http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class –
"शब्दावली: नेस्टेड कक्षाएं दो श्रेणियों में विभाजित हैं: स्थैतिक और गैर स्थैतिक। नेस्टेड कक्षाएं घोषित स्थैतिक को केवल स्थैतिक घोंसले वाले वर्ग कहा जाता है। गैर स्थैतिक घोंसले वाले वर्गों को आंतरिक कक्षाएं कहा जाता है। " - http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html –
संभावित डुप्लिकेट http://stackoverflow.com/questions/487126/is-usage-of-anonymous-classes से -इन-जावा-माना-खराब-शैली-या-अच्छा –