दिलचस्प पोस्ट
कैसे शुरू करने के लिए var? फ़ंक्शन के लिए मैं स्रोत कोड कैसे देख सकता हूं? स्पिनर को एक्शनबार में जोड़ना (नेविगेशन नहीं जावा स्ट्रिंग में उद्धरण कैसे दर्ज करें? वायदा के लिए एक ठीक ट्यूनेड थ्रेड पूल को कॉन्फ़िगर कैसे करें? वसंत MVC का उपयोग करके पीडीएफ जेनरेट करें सी प्रीप्रोसेसर: स्ट्रिंग के लिए एक्सटेक्ट इंट जब मैं stdClass का उपयोग करना चाहिए और जब मुझे php oo कोड में एक सरणी का उपयोग करना चाहिए? आप कैसे एचटीटीपी कॉन्टेक्ट कर सकते हैं केवल कुकीज / जावा वेबएप में कुकीज़? ब्राउज़र स्वचालित रूप से बाह्य जावास्क्रिप्ट फ़ाइल के कैश को कब साफ़ करता है? विभिन्न डोमेन में सत्र चर को संरक्षित करना Android लेआउट संपादक ConstraintLayout Cronjob या MySQL घटना? मैं CSS क्रॉस-ब्राउज़र के साथ ऊर्ध्वाधर पाठ कैसे आकर्षित करूं? पिक्चरबॉक्स PaintEvent अन्य विधि के साथ

जावा 8 में सार वर्गों और इंटरफेस के बीच अंतर क्या हैं?

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

तो क्या है?

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

नया जावा 8 इंटरफेस डायमंड की समस्या से कैसे बचें?

Solutions Collecting From Web of "जावा 8 में सार वर्गों और इंटरफेस के बीच अंतर क्या हैं?"

इंटरफेस उनके साथ जुड़े राज्य नहीं कर सकते।

सार कक्षाएं उनके साथ जुड़े राज्य हो सकती हैं।

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

और अंत में, यदि हीरा की समस्या आती है, तो कंपाइलर आपको चेतावनी देगा, और आपको यह चुनना होगा कि आप किस इंटरफ़ेस को कार्यान्वित करना चाहते हैं

डायमंड की समस्या के बारे में अधिक जानकारी के लिए, निम्न कोड पर विचार करें:

interface A { void method(); } interface B extends A { @Override default void method() { System.out.println("B"); } } interface C extends A { @Override default void method() { System.out.println("C"); } } interface D extends B, C { } 

यहां मैं interface D extends B, C पर संकलक त्रुटि को interface D extends B, C , कि:

interface D inherits unrelated defaults for method() form types B and C

तय है:

 interface D extends B, C { @Override default void method() { B.super.method(); } } 

अगर मैं B से method() वारिस करना चाहता था
वही धारण करता है अगर D एक class थे।

जावा 8 में इंटरफेस और अमूर्त वर्गों के बीच के अंतर के बारे में और भी अधिक दिखाने के लिए, निम्नलिखित Team विचार करें:

 interface Player { } interface Team { void addPlayer(Player player); } 

आप सिद्धांत में addPlayer एक डिफ़ॉल्ट कार्यान्वयन प्रदान कर सकते हैं जैसे कि आप खिलाड़ी को उदाहरण के लिए खिलाड़ियों की सूची में जोड़ सकते हैं।
लेकिन रुकें…?
मैं खिलाड़ियों की सूची कैसे संग्रहीत करूं?
इसका उत्तर यह है कि आप ऐसा नहीं कर सकते जो एक इंटरफ़ेस में, भले ही आपके पास डिफ़ॉल्ट कार्यान्वयन उपलब्ध हो।

कुछ बहुत विस्तृत उत्तर दिए गए हैं, लेकिन वे एक बिंदु याद कर रहे हैं कि मैं कम से कम एक के रूप में माना जाता है कि ये सब कुछ बिल्कुल अमूर्त कक्षाएं हैं :

सार कक्षाएं संरक्षित सदस्य (और डिफ़ॉल्ट दृश्यता वाले सदस्य) हो सकते हैं। इंटरफेस में तरीके आम तौर पर सार्वजनिक हैं

हीरे की समस्या की परिभाषा एक अस्पष्ट है। ऐसे सभी प्रकार के मुद्दे हैं जो एकाधिक विरासत के साथ हो सकते हैं। सौभाग्य से, उनमें से ज्यादातर को संकलन-समय पर आसानी से पता लगाया जा सकता है, और प्रोग्रामिंग भाषाओं इन मुद्दों पर काम करने के लिए सरल समाधान का समर्थन करती हैं। इन समस्याओं में से अधिकांश हीरे की समस्या के लिए विशिष्ट नहीं हैं उदाहरण के लिए, हीरे के बिना तरीकों की परस्पर विरोधी परिभाषाएं भी हो सकती हैं :

 interface Bar { default int test() { return 42; } } interface Baz { default int test() { return 6 * 9; } } class Foo implements Bar, Baz { } 

हीरे के साथ विशिष्ट समस्या, समावेशी बनाम अनन्य का सवाल है। यदि आपके पास एक प्रकार पदानुक्रम है जहां बी और सी से प्राप्त होते हैं, और डी बी और सी से निकला है , तो सवाल यह है:

  • डी एक बी * और * सी है (यानी एक प्रकार का ), या
  • डी है एक बी * या * एक सी (यानी दो प्रकार के )।

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

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

हीरे की समस्या केवल एक इंटरफ़ेस को दो इंटरफेस लागू करने की इजाजत नहीं दे रही है, जब दोनों इंटरफेस समान हस्ताक्षर के साथ उसी विधि के लिए एक डिफ़ॉल्ट कार्यान्वयन प्रदान करते हैं।

जावा 8 हालांकि इंटरफेस के लिए डिफ़ॉल्ट कार्यान्वयन का परिचय देता है, जिसका अर्थ है कि यह अंतरफलक और सार वर्ग के बीच महत्वपूर्ण अंतर नहीं है।

अभी भी कुछ और महत्वपूर्ण मतभेद हैं इस पोस्ट का संदर्भ लें:

जावा 8 में डिफ़ॉल्ट वर्ग बनाम सार वर्ग के साथ अंतरफलक

नया जावा 8 इंटरफेस डायमंड की समस्या से कैसे बचें?

मामला 1: आप दो इंटरफेस लागू कर रहे हैं, जो एक ही default पद्धति है, आपको अपने कार्यान्वयन वाले वर्गों में विरोध को हल करना होगा

 interface interfaceA{ default public void foo(){ System.out.println("InterfaceA foo"); } } interface interfaceB{ default public void foo(){ System.out.println("InterfaceB foo"); } } public class DiamondExample implements interfaceA,interfaceB{ public void foo(){ interfaceA.super.foo(); } public static void main(String args[]){ new DiamondExample().foo(); } } 

उपरोक्त उदाहरण नीचे आउट आउट करें:

 InterfaceA foo 

केस 2: आप एक बेस क्लास का विस्तार कर रहे हैं और डिफ़ॉल्ट पद्धति के साथ इंटरफ़ेस को कार्यान्वित कर रहे हैं। कंपाइलर आपके लिए हीरा की समस्या का समाधान करता है और आपको इसे पहले उदाहरण के रूप में हल करने की ज़रूरत नहीं है

 interface interfaceA{ default public void foo(){ System.out.println("InterfaceA foo"); } } class DiamondBase { public void foo(){ System.out.println("Diamond base foo"); } } public class DiamondExample extends DiamondBase implements interfaceA{ public static void main(String args[]){ new DiamondExample().foo(); } } 

उदाहरण के ऊपर उत्पादन से नीचे का उत्पादन होता है:

 Diamond base foo