Inner Classes in Java

Class ke Andar
Class — Deep Revision

4 types: Member Inner · Static Inner · Local Inner · Anonymous — sab explained with 4–5 programs each!

🔴 Member Inner Class 🔵 Static Inner Class 🟢 Local Inner Class 🟠 Anonymous Inner Class

🔷 Inner Class Kya Hai?

Ek class ke andar doosri class likhna = Inner Class. Ye concept Security, Modularity, aur Outer class ke private members access karne ke liye use hota hai.

┌─────────────────────────────┐ │ Outer Class │ │ │ │ ┌─────────────────────┐ │ │ │ Inner Class │ │ │ │ (andar ki class) │ │ │ └─────────────────────┘ │ │ │ └─────────────────────────────┘ Inner Classes ├── 1. Member Inner Class → Class ke andar, non-static ├── 2. Static Inner Class → Class ke andar, static keyword ├── 3. Local Inner Class → Method ke andar └── 4. Anonymous Inner Class → Naam nahi, on-the-spot banao

Kyun use karte hain? Security — Inner class bahar se directly access nahi hoti. Modularity — Related code ek jagah. Outer class ke private members bhi inner class access kar sakti hai!

🔴 Member Inner

outer.new Inner() se banao. Outer ke sab private members access kar sakti hai.

🔵 Static Inner

new Outer.Inner() — outer ka object nahi chahiye! Sirf static members access.

🟢 Local Inner

Method ke andar declare. Sirf us method mein use. Method ke effectively final variables access.

🟠 Anonymous

Naam nahi hota. On-the-spot implementation. Sirf ek baar use. Interface/Abstract class ke liye.

🔴

Type 1: Member Inner Class

Outer class ke andar, non-static — Outer ke private members bhi access kar sakta hai

outer.new Inner()

Key Rules

Object banane ka order: pehle Outer ka object, phir us object se Inner ka — Outer.Inner in = obj.new Inner()
Inner class Outer ke saare members access kar sakti hai — private bhi! Yahi iska sabse bada advantage hai
Outer class bhi Inner ka object bana sakti hai — apne methods ke andar seedha new Inner()
Compiler Outer$Inner.class naam ki alag .class file banata hai
P1

MemberInner.java — Basic Member Inner Class

Kya seekhenge: Outer.Inner inner = outer.new Inner() — pehle outer object, phir inner. Inner class ke andar outerMessage aur outerData directly access — ye private hain phir bhi! outer.outerMethod() ke andar bhi Inner create ho sakta hai. Yahi Member Inner Class ka power hai — privacy boundary cross kar sakta hai!
P2

BankMember.java — Member Inner (Bank Account Real World)

Kya seekhenge: BankAccount.Transaction — inner class outer ke private double balance directly access karti hai! Transaction log karta hai amount aur balance — outer ka private data inner directly read/write kar sakta hai. Real-world pattern: inner class = tightly coupled helper jo private data access kare!
P3

LinkedListDemo.java — Member Inner (Node as Inner Class)

Kya seekhenge: Node inner class — sirf SimpleList ke liye kaam karti hai. Bahar se koi directly Node nahi bana sakta — encapsulation! Java ka actual LinkedList bhi isi tarah kaam karta hai — Node ek inner class hai. add() aur display() se poori list manage karo.
P4

IteratorDemo.java — Member Inner (Iterator Pattern)

Kya seekhenge: NumberCollection.NumberIterator — Java ke Iterator pattern ka chhota version! Inner class outer ke private int[] numbers aur size directly access karti hai. hasNext() aur next() — ek ek element traverse karo. Java ka actual ArrayList ka Iterator bhi inner class hi hota hai!
P5

OuterInnerAccess.java — Member Inner (this keyword + Shadowing)

Kya seekhenge: Agar outer aur inner mein same naam ka variable ho — Outer.this.x se outer ka access karo, this.x se inner ka! Yahi shadowing hai. Outer.this — outer class ka reference inner class ke andar. Interview mein zaroor poochha jaata hai — Outer.this kya hai?
🔵

Type 2: Static Inner Class

Outer ka object nahi chahiye — directly banao! Sirf static members access

new Outer.Inner()

Key Rules

