2017-06-01 19 views
29

चूंकि जावा 9 हमें इंटरफेस में private और private static विधियों को परिभाषित करने की अनुमति देने जा रहा है, interface और class में शेष अंतर क्या होगा? इसके अलावा, जावा धीरे-धीरे एकाधिक विरासत की ओर बढ़ रहा है?जावा 9 इंटरफेस बनाम कक्षा

+26

मुझे आश्चर्य है कि इसमें इतने सारे अपवॉट हैं ...शेष मतभेद: 'संरक्षित 'समर्थन,' पैकेज-निजी 'समर्थन, ** मूल रूप से सबकुछ लेकिन' निजी 'और' स्थिर '** के अतिरिक्त ** इंटरफ़ेस कक्षाओं, आरक्षित कीवर्ड' इंटरफ़ेस 'और' कक्षा 'का विस्तार नहीं कर सकता ', * दोनों के अस्तित्व के लिए दर्शन/उद्देश्य/कारण .. शायद जा रहा है .. –

+4

@VinceEmigh मैं आपकी चिंता को समझता हूं। लेकिन किसी ने मुझे अपने करियर की शुरुआत में बताया: "कोई सवाल बेवकूफ नहीं है"। और मुझे पता है कि आप सहित, एसओ पर सभी लोग इसे समझेंगे। – Aakash

+3

उत्तर अभी भी जैसा है [जावा 8 में सार तत्वों के साथ इंटरफ़ेस के साथ इंटरफ़ेस] (https://stackoverflow.com/q/19998454/2711488), सिवाय इसके कि इंटरफ़ेस में 'निजी' विधियां हो सकती हैं, जो स्पष्ट रूप से अन्य वर्गों पर प्रभाव नहीं डाल सकता है। – Holger

उत्तर

35

जावा 9 में निजी इंटरफ़ेस तरीकों वास्तव में अन्य निजी तरीकों की तरह व्यवहार: वे एक शरीर (सार कक्षाओं में भी) होना आवश्यक है और कहा जा सकता है और न ही न उपवर्गों द्वारा ओवरराइड। इस तरह वे वास्तव में विरासत के साथ बातचीत नहीं करते हैं। जो (और विशेष रूप से एकाधिक वंशानुक्रम) की बात करते हुए देखते हैं (कम से कम?) यह तीन प्रकार:

  • प्रकार की विरासत का मतलब है कि एक प्रकार हो सकता है एक अन्य प्रकार है, उदा StringएकObject है। जावा ने दिन के एक से अधिक विरासतों को इंटरफेस के माध्यम से अनुमति दी।
  • व्यवहार की विरासत का मतलब है कि एक प्रकार एक अन्य प्रकार के व्यवहार के वारिस कर सकते हैं। जावा 8 से पहले, केवल कक्षाएं विधियों को लागू कर सकती थीं, इसलिए इस तरह की केवल एक ही विरासत थी। जावा 8 के साथ डिफ़ॉल्ट विधियां आईं, जिसने इंटरफेस को विधियों को कार्यान्वित करने की इजाजत दी, इस प्रकार जावा को व्यवहार की एकाधिक विरासत प्रदान की गई।
  • राज्य की विरासत का मतलब है कि एक प्रकार एक और प्रकार की आंतरिक स्थिति को (अर्थात क्षेत्रों) इनहेरिट करती है। जैसा कि यह खड़ा है (जावा 9 और भविष्य में जावा संस्करणों के लिए वर्तमान में प्रस्तावित सब कुछ), केवल कक्षाओं में राज्य हो सकता है, इसलिए इस तरह की केवल एक ही विरासत है।

जैसा कि आप देख सकते हैं निजी इंटरफ़ेस विधियां यहां कुछ भी नहीं जोड़ती हैं। एकाधिक वंशानुक्रम और राज्य:

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

यदि किसी विशेष गैर-सार्वजनिक क्षेत्र या सीधे-बाहर परिभाषित करने के लिए एक इंटरफ़ेस को लागू करने के लिए एक इंटरफ़ेस का कोई तरीका था, तो गेम बदल जाएगा और इंटरफेस कक्षाओं के साथ प्रतिस्पर्धा कर सकता है।

+0

यह सुंदर नहीं है और मैं इसे देखना नहीं चाहता उत्पादन, लेकिन राज्य को कई वर्ग विरासत अनुकरण करने के लिए एक आंतरिक वर्ग के साथ encapsulated नहीं किया जा सकता है? इसके समान: https://stackoverflow.com/questions/3427073/java-interface-implementation-pair/3442218#3442218 – Terran

+0

आंतरिक कक्षा के साथ-साथ क्षेत्र संदर्भित करने वाला फ़ील्ड सार्वजनिक होगा, यह वास्तव में गिनती नहीं है विरासत निजी राज्य। ;) सार्वजनिक स्थिति कोई समस्या नहीं है, बस राज्य से संबंधित तरीकों को इंटरफ़ेस में खींचें। – Nicolai

27

निजी विधियों को उप-वर्गों द्वारा विरासत में प्राप्त नहीं किया जाता है, इसलिए यह सुविधा कार्यान्वयन कक्षाओं को प्रभावित नहीं करती है। मेरा मानना ​​है कि इंटरफेस में निजी विधियां हमें डिफ़ॉल्ट तरीकों के बीच कोड साझा करने की अनुमति देती हैं।

जावा इंटरफेस में अभी भी गैर स्थैतिक सदस्य नहीं हो सकते हैं। यह एक बड़ा अंतर है और एकाधिक विरासत आईएमओ नहीं है।

19

जावा 9 इंटरफेस में अभी भी फ़ील्ड और कन्स्ट्रक्टर नहीं हो सकते हैं। यह कक्षाओं और इंटरफेस के बीच एक बड़ा अंतर बनाता है, इसलिए जावा 9 कई विरासत से बहुत दूर है।

2

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

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