2012-04-05 26 views
12

क्या निम्नलिखित कोड कानूनी आगे संदर्भ के मामले में है? अगर हां क्यों?जावा कानूनी अग्रेषण संदर्भ

public class MyClass 
{ 
    private static int x = getValue(); 
    private static int y = 5; 
    private static int getValue() 
    { 
    return y; 
    } 
    public static void main(String[] args) 
    { 
    System.out.println(x); 
    } 
} 

उत्तर

19

उपरोक्त कोड आपके पास पूरी तरह से कानूनी जावा है। जावा में, स्थैतिक फ़ील्ड निम्नानुसार आरंभ किए जाते हैं: सबसे पहले, सभी फ़ील्ड्स उनके प्रकार (0, false, या null) के लिए डिफ़ॉल्ट पर सेट होते हैं, और उसके बाद उस क्रम में आरंभ किया जाता है जिसमें उन्हें घोषित किया जाता है। ,

  1. सेट x और शून्य करने के लिए y के बाद से है कि int रों के लिए डिफ़ॉल्ट मान है: इसका मतलब यह है कि इसके बाद के संस्करण कोड निम्न कार्य करने की गारंटी है।
  2. को getValue() पर कॉल करके प्रारंभ करें, जो y के मान को पढ़ता है। चूंकि y अभी तक प्रारंभ नहीं किया गया है, यह अभी भी मूल्य 0.
  3. प्रारंभ y 5. को

इसका मतलब है कि x मान 0 का समय लगेगा और y मूल्य 5. यह व्यवहार है ले जाएगा है पोर्टेबल और गारंटीकृत। You can see this here

आशा है कि इससे मदद मिलती है!

+0

यदि मामला स्थिर चर और विधि नहीं था तो क्या होगा? – Vibhor

+2

मेरा मानना ​​है कि व्यवहार समान है - प्रारंभिकता पहले सबकुछ डिफ़ॉल्ट मान पर सेट कर रही है, फिर निर्दिष्ट मान के साथ प्रत्येक को प्रारंभ करना, फिर कन्स्ट्रक्टर को कॉल करना। – templatetypedef

+1

कौन सा, बीटीडब्ल्यू, एक कारण है कि आपको कभी भी कन्स्ट्रक्टर से गैर-अंतिम (या निजी) विधि नहीं बुलानी चाहिए; किसी व्यक्ति के लिए उस विधि को ओवरराइड करना बहुत आसान है और अभी तक निर्मित 'यह' नहीं है, यहां तक ​​कि एक प्रारंभिक अंतिम फ़ील्ड देखने के बिंदु तक भी। – yshavit

5

आप बता सकते हैं कि यह कानूनी है या नहीं कि यह संकलित करता है; कुछ अन्य भाषाओं के विपरीत, जावा में "अपरिभाषित व्यवहार" की धारणा नहीं है। यहां क्या होता है पूरी तरह से वर्तनी है। यह counterintuitive हो सकता है, लेकिन यह विशेष रूप से कानूनी है: आप एक स्थैतिक चर का उपयोग कर सकते हैं इससे पहले कि यह एक और स्थिर चर शुरू करने के दौरान बुलाया गया एक विधि से शुरू किया गया है। y सीधे तक पहुँचने x के प्रारंभकर्ता से की अल्पज्ञता इसी तरह के मामले - है, यानी

private static int x = y; 
private static int y = 5; 

विशेष रूप से अनुमति नहीं है। वास्तव में कोई मजबूत कारण नहीं है - यह वही है।

+0

क्या होगा यदि चर स्थिर नहीं हैं..इस मामले में भी व्यवहार समान है? – Vibhor

+0

हां, यह प्रभावी रूप से वही है। सांख्यिकी के लिए सूचीबद्ध नियम बहुत अलग हैं क्योंकि कक्षा के लिए कोई वास्तविक "रचनाकार" नहीं हैं, लेकिन वस्तुओं को अनिवार्य रूप से उसी तरह शुरू किया जाता है। उदाहरण के लिए वैरिएबल, प्रारंभकर्ता और इंस्टेंस ब्लॉक प्रत्येक कन्स्ट्रक्टर को उपस्थिति के क्रम में प्रीपेड किए जाते हैं। सांख्यिकी के लिए, प्रारंभकर्ताओं और स्थिर ब्लॉक संकलित किए जाते हैं, क्रमशः, '() 'नामक एक विधि में। –

+0

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