Outer ka object NAHI chahiye — directly: new Outer.StaticInner()
Sirf outer ke static members access kar sakta hai — non-static nahi! (uniName nahi, location haan)
Jab inner class outer ke instance se independent ho — static use karo (memory efficient)
Builder Pattern mein static inner class bahut common — jaise Person.Builder
P1

StaticInner.java — Static Inner Class Basic

Kya seekhenge: University.Department — outer ka object nahi chahiya! location static hai → access ✅. uniName non-static hai → access ❌ compile error. University.location = "Mumbai" change karo → dono departments pe effect! Static members shared hote hain — sab instances mein same value!
P2

BuilderPattern.java — Static Inner (Builder Design Pattern)

Kya seekhenge: Static inner class ka sabse famous use — Builder Pattern! Person.Builder se step by step object banao. Method chaining — .name("Rahul").age(25).build(). Java ke StringBuilder, AlertDialog.Builder sab isi pattern mein. Interview mein zaroor poochha jaata hai!
P3

AppConfigDemo.java — Static Inner (Nested Config Classes)

Kya seekhenge: Real project mein config alag alag parts mein hoti hai — AppConfig.DatabaseConfig aur AppConfig.ServerConfig — dono static inner classes. AppConfig.APP_VERSION static final — sab access kar sakte hain. Alag alag outer objects ki zaroorat nahi — configuration ek jagah organize!
P4

MapEntryDemo.java — Static Inner (Map.Entry Style)

Kya seekhenge: Java ka Map.Entry ek static inner interface hai. Isi pattern ko yahan class se dikhaya hai — MyMap.Entry static inner class. Key-Value pair store karo. Java ke actual HashMap ka Entry bhi isi tarah static inner class hai! Ye pattern advanced Java mein bahut kaam aata hai.
🟢

Type 3: Local Inner Class

Method ke andar class — sirf us method mein exist karti hai!

Method ke andar only

Key Rules

Method ke andar declare hoti hai — sirf us method ke scope mein exist karti hai
Method ke effectively final variables access kar sakti hai (value change na ho)
Outer class ke members (including private) access kar sakti hai
Method ke bahar is class ka object nahi ban sakta — // Error!
public, private, protected, static use nahi kar sakte class keyword se pehle
P1

LocalInner.java — Local Inner Class (Calculator)

Kya seekhenge: MathHelper class sirf calculate() method ke andar! a aur b method ke parameters — MathHelper directly use karta hai. Method ke bahar new MathHelper() → ERROR. Local class tab use karo jab class sirf ek specific method ke liye kaam kare — bahar koi fayda nahi!
P2

LocalReport.java — Local Inner (Report Formatter)

Kya seekhenge: generateReport() method ke andar Formatter local class. Report formatting logic sirf is method ke liye — bahar koi use nahi. title aur divider method ke local variables — Formatter directly access karta hai. companyName outer class ka private. Complex method logic ko organize karne ke liye local class!
P3

LocalValidator.java — Local Inner (Password Validator)

Kya seekhenge: validatePassword() method mein PasswordChecker local class — saari validation rules ek jagah. minLength method ka effectively final variable — local class access karta hai. Effectively final matlab: value ek baar set ho phir change na ho — explicitly final likhna zaroori nahi Java 8+ mein!
🟠

Type 4: Anonymous Inner Class

Naam nahi, on-the-spot implement karo — sirf ek baar use!

new Type(){...}

Key Rules

Naam nahi hota — directly declare aur instantiate ek saath. Sirf ek baar use hoti hai
3 jagah use: Abstract class, Interface, Normal class (method override)
new ClassName/InterfaceName() { ... } — curly braces mein implementation likho
Java 8 ke baad Lambda expressions ne ise replace kiya — lekin abstract class ke liye ab bhi use hota hai
Bahar ke effectively final variables access kar sakta hai
P1

AnonymousInner.java — 3 Ways (Abstract, Interface, Normal Class)

Kya seekhenge: 3 tarike ek program mein! Way 1: Animal cat = new Animal() { void sound(){...} } — abstract class ki on-the-spot implementation. Way 2: Greeting hindiGreet = new Greeting() {...} — interface. Way 3: Vehicle sportsCar = new Vehicle() {...} — normal class ka method override. Har baar alag object, alag behaviour — naam nahi!
P2

AnonComparator.java — Anonymous Inner (Sorting with Comparator)

