वास्तव में क्या होता है (यानी संकलक कक्षाओं से क्या उत्पन्न करता है) - 1

"हाय, अमीगो! यहां आपके लिए कुछ और जानकारी है।"

"मैंने आपको पहले ही बताया था कि संकलक वास्तव में सभी अज्ञात कक्षाओं को सामान्य आंतरिक कक्षाओं में परिवर्तित कर देता है।"

"हाँ। मुझे यह भी याद है कि उनके नाम संख्याएँ हैं: 1, 2, 3, आदि।"

"बिल्कुल सही। लेकिन यहाँ एक और सूक्ष्मता है।"

"यदि किसी विधि के अंदर एक वर्ग घोषित किया गया है और इसके किसी भी चर का उपयोग करता है, तो उन चरों के संदर्भ उत्पन्न वर्ग में जोड़े जाएंगे। अपने लिए देखें।"

"हम इसके साथ शुरू करते हैं:"

संकलन करने से पहले:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
 final int number = i;
   result.add(new Car()
    {
     public String toString()
     {
      return ""+number;
     }
    });
  }
  return result;
 }
}

"और संकलक इसे उत्पन्न करता है:

संकलन के बाद:
class Car
{
 public ArrayList createPoliceCars(int count)
 {
  ArrayList result = new ArrayList();

  for(int i = 0; i < count; i++)
  {
   final int number = i;
   result.add(new Anonymous2 (number));
  }
   return result;
  }

 class Anonymous2
 {
  final int number;
  Anonymous2(int number)
 {
  this.number = number;
 }

  public String toString()
  {
   return ""+ number;
  }
 }
}

"क्या आपको बात समझ में आई? इनर क्लास मेथड के लोकल वेरिएबल को नहीं बदल सकता है, क्योंकि जब तक इनर क्लास का कोड निष्पादित होता है, हम पूरी तरह से मेथड से बाहर हो सकते हैं।"

"अब दूसरा बिंदु। toString() विधि पारित चर का उपयोग करती है। इसे पूरा करने के लिए, यह आवश्यक था:"

ए) इसे जेनरेट क्लास के अंदर सेव करें

बी) इसे कंस्ट्रक्टर में जोड़ें।

"समझ गया। विधियों के अंदर घोषित वर्ग हमेशा चर की प्रतियों का उपयोग करते हैं।"

"बिल्कुल!"

"फिर यह समझ में आता है कि चर अंतिम क्यों होने चाहिए। और उन्हें क्यों नहीं बदला जा सकता है। यदि आप वास्तव में मूल के बजाय प्रतियों के साथ काम कर रहे हैं, तो उपयोगकर्ता यह नहीं समझ पाएगा कि वह चर के मूल्यों को क्यों नहीं बदल सकता है, जो इसका मतलब है कि हमें उसे उन्हें बदलने से मना करना होगा।"

"ठीक है, चर को अंतिम रूप से घोषित करने के बदले में भुगतान करने के लिए एक छोटी सी कीमत लगती है, संकलक आपके लिए एक वर्ग उत्पन्न करता है, इसे विधि में पास करता है, और उस विधि के सभी चर को सहेजता है जिसे आप उपयोग करना चाहते हैं।"

"मैं सहमत हूं। अनाम स्थानीय वर्ग अभी भी सुपर कूल हैं।"

"अगर मैं एक विधि के अंदर एक स्थानीय वर्ग की घोषणा करता हूं, और मैं इसमें विधि के चर का उपयोग करता हूं, तो क्या संकलक उन्हें कक्षा में भी जोड़ देगा?"

"हाँ, यह उन्हें कक्षा और उसके कन्स्ट्रक्टर में जोड़ देगा।"

"वही मैंनें सोचा।"