(संपादित करें: जवाब पर विस्तार कुछ टिप्पणियों को जवाब देने के लिए)
संकलक इनर क्लासों लेता है और उन्हें उच्च-स्तरीय कक्षाओं में बदल जाता है। चूंकि निजी विधियां केवल आंतरिक कक्षा में उपलब्ध हैं, इसलिए संकलक को नए "सिंथेटिक" विधियों को जोड़ना होता है जिनमें पैकेज स्तर का उपयोग होता है ताकि शीर्ष-स्तरीय कक्षाओं तक इसका उपयोग हो।
कुछ इस ($ लोगों संकलक द्वारा जुड़ जाते हैं) की तरह:
class A
{
private void f()
{
final B b;
b = new B();
// call changed by the compiler
b.$g();
}
// method generated by the compiler - visible by classes in the same package
void $f()
{
f();
}
}
class B
{
private void g()
{
final A a;
a = new A();
// call changed by the compiler
a.$f();
}
// method generated by the compiler - visible by classes in the same package
void $g()
{
g();
}
}
गैर स्थिर कक्षाओं में एक ही हैं, लेकिन वे बाहरी वर्ग के लिए एक संदर्भ के अलावा हैं, ताकि जैसे तरीकों से कर सकते हैं इसे बुलाओ
कारण जावा यह इस तरह से है कि वे आंतरिक वर्गों का समर्थन करने के वीएम परिवर्तन की आवश्यकता नहीं करना चाहता था, इसलिए सभी परिवर्तनों का संकलक स्तर पर होना ही था।
संकलक भीतरी वर्ग लेता है और यह एक शीर्ष स्तर वर्ग में बदल जाता है (इस प्रकार, वी एम स्तर पर एक आंतरिक वर्ग के रूप में ऐसी कोई बात नहीं है)। कंपाइलर को फिर भी "अग्रेषण" विधियों को उत्पन्न करना होगा। वे पैकेज स्तर (सार्वजनिक नहीं) पर यह सुनिश्चित करने के लिए बनाए जाते हैं कि केवल उसी पैकेज में कक्षाएं ही उन्हें एक्सेस कर सकें। संकलक ने उत्पन्न "अग्रेषण" विधियों के लिए विधि विधियों को निजी विधियों में भी अद्यतन किया।
आप संकलक होने से बचने कर सकते हैं विधि मेरी "पैकेज" (सार्वजनिक, निजी के अभाव में, और संरक्षित) के रूप में तरीकों की घोषणा उत्पन्न करते हैं। इसका नकारात्मक पक्ष यह है कि पैकेज में कोई भी वर्ग विधियों को कॉल कर सकता है।
हां, तो आप एक विधि निजी घोषित करने और संकलक यह जनता के बजाय एक त्रुटि उत्पन्न बदल जाता है? – cbrulak
अच्छी तरह से यह सार्वजनिक नहीं है यह पैकेज है। और, हाँ, यही वह है जो करता है। ऐसा इसलिए है क्योंकि वीएम को आंतरिक कक्षाओं का कोई ज्ञान नहीं है ... इसलिए वीएमएल विशेष चीजों को करने के बजाय संकलक सभी काम करता है। – TofuBeer
पैकेज कक्षा है जिसमें आंतरिक वर्ग शामिल है? – cbrulak