"हाय, अमीगो!"

"हाय, ऐली!"

"आज हमारे पास एक बहुत ही दिलचस्प विषय है। आज मैं आपको नेस्टेड क्लासेस के बारे में बताने जा रहा हूँ।"

"यदि किसी वर्ग को किसी अन्य वर्ग के अंदर घोषित किया जाता है, तो यह एक नेस्टेड वर्ग है। गैर-स्थैतिक नेस्टेड वर्गों को आंतरिक वर्ग कहा जाता है।"

"एक आंतरिक वर्ग की वस्तुओं को बाहरी वर्ग की वस्तुओं के अंदर नेस्टेड किया जाता है और इसलिए बाहरी वर्ग के चरों तक पहुँच सकते हैं।"

उदाहरण
public class Car
{
 int height = 160;
 ArrayList doors = new ArrayList();

 public Car
 {
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
  doors.add(new Door());
 }

class Door()
 {
  public int getDoorHeight()
  {
   return (int)(height * 0.80);
  }
 }
}

"ध्यान दें कि डोर क्लास में एक getDoorHeight मेथड है। यह Car ऑब्जेक्ट के हाइट वेरिएबल का उपयोग करता है और डोर की हाइट रिटर्न करता है।"

नेस्टेड क्लासेस - 1

"एक डोर ऑब्जेक्ट एक कार ऑब्जेक्ट से स्वतंत्र रूप से मौजूद नहीं हो सकता है। आखिरकार, यह कार ऑब्जेक्ट के चर का उपयोग करता है। कंपाइलर अदृश्य रूप से कंस्ट्रक्टर और डोर क्लास को बाहरी कार ऑब्जेक्ट के संदर्भ में जोड़ता है, ताकि इनर डोर क्लास के तरीके बाहरी कार वर्ग के चरों तक पहुंच सकते हैं और इसके तरीकों को कॉल कर सकते हैं।"

"नेस्टेड ऑब्जेक्ट। मेरे लिए समझ में आता है। आरेख के आधार पर निर्णय लेना, यह सब बहुत सीधा है।"

"और ऐसा ही है। कुछ बारीकियों को छोड़कर।"

"इनर डोर क्लास में कार ऑब्जेक्ट का संदर्भ है, इसलिए:"

1) आप कार क्लास की स्थिर विधि के अंदर डोर ऑब्जेक्ट नहीं बना सकते हैं, क्योंकि स्टैटिक तरीकों में कार ऑब्जेक्ट का संदर्भ नहीं होता है जो कि डोर कंस्ट्रक्टर को दिया जाता है।

सही ग़लत
public class Car
{
 public static Door createDoor()
 {
  Car car = new Car();
  return car.new Door();
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{
 public static Door createDoor()
 {
  return new Door();
 }

 public class Door
 {
  int width, height;
 }
}

2) डोर क्लास में स्टैटिक वेरिएबल्स या मेथड्स नहीं हो सकते।

सही ग़लत
public class Car
{
 public int count;
 public int getCount()
 {
  return count;
 }

 public class Door
 {
  int width, height;
 }
}
public class Car
{

 public class Door
 {
  public static int count;
  int width, height;

  public static int getCount()
  {
   return count;
  }
 }
}

"और क्या होगा अगर मुझे एक चर की आवश्यकता है जो सभी डोर ऑब्जेक्ट्स द्वारा साझा किया गया है?"

"आप इसे हमेशा कार वर्ग में घोषित कर सकते हैं। फिर इसे कार ऑब्जेक्ट में नेस्टेड सभी डोर ऑब्जेक्ट्स द्वारा साझा किया जाएगा।"

3) नोट: यदि आंतरिक वर्ग को सार्वजनिक घोषित किया जाता है, तो इसके उदाहरण बाहरी वर्ग के बाहर बनाए जा सकते हैं, लेकिन बाहरी वर्ग का एक उदाहरण पहले मौजूद होना चाहिए:

Car car = new Car();
Car.Door door = car.new Door();
Car.Door door = new Car().newDoor();

4) और एक और टिप्पणी जो मैं लगभग भूल ही गया था।

"चूंकि हमारे पास दो नेस्टेड ऑब्जेक्ट्स हैं, आंतरिक ऑब्जेक्ट के तरीकों में 'इस' नामक दो संदर्भों तक पहुंच है:"

public class Car
{
 int width, height;

 public class Door
 {
  int width, height;

  public void setHeight(int height)
  {
   this.height = height;
  }

 public int getHeight()
 {
  if (height != 0)
   return this.height;
  else
   return (int)(Car.this.height * 0.8);
 }
}

"मैंने जानबूझकर कक्षाओं में समान नाम वाले चर घोषित किए।"

"छिपे होने पर बाहरी वर्ग से एक चर का उपयोग करने के लिए, या एक आंतरिक वर्ग के अंदर 'इस' तक पहुँचने के लिए, बस 'YourClassName.this' लिखें:"

बाहरी (या किसी अन्य) वर्ग के 'इस' को कैसे एक्सेस करें
Car.this
Car.Door.this
Car.Door.InnerClass2.InnerClass3.this

"तो, अगर हम 'यह' एक आंतरिक वर्ग की विधि के अंदर लिखते हैं, तो 'यह' आंतरिक वर्ग को संदर्भित करता है?"

"हाँ बिल्कुल।"

"आप आंतरिक कक्षाओं के बारे में क्या सोचते हैं, अमीगो?"

"वे बहुत दिलचस्प हैं। मैं यह नहीं कहूंगा कि वे बहुत कठिन हैं।"

"बहुत सारे प्रतिबंध हैं, लेकिन आपके द्वारा यह समझाने के बाद कि वे प्रतिबंध कहाँ से आते हैं और क्यों मौजूद हैं, वे काफी तार्किक लगते हैं।"

"इसके अलावा, मैं दो महीनों से कार्यों में नेस्टेड कक्षाएं लिख रहा हूं, लेकिन अब मुझे एहसास हुआ है कि मैं वास्तव में क्या लिख ​​रहा हूं।"

"महान पाठ के लिए धन्यवाद, ऐली।"

"मुझे खुशी है कि आपको यह पसंद आया, अमीगो।"