इस प्रश्न का उत्तर देने के लिए जावा लैंग्वेज स्पेसिफिकेशन के माध्यम से खोज करते हुए , मैंने सीखा कि
किसी कक्षा को आरंभीकृत करने से पहले, उसके प्रत्यक्ष सुपरक्लास को आरंभीकृत किया जाना चाहिए, लेकिन कक्षा द्वारा लागू किए गए इंटरफेस को प्रारंभ नहीं किया जाता है। इसी तरह, इंटरफेस शुरू होने से पहले एक इंटरफेस के सुपरइन्फॉर्स को इनिशियलाइज़ नहीं किया जाता है।
मेरी अपनी जिज्ञासा के लिए, मैंने इसकी कोशिश की और, जैसा कि अपेक्षित था, इंटरफ़ेस InterfaceType
को आरंभीकृत नहीं किया गया था।
public class Example {
public static void main(String[] args) throws Exception {
InterfaceType foo = new InterfaceTypeImpl();
foo.method();
}
}
class InterfaceTypeImpl implements InterfaceType {
@Override
public void method() {
System.out.println("implemented method");
}
}
class ClassInitializer {
static {
System.out.println("static initializer");
}
}
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public void method();
}
यह कार्यक्रम प्रिंट करता है
implemented method
हालाँकि, यदि इंटरफ़ेस एक default
विधि की घोषणा करता है , तो प्रारंभ होता है। InterfaceType
दिए गए इंटरफ़ेस पर विचार करें
interface InterfaceType {
public static final ClassInitializer init = new ClassInitializer();
public default void method() {
System.out.println("default method");
}
}
इसके बाद ऊपर का वही कार्यक्रम प्रिंट होगा
static initializer
implemented method
दूसरे शब्दों में, static
इंटरफ़ेस के क्षेत्र को इनिशियलाइज़ किया गया है ( विस्तृत इनिशियलाइज़ेशन प्रक्रिया में चरण 9 ) और static
इनिशियलाइज़ किए जा रहे टाइप के इनिशियलाइज़र को निष्पादित किया जाता है। इसका मतलब है कि इंटरफ़ेस को इनिशियलाइज़ किया गया था।
मुझे यह बताने के लिए जेएलएस में कुछ भी नहीं मिला कि ऐसा होना चाहिए। मुझे गलत मत समझो, मैं समझता हूं कि ऐसा तब होना चाहिए जब कार्यान्वयन वर्ग विधि के लिए कार्यान्वयन प्रदान नहीं करता है, लेकिन अगर यह होता है तो क्या होगा? क्या यह स्थिति जावा लैंग्वेज स्पेसिफिकेशन से गायब है, क्या मुझे कुछ याद आया, या क्या मैं इसे गलत तरीके से व्याख्या कर रहा हूं?