catalogue
Comparison of four nested classes in Java
Comparison of four nested classes in Java
There are four nested classes in Java:
- Static inner classes} provide some static functions associated with external classes} for example, Map in Map Entry<K,V>
- The member inner class} provides some non static functions associated with the outer class. Because it is a non static declaration, each inner instance will contain an additional reference to the outer class object. For example, KeyIterator, ValueIterator, entryiiterator, and so on in HashMap.
- Anonymous inner class} can be understood as a simple version of inheritance, which is convenient for implementation and can only be used in the current external class. For example, re implement the compareTo method in Comparable for sorting, etc
- Local internal classes are only used in the definition methods of external classes. For example, inherit a class to implement the methods only required by the current method.
Comparison of four nested classes | Static inner class | Member inner class | Anonymous Inner Class | Local inner class |
Define location | Member variable | Member variable | Within a member variable or member method | Within member method |
The inner class has a clear class name | have | have | nothing | have |
Compiled class name | External class name + $+ internal class name | External class name + $+ internal class name | External class name + $+ numeric number | External class name + $+ sequence number + internal class name |
Inner class has constructor | have | have | nothing | have |
Class modifier | final,abstract,static | final,abstract | nothing | final,abstract |
Internal class access modifier modifier | can | can | no | no |
Internal classes access external static properties | can | can | can | can |
Internal classes access external static methods | can | can | can | can |
Internal classes access external non static properties | no | can OuterClass.this.xxx; | final attribute: outerclass this. xxx; Non final attribute: no | can |
Internal classes access external non static methods | no | can OuterClass.this.YYY(); | no | can |
External classes access internal static properties | can | However, it must be static final | no | can |
External classes access internal static methods | can | No, inner classes cannot define static methods | no | No, inner classes cannot define static methods |
External classes access internal non static properties / methods | Internal class instance required | Internal class instance required | no | can |
Demo | OuterClass | OuterClass2 | OuterClass3 | OuterClass4 |
Static inner class
/** * Static inner class * @author xuweijsnj */ public class OuterClass { private final int a = 10; private static final int b = 20; private Inner inner = new Inner(); private void printA() { System.out.println("OuterClass.printA: " + a); } private static void printB() { System.out.print("Internal classes access external static methods:"); System.out.println("OuterClass.printB: " + b); } private void printC() { // If you want to directly access the compilation error, you need an internal class instance // No enclosing instance of the type OuterClass.Inner is accessible in scope // System.out.println("OuterClass.printC: " + Inner.this.c); // Inner.this.innerPrintC(); System.out.print("External classes access internal non static properties:"); System.out.println("OuterClass.printC: " + inner.c); System.out.print("External classes access internal non static methods:"); inner.innerPrintC(); } private static void printD() { System.out.print("External classes access internal static properties:"); System.out.println("OuterClass.printD: " + Inner.d); System.out.print("External classes access internal static methods:"); Inner.innerPrintD(); } private final static class Inner { private Inner() {} private final int c = 30; private static final int d = 40; private void innerPrintA() { // Compilation error // No enclosing instance of the type OuterClass is accessible in scope // System.out.println("Inner.innerPrintA: " + OuterClass.this.a); // OuterClass.this.printA(); System.out.println("Internal classes access external non static properties/Method: compile and report errors"); } private static void innerPrintB() { System.out.print("Internal classes access external static properties:"); System.out.println("Inner.innerPrintB: " + OuterClass.b); printB(); } private void innerPrintC() { System.out.println("Inner.innerPrintC: " + c); } private static void innerPrintD() { System.out.println("Inner.innerPrintD: " + d); } } public static void main(String[] args) { new OuterClass.Inner() .innerPrintA(); OuterClass.Inner.innerPrintB(); new OuterClass().printC(); OuterClass.printD(); } }
Member inner class
/** * Member inner class * @author xuweijsnj */ public class OuterClass2 { private final int a = 10; private static final int b = 20; private Inner inner = new Inner(); public void printA() { System.out.println("OuterClass2.printA: " + a); } public static void printB() { System.out.println("OuterClass2.printB: " + b); } public void printC() { // If you want to directly access the compilation error, you need an internal class instance // No enclosing instance of the type OuterClass2.Inner is accessible in scope // System.out.println("OuterClass2.printC: " + Inner.this.c); // Inner.this.innerPrintC(); System.out.print("External classes access internal non static properties:"); System.out.println("OuterClass2.printC: " + inner.c); System.out.print("External classes access internal non static methods:"); inner.innerPrintC(); } public static void printD() { System.out.print("External classes access internal static properties:"); System.out.println("OuterClass2.printD: " + Inner.d); System.out.println("External classes accessing internal static methods: internal classes cannot define static methods"); } private final class Inner { private Inner() {} private final int c = 30; // It must be static final private static final int d = 40; public void innerPrintA() { System.out.print("Internal classes access external non static properties:"); System.out.println("Inner.innerPrintA: " + OuterClass2.this.a); System.out.print("Internal classes access external non static methods:"); OuterClass2.this.printA(); } // static compilation error // The method innerPrintB cannot be declared static; static methods can only be declared in a static or top level type public void innerPrintB() { System.out.print("Internal classes access external static properties:"); System.out.println("Inner.innerPrintB: " + OuterClass2.b); System.out.print("Internal classes access external static methods:"); printB(); } public void innerPrintC() { System.out.println("Inner.innerPrintC: " + c); } // Compilation error // The method innerPrintD cannot be declared static; static methods can only be declared in a static or top level type // public static void innerPrintD() { // System.out.println("Inner.innerPrintD: " + d); // } } public static void main(String[] args) { new OuterClass2().new Inner().innerPrintA(); new OuterClass2().new Inner().innerPrintB(); new OuterClass2().printC(); OuterClass2.printD(); } }
Anonymous Inner Class
/** * Anonymous Inner Class * @author xuweijsnj */ public class OuterClass3 { private final int a = 10; private static final int b = 20; private void printA() { System.out.println("OuterClass3.printA: " + a); } private static void printB() { System.out.println("OuterClass3.printB: " + b); } public String getDate(Date date) { return date.toString(); } static Date date2 = new Date() { @Override public String toString() { System.out.println("Internal classes access external non static properties:" + OuterClass3.this.a); System.out.println("Internal classes access external static properties:" + OuterClass3.b); System.out.print("Internal classes access external non static methods: unless you use an external class instance, but that doesn't make sense"); new OuterClass3().printA(); System.out.print("Internal classes access external static methods:"); OuterClass3.printB(); return ""; } }; public static void main(String[] args) { OuterClass3 outerClass3 = new OuterClass3(); System.out.println("Member method anonymous inner class"); Date date = new Date() { @Override public String toString() { System.out.println("Internal classes access external non static properties:" + OuterClass3.this.a); System.out.println("Internal classes access external static properties:" + OuterClass3.b); System.out.print("Internal classes access external non static methods: unless you use an external class instance, but that doesn't make sense"); outerClass3.printA(); System.out.print("Internal classes access external static methods:"); OuterClass3.printB(); return ""; } }; outerClass3.getDate(date); System.out.println("----------------------"); System.out.println("Member variable anonymous inner class"); outerClass3.getDate(date2); } }
Local inner class
/** * Local inner class * @author xuweijsnj */ public class OuterClass4 { private final int a = 10; private static final int b = 20; private void printA() { System.out.println("OuterClass4.printA: " + a); } private static void printB() { System.out.println("OuterClass4.printB: " + b); } private void print() { final class Inner { private final int c = 30; // It must be static final private static final int d = 40; private Inner() {} public void innerPrintA() { System.out.print("Internal classes access external non static properties:"); System.out.println("Inner.innerPrintA: " + OuterClass4.this.a); System.out.print("Internal classes access external non static methods:"); OuterClass4.this.printA(); } public void innerPrintB() { System.out.print("Internal classes access external static properties:"); System.out.println("Inner.innerPrintB: " + OuterClass4.b); System.out.print("Internal classes access external static methods:"); printB(); } public void innerPrintC() { System.out.println("Inner.innerPrintC: " + c); } // Compilation error // The method innerPrintD cannot be declared static; static methods can only be declared in a static or top level type // public static void innerPrintD() { // System.out.println("Inner.innerPrintD: " + d); // } }; Inner inner = new Inner(); inner.innerPrintA(); inner.innerPrintB(); System.out.print("External classes access internal non static properties:"); System.out.println("OuterClass4.printC: " + inner.c); System.out.print("External classes access internal non static methods:"); inner.innerPrintC(); System.out.print("External classes access internal static properties:"); System.out.println("OuterClass4.printD: " + Inner.d); System.out.println("External classes accessing internal static methods: internal classes cannot define static methods"); } public static void main(String[] args) { new OuterClass4().print(); } }
This technology is for novices to learn and use. If there is anything wrong, you are welcome to point out the correction. xuweijsnj