2009-04-21 7 views
10

बाद में एक ही नाम के साथ 2 चर होने एक परियोजना के लिए मेरी कोड का एक हिस्सा है शरीर में एक्स और दो अन्य चर नामक बॉडी क्लास को वाई कहा जाता है। यह भी कैसे संभव है, और जावा पर पृथ्वी पर क्यों अनुमति है?एक वर्ग है कि जावा में अन्य वर्ग फैली

मुझे लगता है इस वर्ग के शरीर का सही कोड है:

public class Body extends Point{ 
    public double mass; 

    public Body() { 
     super(); 
     mass = 0; 
    } 

    public Body(double x, double y, double mass) { 
     super(x,y); 
     this.mass = mass; 
    } 
} 

अपना समय

+0

तो अगर मैं एक प्वाइंट पैरामीटर के साथ एक विधि है, और मैं कक्षा शरीर का एक उदाहरण में भेजने के लिए, मुझे लगता है कि उदाहरण के प्वाइंट से x और y चर उपयोग करने में सक्षम हो जाएगा? और यदि मेरे पास इनपुट पैरामीटर प्वाइंट के बजाए बॉडी टाइप करने का होता है, तो मैं केवल शरीर से एक्स और वाई चर का उपयोग कर पाऊंगा? –

उत्तर

10

एक मायने में के लिए धन्यवाद, आप सुपर वर्ग के क्षेत्र अधिभावी कर रहे हैं। लेकिन गलती से करना बहुत आसान है क्योंकि खेतों में कोई अधिभार नहीं है (आपके पास केवल दिए गए नाम का एक चर है, प्रकार कोई फर्क नहीं पड़ता)। इसे परिवर्तनीय 'छिपाने' या 'छायांकन' के रूप में जाना जाता है। तो, आप सही हैं, आप एक ही नाम के साथ दो क्षेत्रों के साथ खत्म हो जाएगा।

आपका दूसरा उदाहरण सही है। उन्हें सुपर-क्लास से विरासत में मिला है और चूंकि उन्हें निजी घोषित नहीं किया गया है, वे उप-वर्ग के लिए दृश्यमान हैं। यह आमतौर पर एक सुपर-क्लास के फ़ील्ड को संदर्भित करने के लिए बुरी आदत है, और जब तक कोई अच्छा कारण न हो, तो उन्हें निजी घोषित किया जाना चाहिए। सुपर कन्स्ट्रक्टर का आह्वान करने का आपका उदाहरण सबसे अच्छा तरीका है।

इसके अलावा, यदि आप एक ही नाम के साथ एक फ़ील्ड छुपाते हैं, तो भी आप उन्हें super.x, super.y, बनाम this.x के रूप में संदर्भित कर सकते हैं, यह.y, आपको इस स्थिति से बचना चाहिए यदि सब संभव।

+0

तो यदि मेरे पास पॉइंट पैरामीटर के साथ कोई विधि है, और मैं क्लास बॉडी के उदाहरण में भेजता हूं, तो मैं उस उदाहरण के बिंदु से एक्स और वाई चर का उपयोग कर पाऊंगा? और यदि मेरे पास इनपुट पैरामीटर प्वाइंट के बजाए बॉडी टाइप करने का होता है, तो मैं केवल शरीर से एक्स और वाई चर का उपयोग कर पाऊंगा? –

+0

@ मार्टिन एंडर्सन हां, चूंकि प्वाइंट केवल x के बारे में 'जानता है', और आप पैरामीटर प्रकार निर्धारित करते हैं कि आपका कोड कैसे निकलता है। आप निश्चित रूप से पॉइंट पी डाउनकास्ट कर सकते हैं; बॉडी बी = ((बॉडी) पी); बी.मास = xxx; लेकिन यह कभी नहीं करो! ;-) –

1

