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

"हाय, एली!"

"आज आमच्याकडे एक अतिशय मनोरंजक विषय आहे. आज मी तुम्हाला नेस्टेड क्लासेसबद्दल सांगणार आहे."

"जर एखादा वर्ग दुसऱ्या वर्गात घोषित केला असेल, तर तो एक नेस्टेड क्लास आहे. नॉन-स्टॅटिक नेस्टेड क्लासेसना इनर क्लासेस म्हणतात."

"आतील वर्गातील वस्तू बाह्य वर्गाच्या वस्तूंच्या आत नेस्टेड असतात आणि त्यामुळे ते बाह्य वर्गाच्या व्हेरिएबल्समध्ये प्रवेश करू शकतात."

उदाहरण
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 पद्धत आहे. ते कार ऑब्जेक्टच्या हाईट व्हेरिएबलचा वापर करते आणि दरवाजाची उंची परत करते."

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

"दार ऑब्जेक्ट कार ऑब्जेक्टपासून स्वतंत्रपणे अस्तित्वात असू शकत नाही. शेवटी, ते कार ऑब्जेक्टच्या व्हेरिएबल्सचा वापर करते. कंपायलर अदृश्यपणे कन्स्ट्रक्टरला जोडतो आणि डोर क्लासला बाह्य कार ऑब्जेक्टचा संदर्भ देतो, जेणेकरून अंतर्गत दरवाजा वर्गाच्या पद्धती बाह्य कार वर्गाच्या व्हेरिएबल्समध्ये प्रवेश करू शकतो आणि त्याच्या पद्धती कॉल करू शकतो."

"नेस्टेड ऑब्जेक्ट्स. मला अर्थ प्राप्त होतो. आकृतीनुसार, हे सर्व अगदी सरळ आहे."

"आणि तसे आहे. एक दोन बारकावे वगळता."

"आतील दरवाजा वर्गात कार ऑब्जेक्टचा संदर्भ आहे, म्हणून:"

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

"म्हणजे, जर आपण आतील वर्गाच्या पद्धतीमध्ये 'हे' लिहितो, तर 'हे' आतल्या वर्गाला सूचित करते?"

"अगदी बरोबर."

"आतील वर्गांबद्दल तुला काय वाटतं, अमिगो?"

"ते खूप मनोरंजक आहेत. मी असे म्हणणार नाही की ते खूप कठीण आहेत."

"अनेक निर्बंध आहेत, परंतु ते निर्बंध कोठून आले आहेत आणि ते का अस्तित्त्वात आहेत हे आपण स्पष्ट केल्यानंतर ते अगदी तार्किक वाटतात."

"तसेच, मी दोन महिन्यांपासून टास्कमध्ये नेस्टेड क्लासेस लिहित आहे, परंतु आताच मला कळले की मी खरोखर काय लिहित आहे."

"उत्तम धड्याबद्दल धन्यवाद, एली."

"मला आनंद झाला की तुला ते आवडले, अमिगो."