Comparison of four nested classes in Java

Posted by kmemis on Sun, 30 Jan 2022 19:06:27 +0100

catalogue

Comparison of four nested classes in Java

Static inner class

Member inner class

Anonymous Inner Class

Local inner class

Comparison of four nested classes in Java

There are four nested classes in Java:

  1. Static inner classes} provide some static functions associated with external classes} for example, Map in Map Entry<K,V>
  2. 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.
  3. 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
  4. 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
Comparison of four nested classesStatic inner classMember inner classAnonymous Inner Class Local inner class
Define locationMember variableMember variableWithin a member variable or member methodWithin member method
The inner class has a clear class namehavehavenothinghave
Compiled class nameExternal class name + $+ internal class nameExternal class name + $+ internal class nameExternal class name + $+ numeric numberExternal class name + $+ sequence number + internal class name
Inner class has constructorhavehavenothinghave
Class modifierfinal,abstract,staticfinal,abstractnothingfinal,abstract
Internal class access modifier modifiercancannono
Internal classes access external static propertiescancancancan
Internal classes access external static methodscancancancan
Internal classes access external non static propertiesno

can

OuterClass.this.xxx;

final attribute: outerclass this. xxx;

Non final attribute: no

can
Internal classes access external non static methodsno

can

OuterClass.this.YYY();

nocan
External classes access internal static propertiescanHowever, it must be static finalnocan
External classes access internal static methodscanNo, inner classes cannot define static methodsnoNo, inner classes cannot define static methods
External classes access internal non static properties / methodsInternal class instance requiredInternal class instance requirednocan
DemoOuterClassOuterClass2OuterClass3OuterClass4

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

 

Topics: Java