मैं जल्दी से पता चला है कि यह कर अंदर शारीरिक वर्ग कहा जाता है एक्स दो चर और शरीर में दो अन्य चर y बुलाया पैदा करेगा। यह भी कैसे संभव है, और जावा पर पृथ्वी पर क्यों अनुमति है?

असल में नहीं, आप एक ही नाम के साथ दो चर नहीं बना रहे हैं, जाहिर है कि एक कंपाइलर को यह नहीं करना चाहिए और इसकी अनुमति नहीं देनी चाहिए।

क्या आप हैं कर x और y के रूप में परिभाषित मौजूदा चर पीछा किया जाता है, जिसका अर्थ है कि Body.x और Body.y अनिवार्य रूप से Point.x और Point.y के लिए नामों अतिव्यापी हैं, बाद के दो चर पूरी तरह से कर रही है बॉडी क्लास से पहुंच योग्य (link to Java Language Specification definition of "shadowing")।

नाम छाया आमतौर पर एक बुरी प्रैक्टिस और बग का कारण माना जाता है, और यदि आप जावैक कंपाइलर चेतावनियां चालू करते हैं, तो संकलक आपको इस बारे में कर्तव्यपूर्वक चेतावनी देगा।

+1

असल में, आप अभी भी उन चरों तक पहुंच सकते हैं, प्वाइंट क्लास – Jorn

+1

में प्वाइंट.थिस.एक्स और प्वाइंट.थिस.ई का उपयोग करके दोनों चरों का एक ही नाम है। वे सिर्फ विभिन्न वर्गों में घोषित किए गए हैं। चर के नाम सिर्फ "x" और "y" हैं, न कि "Body.x", "Body.y", "Point.x" और "Point.y"। यहां तक ​​कि आपके द्वारा छायांकन के बारे में जो लिंक दिया गया है, वह कहता है: "कुछ घोषणाओं को उनके नाम के एक ही नाम की एक अन्य घोषणा द्वारा छायांकित किया जा सकता है [...]" - "समान नाम" भाग को नोट करें। –

+0

जेएस .: मुझे लगता है एमबी। निष्पादन योग्य कोड के बजाय वर्णनात्मक होना है। –

5

हां, आपके पास दो चर होंगे, एक दूसरे को छुपाएगा। यह समझ में आता है दो कारणों के लिए यह अनुमति देने के लिए:

  1. मान लीजिए आप एक आधार वर्ग Base और एक व्युत्पन्न वर्ग Derived जो Base के लेखक के बारे में कोई जानकारी नहीं है मिल गया है। क्या Base का लेखक कभी भी कोई फ़ील्ड जोड़ने में सक्षम नहीं होना चाहिए, सिर्फ इसलिए कि व्युत्पन्न वर्ग फ़ील्ड साझा कर सकता है? या DerivedBase में परिवर्तन वास्तव में शुद्धता को प्रभावित नहीं करते समय संकलित करना चाहिए?
  2. आपका क्षेत्रों लगभग हमेशा निजी होना चाहिए, जिस पर यह फर्क नहीं पड़ता कि नाम को दोहराया गया है या नहीं बात - न "पक्ष" दूसरे के चर के बारे में पता चल जाएगा।
4

अन्य लोगों ने जो कहा है उसके आगे आगे: BodyPoint है? नहीं, Body में Point टाइप की स्थिति है। तो Body शायद Point का विस्तार नहीं करना चाहिए। यदि आप विरासत (कार्यान्वयन के) से छुटकारा पा लेते हैं तो आप कई समस्याओं से छुटकारा पा सकते हैं। वह और private (protected नहीं!) और final उदारतापूर्वक उपयोग करें।

+0

सामान्य रूप से "विरासत पर संरचना पसंद करते हैं" अच्छा है, यह भी संभव है कि डिजाइनर चाहता है कि शरीर के पास प्वाइंट के सभी गुण हों (संभवतः ऐसे कुछ भी हैं जिन्हें स्पष्टता के लिए छोड़ा गया है)। – DJClayworth