java - Problem in instance variable initialization -


यहाँ कुछ नमूना कोड है,

  वर्ग आधार {निजी इंट वैल; बेस () {val = लुकअप (); } Public int lookup () {// कुछ लुकअप // पूर्णांक संख्या = someLookup (); वापसी 5; } सार्वजनिक एट वैल्यू () {रिटर्न वैल; }} वर्ग निकाले गए बेस {निजी इंट संख्या = 10; सार्वजनिक इंट लुकअप () {वापसी संख्या; }}  


  वर्ग टेस्ट {सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग अरिज []) {डर्इडेड डी = नया डिरिएटेड (); System.out.println ("d.value () रिटर्न" + d.value ()); }}  

आउटपुट: d.value () रिटर्न 0 / / मुझे लुकअप के रूप में 10 की अपेक्षा है () ओवरराइड किया गया है, लेकिन 0 नहीं! क्या कोई इसे स्पष्ट कर सकता है?

व्युत्पन्न के उदाहरण चर का आरंभ उसके लुकअप विधि निष्पादित होने पर नहीं हुआ है। मैं यह कैसे सुनिश्चित करूं कि व्युत्पन्न के आवृत्ति चर को आरंभ किया जाता है जब इसकी विधि कहा जाता है? someLookup

एक शुरुआत के लिए, यह कोड someLookup < / कोड> विधि।

फिर भी, मुझे लगता है कि आपकी समस्या यह है कि आपका एक्सचेंज अमान्य है क्योंकि कंसल्टेंट्स क्रमिक रूप से चलाए जा रहे हैं।

एक सुपरक्लास 'कन्स्ट्रक्टर हमेशा चला जाता है उपवर्ग 'से पहले, और इसमें उपवर्ग' वेरिएबल्स के लिए शुरुआती शामिल होते हैं (जो वास्तव में निर्माता के भाग के रूप में चलाए जाते हैं) इसलिए, जब आप व्युत्पन्न का अपना उदाहरण बनाते हैं, तो निम्न होता है:

  1. पहले बेस कन्स्ट्रक्टर लागू किया जाता है।
  2. < Li> lookup () को कॉल किया जाता है, जो व्युत्पन्न में कार्यान्वयन का उपयोग करता है।
  3. num वापस कर दिया जाता है, जो कि इस बिंदु पर डिफ़ॉल्ट मान है क्योंकि व्युत्पन्न कन्स्ट्रक्टर और इनिलाइज़र नहीं चलाए गए हैं
  4. val 0 पर सेट है।
  5. प्राप्त किए गए प्रारंभिक और कन्स्ट्रक्टर रनिंग कॉलिंग lookup से यह बिंदु 10 पर वापस आ जाएगा।

में सामान्य तौर पर, इस कारण के लिए किसी कंसट्रक्टर से गैर-अंतिम विधि को कॉल करने के लिए एक बुरा विचार है, और कई स्थिर विश्लेषण उपकरण आपको इसके विरुद्ध चेतावनी देंगे। यह निर्माण के दौरान ऑब्जेक्ट रिजर्व रिसाव को देने के समान है, आप एक उदाहरण के साथ समाप्त कर सकते हैं जो क्लास स्तर के इनवेरिएन्ट को अमान्य करता है (आपके मामले में, व्युत्पन्न का num "हमेशा" 10 है, लेकिन इसे 0 होना चाहिए कुछ बिंदुओं पर)।

संपादित करें: ध्यान दें कि विशेष केस के लिए, बिना किसी अतिरिक्त कोड के, आप num एक स्थिरांक बनाकर इस समस्या को हल कर सकते हैं :

<पूर्व> वर्ग निकाले गए बेस {निजी स्थिर अंतिम अंत संख्या = 10; ...

यह वास्तव में आप क्या करना चाहते हैं, क्योंकि जब क्लास लोड हो जाने पर स्थिर प्रारंभकर्ता चलाया जाता है (जो कंट्रोलर्स से पहले होता है)। इसके बावजूद यह मानता है कि इसके लिए ठीक है:

क) वर्ग के सभी उदाहरण समान num चर को साझा करने के लिए; बी) num को कभी भी बदलने की जरूरत नहीं है (यदि यह सत्य है तो (ए) सत्यता से स्वचालित होता है।)

आपको दिए गए सटीक कोड में यह स्पष्ट रूप से मामला है, लेकिन मुझे उम्मीद है कि आप संक्षिप्तता के लिए अतिरिक्त कार्यक्षमता को कम कर सकते हैं।

मैं इसे तुलना और रुचि के लिए यहां शामिल करता हूं, नहीं, क्योंकि यह सामान्य समस्या में इस "मुद्दे" के लिए एक उपाय है (क्योंकि यह नहीं है)।


Comments