संभव डुप्लिकेट:
Why can’t enum’s constructor access static fields?क्यों enum निर्माता स्थिर क्षेत्र तक नहीं पहुँच सकता
enum Test {
e1,e2;
int i=0;
static int j=5;
Test(){
System.out.println(i+" "+j);
}
}
उपरोक्त कोड में निर्माता उदाहरण चर नहीं बल्कि स्थिर चर जम्मू तक पहुँच सकते हैं
मैंने उत्तर को अन्य लेखक से संबंधित उत्तर पढ़ा है, सभी ई 1 और ई 2 कह रहे हैं जे (स्थिर क्षेत्र) के प्रारंभ से पहले शुरू किया गया, लेकिन जावा स्पेक के अनुसार सभी स्थैतिक क्षेत्र प्रारंभिक रूप से जब कक्षा को स्मृति में लोड किया गया था, जो कि कन्स्ट्रक्टर के चलने से पहले है। तो टेस्ट() कन्स्ट्रक्टर चलाने से पहले स्थिर चर जे को प्रारंभ किया जाना चाहिए। मैं प्रतिबंध को समझने में सक्षम नहीं हूं, क्या कोई भी शरीर मुझे समझ सकता है। मैंने पहले से ही Why can't enum's constructor access static fields? प्रश्नों का उत्तर पढ़ा है, लेकिन मुझे जवाब से खुश नहीं है: - स्थिर फ़ील्ड को शुरू करने से पहले निर्माता को बुलाया जाता है।
अगर enum की तरह एक साधारण वर्ग के साथ एक और उदाहरण लेते मान लीजिए
class Test{
public static final Test t=new Test();
static int a=5;
Test(){
System.out.println(a);
}
public static void main(String[] args) {
}
}
यहाँ तर्क निर्माता स्थिर क्षेत्र के प्रारंभ से पहले चलेंगे और यह भी चल रहा है के रूप में यह प्रिंट 0 है (JVM के रूप में किया था के अनुसार initilization)। लेकिन कोई संकलन त्रुटि या कोई रन टाइम समस्या नहीं है। तो क्यों एक ही चीज enum के साथ नहीं होती है।
वास्तव में अच्छा सवाल है, मैं यह नहीं समझ सका कि यह क्यों है। जावा-कंपाइलर क्लास फ़ाइल को कैसे संकलित करता है इसके साथ कुछ हो सकता है। – Gerbrand
मैं जावा विशेषज्ञ नहीं हूं, लेकिन अनिवार्य रूप से 'enum' के स्थिर सदस्यों के एक enum (' e1' और 'e2') के सदस्य नहीं हैं? और इस तरह, जब * वे * मूल्यों के साथ शुरू होते हैं, तो कन्स्ट्रक्टर को बुलाया जाना चाहिए। लेकिन 'जे' अभी तक शुरू नहीं किया गया होगा? –
जावा में हर enum * java.lang.Enum' विस्तारित एक वर्ग है। यह 'java.lang.Enum' किसी अन्य * सामान्य * कक्षाओं द्वारा बढ़ाया नहीं जा सकता है। तो, आपका तर्क है कि "एनम की तरह एक साधारण वर्ग" अनुमानित उत्पादन उत्पन्न करता है अमान्य है। – Prasanth