संकलक स्वचालित रूप से आपके गुमनाम भीतरी वर्ग के लिए एक निर्माता उत्पन्न करता है, और इस निर्माता में अपने स्थानीय चर गुजरता है।
कन्स्ट्रक्टर इस मान को क्लास वेरिएबल (एक फ़ील्ड) में सहेजता है, जिसे i
भी नाम दिया जाता है, जिसका उपयोग "बंद" के अंदर किया जाएगा।
यह अंतिम क्यों होना चाहिए? खैर के दशक में स्थिति का पता लगाने में जहां यह नहीं है करते हैं:
public class A {
public void method() {
int i = 0; // note: this is WRONG code
doStuff(new Action() {
public void doAction() {
Console.printf(i); // or whatever
}
});
i = 4; // A
// B
i = 5; // C
}
}
स्थिति एक फ़ील्ड में Action
की i
भी बदलने की आवश्यकता, मान लेते हैं यह संभव है करते हैं: यह Action
वस्तु के संदर्भ में की जरूरत है।
मान लें कि स्थिति बी में Action
के इस उदाहरण कचरा-एकत्र किया जाता है।
स्थिति सी में अब: यह यह की कक्षा चर अद्यतन करने के लिए Action
का एक उदाहरण जरूरत है, लेकिन मूल्य GCed है। इसे जीसीड के "जानना" चाहिए, लेकिन यह मुश्किल है।
तो वीएम को सरल बनाने के लिए, जावा भाषा डिजाइनरों ने कहा है कि यह अंतिम होना चाहिए कि वीएम को यह जांचने के लिए एक तरीका की आवश्यकता नहीं है कि कोई वस्तु समाप्त हो गई है, और गारंटी है कि चर नहीं है संशोधित, और वीएम या कंपाइलर को अज्ञात आंतरिक वर्गों और उनके उदाहरणों के अंदर चर के सभी उपयोगों का संदर्भ रखना नहीं है।
कर सकता हूं तो दोनों उत्तरों को स्वीकार करेंगे, दरअसल, संश्लेषित चर जो परिवर्तनीय की एक प्रति रखता है, नाम नहीं है I। आप जिस कंपाइलर का उपयोग कर रहे हैं उसके आधार पर यह "$ i" या "+ i" है। –