2016-04-19 5 views
9

ऑब्जेक्ट क्लास प्रत्येक वर्ग का आधार वर्ग है, यानी, प्रत्येक वर्ग ऑब्जेक्ट क्लास को बढ़ाती है। ऑब्जेक्ट क्लास में एक सार्वजनिक स्ट्रिंग टूस्ट्रिंग() विधि है और स्ट्रिंग क्लास में भी वही विधि मौजूद है। अब, स्ट्रिंग क्लास ऑब्जेक्ट क्लास को भी बढ़ाता है और विधि टू स्ट्रिंग एक स्ट्रिंग प्रकार देता है।जावा में संकलित ऑब्जेक्ट क्लास की toString() विधि कैसा है?

मेरा प्रश्न है-: ऑब्जेक्ट क्लास को संकलित करते समय, यह स्ट्रिंग.क्लास की खोज करेगा और स्ट्रिंग क्लास ऑब्जेक्ट.क्लास की एक प्रकार की परस्पर निर्भरता की खोज करेगा। इस निर्भरता को कैसे हल किया जाता है? संकलन तंत्र कैसे काम करता है? अगर मैं कहीं गलत हूं तो कृपया मुझे सही करें।

+0

मुझे नहीं पता कि जावा किसी भी वर्ग में इस प्रकार के संदर्भ लूप का समर्थन कैसे करता है। यही कारण है कि आप क्लासपाथ के बिना जावा फ़ाइल संकलित नहीं कर सकते हैं। जब आवश्यक हो तो कंपाइलर अन्य कक्षाओं का निरीक्षण करता है। जावा में – aalku

+0

कक्षा ए आयात बी के साथ कुछ भी गलत नहीं है; और एक वर्ग बी आयात ए; (और अन्य भाषाओं में आगे की घोषणाएं हैं) – Exceptyon

+0

यह एक दूसरे के संदर्भ में दो अन्य वर्गों को संकलित करने जैसा ही है। – SomeJavaGuy

उत्तर

4

जावा कंपाइलर Multi-Pass Compiler है। इसका मतलब है कि संकलन प्रक्रिया में वृद्धिशील कदम हैं। Object संकलित करते समय, यह String का अस्थायी प्रतिनिधित्व करता है ताकि संकलन के लिए Object को अनुमति दें।

आप किसी प्रकार के छुपे हुए इंटरफ़ेस के साथ अस्थायी प्रतिनिधित्व की तुलना कर सकते हैं। संकलक उस इंटरफ़ेस को संकलित करता है। केवल रनटाइम पर संकलित भागों एक साथ आते हैं - कंपाइलर को किसी अन्य वर्ग को संकलित करने के लिए पूरी तरह से संकलित कक्षा की आवश्यकता नहीं होती है, केवल इसका एक अमूर्तता है।

+0

हालांकि यह पूरी तरह फिट नहीं है, कोई भी संकलन और [लिंकिंग] (https://en.wikipedia.org/wiki/Linker_%28computing%29) के चरणों का संदर्भ जोड़ सकता है जो अन्य भाषाओं के लिए किया जाता है। संकलक "मानता है" कि इसमें सब कुछ है जो जरूरत है। लिंकर वास्तव में "लिंक को हल करेगा" (और इन सभी * अपरिभाषित संदर्भ * त्रुटियों को फैलाएं) – Marco13

2

वास्तव में, जब तुम ऐसे कोड लिखें:

public class Class1 
{ 
public Class2 giveClass2() 
{ 
    return new Class2(); 
} 
} 
public class Class2 : Class1 { } 

यह सही ढंग से संकलित है क्योंकि यह कुछ भी दृष्टांत नहीं है। कंपाइलर बस जांचता है कि आपके द्वारा उपयोग किए जाने वाले प्रकार परिभाषित हैं या नहीं।

हालांकि, अगर आप यह नीचे के रूप में लिखें:

public class Class1 
    { 
     public Class1(){ 
      aClass2 = new Class2(); 
     } 
     public Class2 aClass2; 
    } 

    public class Class2 : Class1 
    { 

    } 

यह भी संकलित हो जाएगा, लेकिन यह रन टाइम पर ढेर-अतिप्रवाह का कारण बनता है क्योंकि तब चक्रीय निर्भरता प्रभाव।

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