🪆
OOP

Nested & Inner Classes

Class Inside a Class
💡 A nested class is like a matryoshka (Russian doll) — a class hidden inside another class, working closely with the outer one.

A static nested class can be used independently, without an outer class object — accessed just as Outer.Nested.

A non-static Inner class is tied to an outer object — it can directly see the outer's instance members too.

An anonymous class is a nameless class defined for immediate, one-time use — like a button click listener.

class Outer {
  static class Nested { void show() { System.out.println("Nested"); } }
  class Inner { void show() { System.out.println("Inner"); } }
}
🪆
A nested class is like a matryoshka (Russian doll) — a class hidden inside another class, working closely with the outer one.
1 / 4
On this page (4 subtopics)

Static nested class outer class ke object ke bina bhi ban sakti hai — Outer.Nested obj = new Outer.Nested(). Ye tab use hoti hai jab helper class ka outer instance se koi connection nahi chahiye, bas naming/grouping ke liye andar rakhi hai (jaise Map.Entry, jo Map interface ke andar static nested interface hai).

class Outer {
  static class Nested {
    void show() { System.out.println("Static nested!"); }
  }
}
Outer.Nested n = new Outer.Nested(); // outer object nahi chahiye

Non-static inner class ko banane ke liye pehle outer class ka object chahiye (outerObj.new Inner()). Iska fayda: inner class outer ke saare instance fields/methods directly access kar sakti hai, bina explicitly pass kiye — kyunki inner class implicitly outer object ki reference rakhti hai.

class Outer {
  int x = 10;
  class Inner {
    void show() { System.out.println(x); } // outer ka x directly
  }
}
Outer o = new Outer();
Outer.Inner i = o.new Inner(); // outer object zaroori hai

Method ke andar hi ek class define kar sakte ho — "local class". Ye sirf usi method ke andar use ho sakti hai, aur method ke local (effectively final) variables ko capture kar sakti hai. Rare use-case hai, lekin kabhi-kabhi ek complex helper logic ko method ke andar hi scope karna ho tab useful hai.

Bina naam ke class jo turant define aur instantiate ho jaati hai, one-time use ke liye — purane Java mein event listeners iसी tareeke se likhe jaate the (Java 8 ke lambda se pehle). Aaj bhi useful hai jab ek interface/abstract class ka sirf ek-baar-use implementation chahiye, aur wo interface functional (ek method) nahi hai (jaha lambda kaam nahi karega).

Runnable r = new Runnable() {
  public void run() { System.out.println("Running!"); }
};