2016-04-15 7 views
8
public class Test 
{ 
    static int i = 1; 

    static void m1() 
    { 
    } 
} 

class Test1 extends Test 
{ 
    int i = 1; //allowed 

    void m1()  // not allowed; Both are instance level, so why this difference? Both can be accessed with super keyword 
    { 
    } 
} 

स्थिर विधि को उसी हस्ताक्षर के साथ क्यों छिपाया जा सकता है, लेकिन स्थैतिक क्षेत्र को ऐसा करने की अनुमति है? दोनों उदाहरण स्तर हैं, तो केवल स्थिर क्षेत्र की अनुमति क्यों है?विधि छिपाने और फ़ील्ड छिपाने के लिए विरासत सहायता

+1

[Here's नहीं एक स्पष्ट उत्तर नहीं है, लेकिन अनुमान लगा है यह है कि स्थिर तरीकों या vica कविता छुपा भ्रम हो सकता है] (http://stackoverflow.com/प्रश्न/14602220/क्यों-नहीं-जावा-अनुमति-छिपाने-स्थैतिक-विधियों-द्वारा-उदाहरण-विधियों) – SomeJavaGuy

उत्तर

8

m1() वर्ग Test, एक static विधि है, जबकि Test1 में m1() गैर स्थिर है। अब कल्पना अगर यह तो अनुमति दी गई है | जो कार्यान्वयन क्रम से तोड़ा जाना होगा जब आप बयान नीचे निष्पादित करें:

new Test1().m1(); 

के बाद से बच्चे वर्ग के उदाहरण (आपके मामले में Test1) भी उपयोग कर सकते हैं (मूल वर्ग से स्थिर विधि का उपयोग Test से)। यही कारण है कि इसकी अनुमति नहीं है।

के लिए आप अगले प्रश्न क्यों एक ही नाम के साथ चर Test1 में अनुमति दी है: माता पिता के वर्ग 'स्थिर चर बच्चे वर्ग उदाहरण से पहुँचा नहीं जा सकता। दूसरे शब्दों में अभिभावक वर्ग 'स्थैतिक राज्य बच्चे से छिपा हुआ है। यह

Test1.i; // compilation error, can't access parent's static variable 

संकलन त्रुटि में परिणाम देगा। और यदि आप

new Test1().i; // will access Test1's i variable 

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

नोट:i तो Test में गैर स्थिर था, यहां तक ​​कि उस मामले में Test1 नाम i साथ चर हो सकता है। इस मामले में Test1Test में i छाया करेगा।

संपादित

Shahaan सैयद के comment से:

new Test1().i; ऐसा क्यों अनुमति दी है है मेरी चिंतित

दूसरे शब्दों में Shahaan सैयद के भ्रम में कहें: क्यों

  • जबकि माता पिता वर्ग ही नाम के साथ एक स्थिर चर है चर के मामले में, बच्चे कक्षा एक गैर स्थैतिक चर हो सकता है,
  • दूसरी ओर , बच्चे कक्षा एक गैर स्थिर नहीं हो सकता विधि जब अभिभावक वर्ग के पास एक ही नाम के साथ एक स्थिर विधि है?

केविन Esche commented के रूप में, मैं यह भी लगता है कि जावा बच्चे वर्ग के उदाहरण से माता पिता वर्ग के static तरीकों के लिए उपयोग की अनुमति देकर कहीं में गड़बड़। हालांकि यह एक अच्छा अभ्यास नहीं है और संकलक भी चेतावनी उत्पन्न करता है।

यहाँ (JLS §8.3) से एक उद्धरण है:

इस संबंध में, खेतों के छिपने के तरीकों के छिपने से अलग है (§8.4.8.3), के लिए वहाँ कोई फर्क नहीं स्थिर और गैर के बीच तैयार की है क्षेत्र छिपाने में स्थिर क्षेत्र जबकि एक छेद विधि छिपाने में स्थिर और गैर स्थैतिक तरीकों के बीच खींचा जाता है।

लेकिन मुझे जेएलएस में इसके पीछे कोई तर्क नहीं मिला।

मुझे लगता है कि चेतावनी उत्पन्न करने के बजाय समय त्रुटि संकलित किया जाना चाहिए था। यह static फ़ील्ड और static दोनों को बाल वर्ग के उदाहरण से अभिभावक वर्ग की विधि तक पहुंच रहा है, तो संकलक त्रुटि होनी चाहिए। इस संबंध में चीजें सुसंगत और समझने में आसान होतीं। लेकिन फिर यह सिर्फ मेरा विचार है।

एक ही लाइन पर एक और दिलचस्प सवाल: Why isn't calling a static method by way of an instance an error for the Java compiler?

+4

इस उत्तर को जोड़ने के लिए, यह अत्यधिक संभावना है कि यह भ्रम से बचने के लिए किया जाता है जिसमें यह जड़ है यहां एक बुरी भाषा डिजाइन में (ऑब्जेक्ट इंस्टेंस पर स्थैतिक तरीकों को कॉल करने में सक्षम मधुमक्खी)। – SomeJavaGuy

+0

@ सुधीर सिंह, लेकिन जैसा कि मैंने नए टेस्ट 1() के लिए कहा होगा। I; यह मेरी चिंतित बात क्यों है। –

+2

@ShahaanSyed क्योंकि इस बिंदु पर जावा भाषा खराब डिजाइन की गई थी। अफसोस की बात है कि यहां एकमात्र व्यावहारिक उत्तर है। – SomeJavaGuy

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