Types of Nested Classes

Java supports four types of nested classes. Each type serves different use cases and has unique access rules.

1. Static Nested Class

  • Defined using the static keyword inside another class.
  • Can access only static members of the outer class.
  • Does not require an instance of the outer class to be instantiated.
class Outer {
    static int value = 10;

    static class StaticNested {
        void show() {
            System.out.println("Value: " + value);
        }
    }
}

Usage:

Outer.StaticNested obj = new Outer.StaticNested();
obj.show();

2. Non-static Inner Class

  • Defined without static keyword.
  • Has access to all (including private) members of the outer class.
  • Requires an instance of the outer class to be instantiated.
class Outer {
    int value = 20;

    class Inner {
        void show() {
            System.out.println("Value: " + value);
        }
    }
}

Usage:

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.show();

3. Local Inner Class

  • Defined inside a method or a block.
  • Can access local variables marked as final or effectively final.
  • Mostly used for logical grouping or helper purposes.
class Outer {
    void display() {
        int num = 30;

        class LocalInner {
            void show() {
                System.out.println("Number: " + num);
            }
        }

        LocalInner inner = new LocalInner();
        inner.show();
    }
}

4. Anonymous Inner Class

  • Declared and instantiated in one statement.
  • Has no name.
  • Mostly used for implementing interfaces or abstract classes on the fly.
abstract class Animal {
    abstract void sound();
}

public class Main {
    public static void main(String[] args) {
        Animal dog = new Animal() {
            void sound() {
                System.out.println("Bark");
            }
        };
        dog.sound();
    }
}