Kya seekhenge: Java ke sorting mein anonymous inner class ka sabse common use — Comparator! Arrays.sort(arr, new Comparator(){...}) — on-the-spot comparison logic. Alag alag anonymous Comparators: ascending, descending, by length. Java 8 se pehle sab log aise hi sort karte the — ab Lambda use hota hai, lekin concept same hai!
P3

AnonThread.java — Anonymous Inner (Runnable / Thread)

Kya seekhenge: Runnable interface ki anonymous implementation — Thread ke liye! new Thread(new Runnable(){...}) — on-the-spot task define karo. 3 alag threads, 3 alag anonymous classes. Java multithreading mein anonymous inner class bahut common tha Java 8 se pehle — ab Lambda use hota hai lekin concept same!
P4

InnerClassReal.java — Real World: Sab Types ek jagah (School System)

Kya seekhenge: SABSE IMPORTANT PROGRAM — sab 4 types ek saath! School class mein: Member Inner (Teacher), Static Inner (Rules), Local Inner (FeeCalculator in method), Anonymous Inner (Event interface). Exam aur interview ke liye ye program perfectly yaad kar lo!

📋 Quick Revision Table

TypeKeywordObject BananaOuter AccessKab Use
🔴 Member Inner-outer.new Inner()Sab members (private bhi!)Outer ke private data chahiye
🔵 Static Innerstaticnew Outer.Inner()Sirf static membersOuter object se independent ho
🟢 Local Inner-Method ke andar onlyOuter + method varsSirf ek method ke liye logic
🟠 Anonymous-new Interface/Class(){}Effectively final varsEk baar ka on-the-spot implementation

⚠️ Important Rules

RuleDetail
Inner → OuterOuter ke private members bhi milte hain (Member Inner mein)
Outer → InnerDirectly nahi milte, object chahiye
Static InnerOuter ka object nahi chahiye — new Outer.Inner()
AnonymousNaam nahi hota, ek baar kaam — new Type(){...}
.class filesCompiler Outer$Inner.class banata hai (Member/Static ke liye)
Local Inner accessMethod ke effectively final variables access kar sakti hai

⭐ Interview Questions

Member Inner aur Static Inner mein kya fark hai?
Member Inner — outer ka object ZAROOR chahiye (outer.new Inner()), outer ke sab private members access. Static Inner — outer ka object nahi chahiye (new Outer.Inner()), sirf outer ke static members access. Memory efficient bhi hota hai.
Inner class outer ke private members kyun access kar sakti hai?
Java ka design hai — inner class outer class ka hi hissa maana jaata hai. Compiler ke liye dono ek hi unit hain. Isliye access control boundary inner class ke liye apply nahi hoti. Yahi main reason hai inner classes use karne ka — encapsulated access!
Outer.this kya hai?
Jab inner aur outer mein same naam ka variable ho (shadowing), tab Outer.this.variable se outer class ka variable access karte hain. this.variable inner ka, Outer.this.variable outer ka. Inner class outer class ka reference Outer.this se rakhti hai memory mein.
Anonymous Inner Class kab use karte hain?
Jab kisi interface ya abstract class ka ek baar ka implementation chahiye — alag class banane ki zaroorat nahi. Common uses: event handlers, Comparator for sorting, Thread Runnable, Strategy pattern. Java 8 ke baad Lambda use karte hain — lekin anonymous class abstract classes ke liye zaroor kaam aata hai.
Local Inner Class effectively final kyun chahiye?
Local variables stack pe hote hain — method khatam hote hi destroy ho jaate hain. Inner class object heap pe rehta hai. Agar variable change ho sakta toh inconsistency hogi — class purani value dekhegi, bahar naya. Isliye Java effectively final variables hi allow karta hai — safe consistency!
Real-world mein inner class ka best example?
Static Inner: Map.Entry (HashMap), Person.Builder (Builder pattern). Member Inner: ArrayList.Itr (Iterator). Anonymous: Event handlers in Swing/Android. Local Inner: Complex method mein helper logic. Java ke standard library mein inner classes bahut jagah use hain!

🧩 Inner Classes in Java — Complete Deep Revision Guide

Order mein run karo: P1 → P2 → P3 → P4 → P5 | Har program ek naya concept add karta hai! 🎯