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