2013-04-27 2 views
10

JVM विनिर्देश बताता है कि इंटरफेस में java/lang/Object का होना चाहिए, भले ही इंटरफेस java/lang/Object का विस्तार न करें?क्लास फ़ाइल प्रारूप के अनुसार इंटरफ़ेस ऑब्जेक्ट का विस्तार क्यों करते हैं?

मैं विशेष रूप से JVM कल्पना है, जहां यह कहते हैं की §4.1 की चर्चा करते हुए हूँ:

एक अंतरफलक के लिए, super_class आइटम के मूल्य हमेशा constant_pool तालिका में एक वैध सूचकांक होना चाहिए। उस अनुक्रमणिका में निरंतर_पूल प्रविष्टि क्लास ऑब्जेक्ट का प्रतिनिधित्व करने वाली CONSTANT_Class_info संरचना होनी चाहिए।

जेएलएस के §9.2 में, यह कहता है कि इंटरफेस ऑब्जेक्ट का विस्तार नहीं करता है। इसके बजाय एक परोक्ष बनाया सार विधि घोषित किया जाता है जो वस्तु कक्षा में प्रत्येक सार्वजनिक विधि से मेल खाता है: एक अंतरफलक कोई सीधा superinterfaces है

, तो इंटरफ़ेस परोक्ष हस्ताक्षर है, वापसी प्रकार आर के साथ एक सार्वजनिक सार सदस्य विधि मीटर वाणी , और हस्ताक्षर एस, रिटर्न टाइप आर के साथ प्रत्येक सार्वजनिक उदाहरण विधि एम के अनुरूप खंड टी फेंकता है, और ऑब्जेक्ट में घोषित क्लॉज टी फेंकता है, जब तक कि एक ही हस्ताक्षर के साथ एक विधि, एक ही रिटर्न प्रकार, और एक संगत फेंकता खंड स्पष्ट रूप से घोषित नहीं किया जाता है इंटरफेस।

उत्तर

7

रूप §9.2 में उल्लेख किया है: एक अंतरफलक कोई सीधा superinterfaces, तो इंटरफ़ेस परोक्ष हस्ताक्षर रों, वापसी प्रकार आर के साथ एक सार्वजनिक सार सदस्य विधि मीटर वाणी है, और खंड टी फेंकता

हैं प्रत्येक सार्वजनिक के साथ उदाहरण विधि एम हस्ताक्षर एस, रिटर्न टाइप आर के साथ, और ऑब्जेक्ट में घोषित क्लॉज टी फेंकता है, जब तक कि एक ही हस्ताक्षर वाले विधि, उसी रिटर्न प्रकार, और एक संगत थ्रो क्लॉज स्पष्ट रूप सेद्वारा घोषित किया गया हैइंटरफ़ेस।

इसलिए, हम देखते हैं कि, एक अंतरफलक कोई सीधा superinterface होने हालांकि करता है स्पष्ट रूप से फैली हुई है Object नहीं लेकिन फिर भी यह Object वर्ग आंतरिक के साथ एक लिंक के रूप में यह एक ही हस्ताक्षर और साथ सार तरीकों को सम्मिलित करने के संकलक द्वारा प्रयोग किया जाता है इंटरफ़ेस के भीतर Object कक्षा में सार्वजनिक विधियों के रूप में वापसी प्रकार और खंड को फेंकता है। यही कारण है कि एक इंटरफ़ेस के लिए, super_class आइटम का मान हमेशा स्थिर_पूल तालिका में मान्य अनुक्रमणिका होना चाहिए। उस अनुक्रमणिका में निरंतर_पूल प्रविष्टि एक CONSTANT_Class_info संरचना होना चाहिए जो वर्ग ऑब्जेक्ट का प्रतिनिधित्व करती है। यही कारण है कि एक इंटरफ़ेस संदर्भ चर toString()Object की विधि उदाहरण के लिए सार्वजनिक उदाहरण विधियों को सफलतापूर्वक कॉल कर सकता है। उदाहरण के लिए, पर विचार कोड नीचे दिए गए:

interface MyInterface 
{} 
public class InterfaceTest implements MyInterface 
{ 
    public static void main(String[] args) 
    { 
     MyInterface mInterface = new InterfaceTest(); 
     System.out.println(mInterface.toString());//Compiles successfully. Although toString() is not declared within MyInterface 
    } 
} 

ऊपर कोड को सफलतापूर्वक संकलित भले ही toString() विधि MyInterface भीतर घोषित नहीं किया गया है (Object की विधि है)। उपरोक्त कोड मेरे सिस्टम पर निम्नलिखित आउटपुट प्रदान कर रहा है:

[email protected] 

आउटपुट सिस्टम से सिस्टम में भिन्न हो सकता है ..

0

जो आप जेवीएम स्पेक में देखते हैं वह मूल रूप से जेएलएस द्वारा निर्दिष्ट व्यवहार का ठोस कार्यान्वयन है - जैसे कक्षाएं इंटरफेस को लागू करती हैं और कार्यान्वयन के विवरण होते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे