interface enhancements java 8 java functional interface
यह ट्यूटोरियल जावा 8 में इंटरफ़ेस के परिवर्धन की व्याख्या करता है और जावा अवधारणाओं के बीच अंतर जैसे एक अमूर्त वर्ग, कीवर्ड का विस्तार, आदि के साथ हस्तक्षेप करता है:
हमने सभी के बारे में पता लगाया जावा में इंटरफेस हमारे अंतिम ट्यूटोरियल में। हमने कई इंटरफेस सहित जावा में इंटरफेस की बुनियादी अवधारणाओं को पेश किया है और कवर किया है।
जावा 8 से पहले, इंटरफेस को केवल अमूर्त विधियों और स्थिर और अंतिम चर की अनुमति थी। अमूर्त विधियाँ डिफ़ॉल्ट रूप से सार्वजनिक होती हैं और एक इंटरफ़ेस लागू करने वाले वर्ग द्वारा इसे ओवरराइड करने की आवश्यकता होती है।
इसलिए इंटरफ़ेस मुख्य रूप से एक अनुबंध था और केवल स्थिरांक (स्थिर और अंतिम) और सार विधियों के साथ शामिल था।
=> यहाँ जावा शुरुआती गाइड पर एक नज़र रखना।
आप क्या सीखेंगे:
- इंटरफेस 8 जावा में परिवर्तन
- जावा 8 फंक्शनल इंटरफेस
- जावा में क्लास बनाम इंटरफ़ेस
- जावा एक्सटेंशन्स बनाम इम्प्लीमेंट्स
- इंटरफ़ेस बनाम सार वर्ग जावा में
- निष्कर्ष
इंटरफेस 8 जावा में परिवर्तन
Java 8 रिलीज़ परिचय देता है या हमें इंटरफेस में स्थिर और डिफ़ॉल्ट तरीके रखने की अनुमति देता है। एक इंटरफ़ेस में डिफ़ॉल्ट तरीकों का उपयोग करते हुए, डेवलपर्स इंटरफेस में अधिक तरीके जोड़ सकते हैं। इस तरह वे इंटरफ़ेस को लागू करने वाली कक्षाओं को परेशान या परिवर्तित नहीं करते हैं।
जावा 8 भी इंटरफ़ेस को स्थिर विधि की अनुमति देता है। स्टैटिक विधियां वही हैं जो हम कक्षाओं में परिभाषित करते हैं। ध्यान दें कि इंटरफ़ेस को लागू करने वाले वर्ग द्वारा स्थिर विधि को ओवरराइड नहीं किया जा सकता है।
इंटरफ़ेस में स्थिर और डिफ़ॉल्ट तरीकों की शुरूआत ने बिना किसी समस्या के इंटरफेस को बदलना आसान बना दिया और इंटरफेस को लागू करने में भी आसान बना दिया।
जावा 8 कार्यात्मक इंटरफेस के अंदर 'लैम्ब्डा एक्सप्रेशंस' भी पेश करता है। इसके अलावा, जावा 8 से जावा में अधिक अंतर्निहित कार्यात्मक इंटरफेस जोड़े गए हैं।
इस ट्यूटोरियल में, हम जावा 8 में इंटरफेस के लिए इन सभी परिवर्धन पर चर्चा करेंगे और इंटरफेस के साथ विभिन्न जावा अवधारणाओं जैसे अमूर्त वर्ग, कीवर्ड का विस्तार आदि के बीच कुछ अंतरों पर भी चर्चा करेंगे।
जावा में इंटरफ़ेस में स्थैतिक विधि
इंटरफेस में ऐसे तरीके भी हो सकते हैं जिनकी परिभाषा हो सकती है। ये इंटरफ़ेस में स्थिर तरीके हैं। स्थिर तरीकों को इंटरफ़ेस के अंदर परिभाषित किया गया है और उन्हें इस इंटरफ़ेस को लागू करने वाले वर्गों द्वारा ओवरराइड या परिवर्तित नहीं किया जा सकता है।
हम इंटरफ़ेस नाम का उपयोग करके सीधे इन स्थैतिक तरीकों को कॉल कर सकते हैं।
निम्न उदाहरण स्थिर विधि के उपयोग को दर्शाता है।
//interface declaration interface TestInterface { // static method definition static void static_print() { System.out.println('TestInterface::static_print ()'); } // abstract method declaration void nonStaticMethod(String str); } // Interface implementation class TestClass implements TestInterface { // Override interface method @Override public void nonStaticMethod(String str) { System.out.println(str); } } public class Main{ public static void main(String() args) { TestClass classDemo = new TestClass(); // Call static method from interface TestInterface.static_print(); // Call overridden method using class object classDemo.nonStaticMethod('TestClass::nonStaticMethod ()'); } }
आउटपुट:
उपरोक्त कार्यक्रम में एक TestInterface है। इसमें 'static_print' नाम की एक स्थिर विधि है और गैर-स्थैतिक विधि का नाम गैर-स्थैतिक विधि भी है।
हमने TestInterface को TestClass में लागू किया है और गैर-स्थिर मैथोड को ओवरराइड किया है। फिर मुख्य विधि में, हम Test_terface और NonStaticMethod का उपयोग करके सीधे TestClass की वस्तु का उपयोग करके static_print विधि कहते हैं।
इंटरफ़ेस डिफ़ॉल्ट विधि
जैसा कि पहले ही उल्लेख किया गया है, जावा 8 से पहले इंटरफेस केवल अमूर्त तरीकों की अनुमति देता है। फिर हम इस पद्धति को एक अलग वर्ग में लागू करेंगे। यदि हमें इंटरफ़ेस में एक नया तरीका जोड़ना था, तो हमें उसी कक्षा में इसका कार्यान्वयन कोड प्रदान करना होगा।
इसलिए यदि हमने इसमें एक विधि जोड़कर इंटरफ़ेस बदल दिया, तो कार्यान्वयन वर्ग भी बदल जाएगा।
इस सीमा को जावा 8 संस्करण द्वारा दूर किया गया था जिसने इंटरफेस को डिफ़ॉल्ट तरीकों की अनुमति दी थी। एक तरह से डिफ़ॉल्ट विधियाँ मौजूदा इंटरफेस को पिछड़ी संगतता प्रदान करती हैं और हमें कार्यान्वयन वर्ग को बदलने की आवश्यकता नहीं है। डिफ़ॉल्ट विधियों को 'वर्चुअल एक्सटेंशन विधि' या 'डिफेंडर विधियों' के रूप में भी जाना जाता है।
घोषणा में 'डिफ़ॉल्ट' कीवर्ड का उपयोग करके डिफ़ॉल्ट तरीके घोषित किए जाते हैं। घोषणा विधि की परिभाषा के बाद है। हम डिफ़ॉल्ट विधि को ओवरराइड कर सकते हैं क्योंकि यह उस वर्ग के लिए उपलब्ध है जो इंटरफ़ेस को लागू करता है।
उसी तरह, हम इसे लागू किए बिना सीधे इंटरफ़ेस से कार्यान्वयन वर्ग ऑब्जेक्ट का उपयोग करके इसे लागू कर सकते हैं।
interface TestInterface { // abstract method public void cubeNumber(int num); // default method default void print() { System.out.println('TestInterface :: Default method'); } } class TestClass implements TestInterface { // override cubeNumber method public void cubeNumber(int num) { System.out.println('Cube of given number ' + num+ ':' + num*num*num); } } class Main{ public static void main(String args()) { TestClass obj = new TestClass(); obj.cubeNumber(5); // call default method print using class object obj.print(); } }
आउटपुट:
c ++ हैश फ़ंक्शन कार्यान्वयन
उपरोक्त जावा प्रोग्राम इंटरफ़ेस में डिफ़ॉल्ट विधि प्रदर्शित करता है। मुख्य विधि में, ध्यान दें कि हम क्लास ऑब्जेक्ट का उपयोग करके इंटरफ़ेस की डिफ़ॉल्ट विधि को कॉल कर सकते हैं। इसका कारण यह है कि जैसे ही क्लास इंटरफ़ेस लागू करता है, डिफ़ॉल्ट विधि वर्ग के लिए भी उपलब्ध है।
ध्यान दें: हम कार्यान्वयन वर्ग में भी प्रिंट () पद्धति को ओवरराइड कर सकते थे। ध्यान दें कि यदि ओवरराइड किया गया है, तो डिफ़ॉल्ट विधि का एक्सेस संशोधक कार्यान्वयन वर्ग में सार्वजनिक रूप से बदल जाएगा।
डिफ़ॉल्ट तरीके और एकाधिक वंशानुक्रम
कई इंटरफेस के मामले में एक स्थिति उत्पन्न हो सकती है जिसमें प्रत्येक इंटरफ़ेस में एक ही प्रोटोटाइप के साथ एक डिफ़ॉल्ट विधि हो सकती है। ऐसे मामले में, संकलक को पता नहीं है कि किस विधि को लागू करना है।
जब यह स्थिति उत्पन्न होती है जिसमें डिफ़ॉल्ट विधि में सभी इंटरफेस में समान प्रोटोटाइप होता है, तो समाधान कार्यान्वयन वर्ग में विधि को ओवरराइड करने के लिए होता है ताकि जब कार्यान्वयन वर्ग ऑब्जेक्ट डिफ़ॉल्ट विधि को कॉल करे, तो कंपाइलर कक्षा में लागू विधि को लागू करता है ।
निम्न जावा प्रोग्राम कई इंटरफेस के साथ डिफ़ॉल्ट विधि के उपयोग को दर्शाता है।
//Interface_One interface Interface_One{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_One::defaultMethod'); } } //Interface_Two interface Interface_Two{ //defaultMethod default void defaultMethod(){ System.out.println('Interface_Two::defaultMethod'); } } class TestExample implements Interface_One, Interface_Two{ public void disp(String str){ System.out.println('String is: '+str); } //override defaultMethod to take care of the ambiguity public void defaultMethod(){ System.out.println('TestExample::defaultMethod'); } } class Main{ public static void main(String() args) { TestExample obj = new TestExample(); //call the default method obj.defaultMethod(); } }
आउटपुट:
उपरोक्त कार्यक्रम में, हमने कार्यान्वयन कक्षा में डिफ़ॉल्ट विधि (जिसमें दोनों इंटरफेस में एक ही प्रोटोटाइप है) को ओवरराइड किया है। इस तरह जब हम कार्यान्वयन वर्ग के ऑब्जेक्ट का उपयोग करके मुख्य विधि से डिफ़ॉल्ट विधि कहते हैं, तो ओवरराइड विधि को लागू किया जाता है।
जावा 8 फंक्शनल इंटरफेस
एक कार्यात्मक इंटरफ़ेस एक इंटरफ़ेस है जिसमें केवल एक सार विधि है। इसमें डिफ़ॉल्ट और स्थिर विधियों की संख्या हो सकती है, लेकिन इसमें मौजूद अमूर्त विधि बिल्कुल एक है। इसके अतिरिक्त, एक कार्यात्मक इंटरफ़ेस में ऑब्जेक्ट क्लास विधियों की घोषणा हो सकती है।
कार्यात्मक इंटरफ़ेस 'के रूप में जाना जाता है एकल सार विधि इंटरफ़ेस '' एसएएम इंटरफ़ेस ”। SAM इंटरफ़ेस जावा में एक नई सुविधा है।
एक जावा प्रोग्राम में, एक कार्यात्मक इंटरफ़ेस की उपस्थिति का उपयोग करके संकेत दिया गया है @FunctionalInterface एनोटेशन। जब संकलक इस एनोटेशन का सामना करता है, तो यह जानता है कि इस एनोटेशन का अनुसरण करने वाला इंटरफ़ेस कार्यात्मक है। इसलिए यदि इसमें एक से अधिक अमूर्त विधियाँ समाहित हैं, तो यह एक त्रुटि करता है।
एनोटेशन @FunctionalInterface हालाँकि, जावा में अनिवार्य नहीं है।
निम्नलिखित कार्यक्रम जावा में कार्यात्मक इंटरफ़ेस को प्रदर्शित करता है:
//declare a functional interface @FunctionalInterface //annotation indicates it’s a functional interface interface function_Interface{ void disp_msg(String msg); // abstract method // Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } //implementation of Functional Interface class FunctionalInterfaceExample implements function_Interface{ public void disp_msg(String msg){ System.out.println(msg); } } class Main{ public static void main(String() args) { //create object of implementation class and call method FunctionalInterfaceExample finte = new FunctionalInterfaceExample(); finte.disp_msg('Hello, World!!!'); } }
आउटपुट:
जार फ़ाइल कैसे चलाएं
उपर्युक्त कार्यक्रम में कार्यात्मक इंटरफ़ेस में एक एकल सार विधि है और इसमें हैशकोड की तरह एक ऑब्जेक्ट क्लास पद्धति की घोषणा भी है, स्टर्लिंग और बराबर है। इस इंटरफ़ेस को लागू करने वाले वर्ग में, सार पद्धति ओवरराइड की जाती है। मुख्य विधि में, हम कार्यान्वयन वर्ग की एक वस्तु बनाते हैं और विधि का उपयोग करते हैं।
रननेबल और तुलनीय जैसे इंटरफेस जावा में प्रदान किए गए कार्यात्मक इंटरफेस के उदाहरण हैं। जावा 8 हमें कार्यात्मक इंटरफ़ेस ऑब्जेक्ट को लैम्ब्डा एक्सप्रेशन असाइन करने की अनुमति देता है।
निम्न उदाहरण कार्यक्रम यह प्रदर्शित करता है।
class Main{ public static void main(String args()) { // use lambda expression to create the object new Thread(()-> {System.out.println('New thread created with functional interface');}).start(); } }
आउटपुट:
जावा 8 java.util.function पैकेज में कई अंतर्निहित कार्यात्मक इंटरफेस भी प्रदान करता है।
ये अंतर्निर्मित इंटरफेस नीचे वर्णित हैं:
(१) विधेय
यह जावा में एक कार्यात्मक इंटरफ़ेस है जिसमें एकल सार पद्धति का परीक्षण है। निर्दिष्ट तर्क का परीक्षण करने के बाद 'परीक्षण' विधि बूलियन मान लौटाता है।
नीचे दिए गए प्रेडिकेट इंटरफ़ेस के परीक्षण विधि के लिए प्रोटोटाइप है।
public interface Predicate { public boolean test(T t); }
# 2) बाइनरीऑपरेटर
बाइनरीऑपरेटर इंटरफ़ेस एक अमूर्त विधि प्रदान करता है which लागू ’जो दो तर्कों को स्वीकार करता है और तर्कों के समान परिणाम देता है।
स्वीकार पद्धति का प्रोटोटाइप है:
public interface BinaryOperator { public T apply (T x, T y); }
# 3) समारोह
फ़ंक्शन इंटरफ़ेस एक कार्यात्मक इंटरफ़ेस है जिसमें एक अमूर्त विधि भी होती है जिसे 'लागू' नाम दिया गया है। यह लागू करने की विधि, हालांकि, टाइप T का एकल तर्क लेती है और R प्रकार का मान लौटाती है।
लागू विधि का प्रोटोटाइप इस प्रकार है:
public interface Function { public R apply(T t); }
निम्न जावा प्रोग्राम उपरोक्त अंतर्निहित कार्यात्मक इंटरफ़ेस को प्रदर्शित करता है।
import java.util.*; import java.util.function.Predicate; class Main { public static void main(String args()) { // create a list of strings List names = Arrays.asList('Karen','Mia','Sydney','Lacey','Megan'); // declare string type predicate and use lambda expression to create object Predicate p = (s)->s.startsWith('M'); System.out.println('Names starting with M:'); // Iterate through the list for (String st:names) { // test each entry with predicate if (p.test(st)) System.out.println(st); } } }
आउटपुट:
जैसा कि हम उपरोक्त कार्यक्रम में देख सकते हैं कि हमारे पास तार की एक सूची है। कार्यात्मक इंटरफ़ेस का उपयोग करते हुए, यदि हम स्ट्रिंग में आइटम एम से शुरू करते हैं और यदि ऐसा होता है, तो हम परीक्षण करते हैं, तो यह नाम प्रिंट करता है।
जावा में क्लास बनाम इंटरफ़ेस
यद्यपि क्लास और इंटरफ़ेस समान हैं, क्योंकि उनके समान सिंटैक्स हैं, इन दोनों संस्थाओं में समानता की तुलना में अधिक अंतर है।
जावा में वर्ग और इंटरफ़ेस के बीच कुछ अंतरों को सूचीबद्ध करें।
कक्षा | इंटरफेस |
---|---|
हम एक वर्ग से वस्तुओं को तुरंत बना सकते हैं और बना सकते हैं। | एक इंटरफ़ेस को तत्काल नहीं किया जा सकता है। |
कीवर्ड 'क्लास' का इस्तेमाल क्लास बनाने के लिए किया जाता है। | इंटरफ़ेस is इंटरफ़ेस ’का उपयोग करके बनाया गया है। |
जावा में कक्षाएं कई विरासतों का समर्थन नहीं करती हैं। | इंटरफेस जावा में कई विरासत का समर्थन करते हैं। |
क्लास में कंस्ट्रक्टर होते हैं। | इंटरफेस में कंस्ट्रक्टर नहीं होते हैं। |
कक्षा में सार विधियाँ नहीं हो सकती हैं। | इंटरफ़ेस में केवल सार विधियाँ होती हैं। |
कक्षा में चर और तरीके हो सकते हैं जो डिफ़ॉल्ट, सार्वजनिक, निजी या संरक्षित हैं। | इंटरफ़ेस में डिफ़ॉल्ट रूप से केवल सार्वजनिक चर और विधियाँ हैं। |
गैर-पहुंच वाले संशोधक को वर्ग के चर के साथ जोड़ना अनिवार्य नहीं है। | इंटरफेस में वैरिएबल हो सकते हैं जो या तो स्थिर या अंतिम हैं। |
हम एक वर्ग से दूसरी श्रेणी प्राप्त कर सकते हैं। | हम इंटरफ़ेस से एक वर्ग वारिस नहीं कर सकते। |
कीवर्ड 'एक्सटेंड्स' का उपयोग करके कक्षा को विरासत में प्राप्त किया जा सकता है। | इंटरफ़ेस को 'इम्प्लीमेंट्स' कीवर्ड का उपयोग करके दूसरे वर्ग द्वारा लागू किया जा सकता है। इसे be एक्सटेंड्स ’कीवर्ड का उपयोग करके एक अन्य इंटरफ़ेस द्वारा विरासत में लिया जा सकता है। |
जावा एक्सटेंशन्स बनाम इम्प्लीमेंट्स
‘फैली हुई’ | Ments लागू ' |
---|---|
इंटरफेस केवल स्थिर और अंतिम गैर-एक्सेस संशोधक का समर्थन करते हैं। | सार स्थिर, अंतिम, गैर-स्थिर और गैर-अंतिम जैसे सभी गैर-पहुंच वाले संशोधक का समर्थन करता है। |
एक वर्ग दूसरे वर्ग से वारिस करने के लिए 'कीवर्ड का विस्तार करता है' का उपयोग करता है। | इंटरफ़ेस लागू करने के लिए क्लास द्वारा 'इम्प्लीमेंट्स' कीवर्ड का उपयोग किया जाता है। |
अन्य वर्ग को विरासत में देने वाला वर्ग मूल वर्ग के सभी तरीकों को ओवरराइड कर सकता है या नहीं भी कर सकता है। | इंटरफ़ेस को लागू करने वाले वर्ग को इंटरफ़ेस के सभी सार तरीकों को ओवरराइड करना चाहिए। |
हम विस्तारित कीवर्ड का उपयोग करके एक समय में केवल एक वर्ग का विस्तार कर सकते हैं। | हम 'इम्प्लीमेंट्स' कीवर्ड का उपयोग करके कई इंटरफेस लागू कर सकते हैं। |
एक इंटरफ़ेस ’एक्सटेंड्स’ कीवर्ड का उपयोग करके एक अन्य इंटरफ़ेस का विस्तार कर सकता है। | एक इंटरफ़ेस interface इम्प्लीमेंट्स कीवर्ड्स का उपयोग करके दूसरे इंटरफ़ेस को लागू नहीं कर सकता है। |
सार वर्ग जावा में इंटरफ़ेस लागू कर सकते हैं
हां, एक अमूर्त वर्ग ab इम्प्लीमेंट्स ’कीवर्ड का उपयोग करके एक इंटरफ़ेस लागू कर सकता है। सार वर्ग को सभी इंटरफ़ेस सार विधियों को लागू करने की आवश्यकता नहीं है। लेकिन कुल मिलाकर यह एक अच्छा डिज़ाइन अभ्यास है जिसमें सभी सार विधियों के साथ एक इंटरफ़ेस है, फिर एक सार वर्ग जो इस इंटरफ़ेस को लागू करता है, और फिर ठोस कक्षाएं।
नीचे दिए गए जावा में इस तरह के कार्यान्वयन का एक उदाहरण है।
यहाँ java.util.List एक इंटरफ़ेस है। यह इंटरफ़ेस java.util.AbstractList द्वारा कार्यान्वित किया गया है। फिर इस AbstractList क्लास को दो ठोस वर्गों यानी LinkedList और ArrayList द्वारा विस्तारित किया जाता है।
यदि लिंक्डलिस्ट और एरेइलिस्ट वर्गों ने सूची इंटरफ़ेस को सीधे लागू किया था, तो उन्हें सूची इंटरफ़ेस के सभी सार तरीकों को लागू करना होगा।
लेकिन इस मामले में, AbstractList वर्ग सूची इंटरफ़ेस के तरीकों को लागू करता है और उन्हें LinkedList और ArrayList को पास करता है। तो यहाँ पर हमें सामान्य व्यवहार को लागू करने के इंटरफ़ेस और अमूर्त वर्ग लचीलेपन से प्रकार की घोषणा करने का लाभ मिलता है।
जावा में सार वर्ग और इंटरफ़ेस का उपयोग कब करें
हम मुख्य रूप से बच्चे की कक्षाओं के एक डिफ़ॉल्ट या सामान्य व्यवहार को परिभाषित करने के लिए एक सार वर्ग का उपयोग करते हैं जो इस सार वर्ग से विस्तारित होगा। एक इंटरफेस का उपयोग दो प्रणालियों के बीच एक अनुबंध को परिभाषित करने के लिए किया जाता है जो किसी एप्लिकेशन में इंटरैक्ट करता है।
कुछ विशिष्ट स्थितियों का उपयोग किए जाने वाले इंटरफेस के लिए आदर्श हैं और कुछ समस्याएं जो केवल अमूर्त कक्षाओं का उपयोग करके हल की जा सकती हैं। इस खंड में, हम चर्चा करेंगे कि हम इंटरफ़ेस का उपयोग कब कर सकते हैं और जब हम अमूर्त कक्षाओं का उपयोग कर सकते हैं।
इंटरफ़ेस का उपयोग कब करें:
- इंटरफेस का उपयोग मुख्य रूप से तब किया जाता है जब हमारे पास कार्यान्वयन के लिए एक छोटी सी संक्षिप्त कार्यक्षमता होती है।
- जब हम एपीआई लागू कर रहे हैं और हमें पता है कि वे कुछ समय के लिए नहीं बदले हैं, तो उस समय हम इंटरफेस के लिए जाते हैं।
- इंटरफेस हमें कई विरासत को लागू करने की अनुमति देते हैं। इसलिए जब हमें अपने आवेदन में कई विरासत को लागू करने की आवश्यकता होती है, तो हम इंटरफेस के लिए जाते हैं।
- जब हमारे पास वस्तुओं की एक विस्तृत श्रृंखला होती है, तो फिर से इंटरफेस एक बेहतर विकल्प होता है।
- इसके अलावा जब हमें कई असंबंधित वर्गों को एक सामान्य कार्यक्षमता प्रदान करनी होती है, तब भी इंटरफेस का उपयोग किया जाता है।
सार वर्ग का उपयोग कब करें:
- एब्सट्रैक्ट क्लासेस का उपयोग मुख्य रूप से तब किया जाता है जब हमें अपने एप्लिकेशन में इनहेरिटेंस का उपयोग करने की आवश्यकता होती है।
- जैसा कि इंटरफेस सार्वजनिक तरीकों और चर के साथ सौदा करते हैं, जब भी हम अपने कार्यक्रम में गैर-सार्वजनिक एक्सेस संशोधक का उपयोग करना चाहते हैं, हम अमूर्त कक्षाओं का उपयोग करते हैं।
- यदि नए तरीकों को जोड़ना है तो इंटरफ़ेस की तुलना में इसे अमूर्त वर्ग में करना बेहतर है। क्योंकि यदि हम इंटरफ़ेस में एक नई विधि जोड़ते हैं, तो पूरे कार्यान्वयन में बदलाव होता है क्योंकि इंटरफ़ेस में केवल विधि प्रोटोटाइप और वर्ग कार्यान्वयन होता है जो कार्यान्वयन का उपयोग करेगा।
- यदि हम विकसित किए जा रहे घटकों के विभिन्न संस्करण चाहते हैं, तो हम सार वर्ग के लिए जाते हैं। हम अमूर्त कक्षाओं को अधिक आसानी से बदल सकते हैं। लेकिन इंटरफेस नहीं बदले जा सकते हैं। यदि हम एक नया संस्करण चाहते हैं, तो हमें पूरे इंटरफ़ेस को फिर से लिखना होगा।
- जब हम सभी घटकों के लिए एक सामान्य कार्यान्वयन प्रदान करना चाहते हैं, तो अमूर्त वर्ग सबसे अच्छा विकल्प है।
इंटरफ़ेस बनाम सार वर्ग जावा में
नीचे दिए गए जावा में Interfaces और Abstract क्लासेस के बीच कुछ अंतर हैं।
इंटरफेस | सार वर्ग |
---|---|
'इंटरफ़ेस' कीवर्ड का उपयोग करके एक इंटरफ़ेस घोषित किया जाता है। | एक सार वर्ग को 'अमूर्त' कीवर्ड का उपयोग करके घोषित किया गया है। |
इंटरफ़ेस को 'इम्प्लीमेंट्स' कीवर्ड का उपयोग करके लागू किया जा सकता है। | सार 'कीवर्ड का विस्तार' का उपयोग करके विरासत में प्राप्त किया जा सकता है। |
एक इंटरफ़ेस एक वर्ग का विस्तार नहीं कर सकता है या एक इंटरफ़ेस लागू नहीं कर सकता है, यह केवल एक अन्य इंटरफ़ेस का विस्तार कर सकता है। | एक सार वर्ग एक वर्ग का विस्तार कर सकता है या कई इंटरफेस को लागू कर सकता है। |
इंटरफ़ेस सदस्य केवल सार्वजनिक हो सकते हैं। | सार वर्ग के सदस्य सार्वजनिक, निजी या संरक्षित हो सकते हैं। |
कार्यान्वयन प्रदान करने के लिए एक इंटरफ़ेस का उपयोग नहीं किया जा सकता है। इसे केवल घोषणा के रूप में इस्तेमाल किया जा सकता है। | इंटरफ़ेस को लागू करने के लिए एक सार वर्ग का उपयोग किया जा सकता है। |
इंटरफेस का उपयोग करके कई विरासत प्राप्त की जा सकती हैं। | सार वर्ग एकाधिक वंशानुक्रम का समर्थन नहीं करता है। |
इंटरफेस में केवल अमूर्त विधियाँ हो सकती हैं। जावा 8 से, इसमें स्थिर और डिफ़ॉल्ट विधियाँ हो सकती हैं। | एक अमूर्त वर्ग में एक सार या गैर-अमूर्त विधि हो सकती है। |
Enum Inheritance Java में
हमने जावा में डेटा प्रकारों पर हमारी चर्चा में एनम डेटा प्रकारों पर चर्चा की है। सभी enums java.lang.Enum वर्ग से विस्तारित होते हैं। यह वर्ग java.lang.Enum एक सार वर्ग है।
इसके अलावा, जावा में सभी एनम कक्षाएं डिफ़ॉल्ट रूप से 'अंतिम' हैं। इसलिए, किसी भी enum वर्गों से एक वर्ग वारिस करने के प्रयास में एक कंपाइलर त्रुटि होती है।
जैसा कि जावा कई वंशानुक्रम की अनुमति नहीं देता है, हम किसी अन्य वर्ग से एनम वर्ग का वारिस नहीं कर सकते हैं क्योंकि एनुम वर्ग पहले से ही java.lang.Enum से विरासत में मिला है। हालाँकि, enum classes Java में इंटरफेस को लागू कर सकती हैं और इसे Java में Enum inheritance कहा जाता है।
नीचे दिए गए जावा में Enum Inheritance का एक उदाहरण है।
//WeekDays interface declaration interface WeekDays { public void displaydays(); } //enum class implementing WeekDays interface enum Days implements WeekDays { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,FRIDAY, SATURDAY; public void displaydays() { //Override displaydays method System.out.println('The day of the week: ' + this); } } class Main { public static void main(String() args) { Days.MONDAY.displaydays(); //access enum value } }
आउटपुट:
यहां हमारे पास एक सार विधि प्रोटोटाइप प्रदर्शनियों () के साथ एक इंटरफ़ेस वीकडे है। तब हम एक Enum क्लास डेज को परिभाषित करते हैं जो WeekDays इंटरफ़ेस को लागू करता है। यहां हम SUNDAY से SATURDAY तक एनम वैल्यू को परिभाषित करते हैं और डिस्प्ले विधि को भी ओवरराइड करते हैं।
अंत में, मुख्य विधि में, हम एनम मूल्य तक पहुँचते हैं और इसे प्रदर्शित करते हैं।
बार बार पूछे जाने वाले प्रश्न
Q # 1) यदि आप इंटरफ़ेस में एक विधि निकाय देते हैं तो क्या होगा?
उत्तर: जावा 8 से पहले जावा संस्करणों के लिए, इंटरफ़ेस में विधि के निकाय की अनुमति नहीं है। लेकिन जावा 8 के बाद से, हम इंटरफ़ेस के अंदर या तो डिफ़ॉल्ट या स्थिर तरीकों को परिभाषित कर सकते हैं।
Q # 2) क्या कोई इंटरफ़ेस Java 8 में वेरिएबल हो सकता है?
उत्तर: हम स्थिर और अंतिम संशोधक का उपयोग करके जावा 8 में निरंतर चर रख सकते हैं। लेकिन हमारे पास जावा इंटरफेस में उदाहरण चर नहीं हो सकते हैं। इंटरफ़ेस में उदाहरण चर घोषित करने के किसी भी प्रयास के परिणामस्वरूप एक संकलक त्रुटि होगी।
Q # 3) जावा 8 में इंटरफेस में क्या सुधार हैं?
उत्तर: जावा 8 में इंटरफेस के लिए सबसे महत्वपूर्ण सुधार यह है कि इंटरफेस में स्थिर और डिफ़ॉल्ट तरीकों की अनुमति है। हमारे पास स्थिर या डिफ़ॉल्ट के रूप में घोषित तरीके हो सकते हैं और उन्हें इंटरफ़ेस के अंदर परिभाषित कर सकते हैं।
Q # 4) क्या हम जावा इंटरफेस में डिफ़ॉल्ट विधि को ओवरराइड कर सकते हैं?
उत्तर: नहीं। इंटरफ़ेस में डिफ़ॉल्ट विधि को ओवरराइड करना अनिवार्य नहीं है। ऐसा इसलिए है क्योंकि जब हम किसी वर्ग में एक इंटरफ़ेस लागू करते हैं, तो कक्षा का डिफ़ॉल्ट तरीका कार्यान्वयन वर्ग के लिए सुलभ होता है। इसलिए कार्यान्वयन वर्ग की वस्तु का उपयोग करके, हम इंटरफ़ेस की डिफ़ॉल्ट विधि का उपयोग कर सकते हैं।
Q # 5) क्या इंटरफ़ेस जावा में फ़ील्ड हो सकता है?
जीमेल के लिए सबसे अच्छा मुफ्त ईमेल ट्रैकर
उत्तर: हां, हमारे पास जावा में इंटरफ़ेस में फ़ील्ड या चर हो सकते हैं लेकिन डिफ़ॉल्ट रूप से, ये सभी फ़ील्ड स्थिर, अंतिम और सार्वजनिक हैं।
निष्कर्ष
इस ट्यूटोरियल में, हमने Java 8 में इंटरफेस में किए गए बदलावों पर चर्चा की है। Java 8 ने इंटरफेस में स्टेटिक और डिफॉल्ट तरीके पेश किए हैं। पहले हम इंटरफ़ेस में केवल अमूर्त तरीके रख सकते थे। लेकिन जावा 8 के बाद से, हम जावा में डिफ़ॉल्ट और स्थिर तरीकों को परिभाषित कर सकते हैं।
इसके अलावा, जावा 8 जावा में कार्यात्मक इंटरफेस के साथ लैम्ब्डा अभिव्यक्ति के उपयोग की अनुमति देता है। फिर हमने अमूर्त वर्गों और इंटरफेस पर भी चर्चा की और देखा कि जावा में उनमें से प्रत्येक का उपयोग कब करना है। हमने जावा में एनुम वंशानुक्रम भी देखा है।
हमने विस्तार और कार्यान्वयन, वर्ग और इंटरफ़ेस, अमूर्त वर्ग और इंटरफ़ेस, आदि के बीच कुछ अंतरों पर भी चर्चा की।
=> यहाँ सभी जावा ट्यूटोरियल की जाँच करें।
अनुशंसित पाठ
- उदाहरण के साथ जावा इंटरफेस और एब्सट्रैक्ट क्लास ट्यूटोरियल
- जावा में तुलनीय और तुलनात्मक इंटरफेस
- ListIterator Interface जावा में उदाहरणों के साथ
- जावा में इंटरफ़ेस सेट करें: उदाहरणों के साथ जावा सेट ट्यूटोरियल
- जावा में मार्कर इंटरफ़ेस: सीरियल योग्य और क्लोन करने योग्य
- जावा स्ट्रिंग लंबाई () उदाहरणों के साथ विधि
- जावा परिनियोजन: जावा जार फ़ाइल का निर्माण और निष्पादन
- कैसे करें Java toString तरीके का इस्तेमाल?