🪆
OOP

Nested & Inner Classes

Class Inside a Class
💡 Nested class ek matryoshka (russian doll) jaisi hai — ek class ke andar ek aur class chhipi ho sakti hai, jo bahar wali class se closely juda kaam karti hai.

Static nested class outer class ke bina bhi independently use ho sakti hai — sirf Outer.Nested se access.

Inner (non-static) class outer object se juda hota hai — usse outer ke instance members bhi directly dikhte hain.

Anonymous class ek naam-less class hai jo turant, one-time use ke liye define ki jaati hai — jaise ek button click listener.

class Outer {
  static class Nested { void show() { System.out.println("Nested"); } }
  class Inner { void show() { System.out.println("Inner"); } }
}
🪆
Nested class ek matryoshka (russian doll) jaisi hai — ek class ke andar ek aur class chhipi ho sakti hai, jo bahar wali class se closely juda kaam karti hai.
1 / 4
Is page mein (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!"); }
};