2012-02-08 9 views
11

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

public abstract class A { 

    protected abstract void method1(); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1() { 
     System.out.println("This is B's implementaiton of A's method"); 
    } 
} 

और अब जब मैं उनकी जांच:

B b = new B(); 
b.method1(); 
b.method2(); 

मैं उम्मीद आउटपुट प्राप्त:

This is B's implementaiton of A's method 
This is Class A's method 

प्रश्न:

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

    उत्पादन जबकि वहाँ कभी नहीं होगा

+2

कभी-कभी पूछने या जवाब देने के बजाय Google के लिए तेज़ है: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino

+5

Google हमारे स्कूल में अवरुद्ध है – 911TurboS

+6

आपका इंटरनेट बिना कैसे मौजूद है गूगल? – jondavidjohn

उत्तर

13

@Override

@Override जावा 5 में पेश किया गया था (और जावा 6 में एक छोटा सा बढ़ाया गया)। यह केवल जानकारीपूर्ण है। यह कहता है "मुझे लगता है कि पैरेंट क्लास या इंटरफ़ेस में पहले से मौजूद कुछ ओवरराइड करना है।

आईडीई की तरह ग्रहण आपको ऐसी चेतावनी विधि (उदाहरण के लिए यदि आप नाम गलत तरीके से गलत करते हैं) में चेतावनी दे सकते हैं। उस स्थिति में विधि (गलत वर्तनी की वजह से) लागू नहीं किया जाएगा।

लेकिन इसके बारे में बहुत ज्यादा चिंता नहीं है।

इंटरफ़ेस बनाम सार वर्ग

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

अवहेलना दो तरीकों

हां। जावा में आप सभी विधियों को ओवरराइड कर सकते हैं न कि मूल वर्ग में अंतिम रूप में घोषित स्पष्टीकरण। यह ठीक है। यदि आप इसे अपरिवर्तनीय बनाना चाहते हैं तो आप इसे अंतिम घोषित कर सकते हैं। उदाहरण, अगर आप एक आदेश आप कर सकते थे घोषित करने के लिए करना चाहते हैं:

public abstract class Ordering<X> 
{ 
abstract boolean isLower(X a, X b); 
abstract boolean isEquals(X a, X b); 
    final boolean isGreater(X a, X b) { 
     return !isLower(a, b) && !isEquals(a, b); 
    } 
} 
बेशक

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

+1

आश्चर्यजनक रूप से विचार करने के लिए समय लेने के लिए धन्यवाद – 911TurboS

+2

बहुत बहुत धन्यवाद! वैसे भी आप उदाहरणों को देखकर सार/इंटरफेस और अधिक के लिए उपयोग करेंगे। वसंत ढांचा एक अच्छा उदाहरण है। और वास्तव में, यदि आप डिज़ाइन पैटर्न के बारे में जानते हैं: अमूर्त वर्ग टेम्पलेट विधि के बहुत करीब हैं जबकि इंटरफेस (कई अन्य चीजों के बीच) रणनीति पैटर्न से संबंधित हैं। टेम्पलेट विरासत से विस्तार कर रहा है जबकि रणनीति रचना द्वारा विस्तारित है। दोबारा: अपने सभी टेम्पलेट्स और घटकों के साथ स्प्रिंग फ्रेमवर्क एक बहुत अच्छा उदाहरण है। आप समय के साथ पता चल जाएगा। – helios

4

सार कक्षाएं, आप आधार स्तर कार्यान्वयन (विरासत) रखने की अनुमति एक सार कक्षा के एक उदाहरण के लिए, आप उत्तराधिकारियों के बीच साझा कार्यक्षमता स्टोर कर सकते हैं ...

मैं हमेशा इंटरफेस है कि कुछ तरीकों में से आधार स्तर कार्यान्वयन की अनुमति देने के रूप में उनमें से सोचा है ...

+1

अमूर्त कक्षाओं के लिए +1 "कुछ तरीकों के आधार स्तर के कार्यान्वयन के साथ इंटरफेस" के रूप में – helios

+1

आपका उत्तर मुझे अंतर को स्पष्ट रूप से समझने के लिए किया गया था। – 911TurboS

17
  1. @Override कोई कीवर्ड नहीं है, यह एक वैकल्पिक एनोटेशन है जो संकलक जांचता है कि आप वास्तव में एक विधि को ओवरराइड कर रहे हैं। यदि आप @Override कहते हैं लेकिन ओवरराइड करने की कोई विधि नहीं है, तो संकलक आपको बताएगा कि आपने शायद एक टाइपो बनाया है। प्रभाव देखने के लिए method1 से method12 का नाम बदलें।
  2. इंटरफेस में कोई कार्यान्वयन नहीं हो सकता है, जबकि अमूर्त वर्ग वैकल्पिक रूप से इसके कुछ तरीकों के लिए कार्यान्वयन प्रदान कर सकता है। इसके अलावा, इंटरफेस में डेटा सदस्य नहीं हो सकते हैं।
  3. सार के रूप में एक विधि को परिभाषित करने का अर्थ है कि व्युत्पन्न वर्ग कार्यान्वयन प्रदान करना चाहिए। यह अमूर्त घोषित नहीं करता है कि व्युत्पन्न कक्षाएं केवल अपना स्वयं का कार्यान्वयन प्रदान कर सकती हैं, लेकिन उन्हें इसकी आवश्यकता नहीं है।
+0

आपके उत्तर के लिए धन्यवाद – 911TurboS

+0

@ 911 टर्बोएस आपको उत्तर के रूप में उत्तर देना चाहिए यदि यह सही है (तीर-डाउन प्रतीक के नीचे वाला बटन)। – Rohan

+0

हाँ, लेकिन यह मुझे अनुमति नहीं दे रहा है, यह कहता है कि प्रतीक्षा करें 2 मिनट – 911TurboS

0

वास्तविक उपयोग तस्वीर में आता है जब आपके पास एकाधिक कक्षाएं लागू होती हैं और method2 विधि 2 से लागू की जा रही है। इस मामले में, विधि 2 निष्पादित करने के बाद, संबंधित कक्षा में method1 निष्पादित किया जाएगा।

public abstract class A { 

    protected abstract void method1(int val); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
     //Let us I calculated something here, may be sum of two ints 
     method1(//pass above calculated int); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1(int val) { 
     System.out.println("This is B's implementaiton of A's method"); 
     //Here you may do this class specific manipulation on val. 
    } 
} 

कक्षा सी में आप सामान्य गणना में कुछ कुशलतापूर्वक उपयोग कर सकते हैं।

2

अमूर्त वर्गों और इंटरफेस के बीच मुख्य अंतर यह है कि अंतरफलक केवल एक इंटरफ़ेस को परिभाषित करते हैं और सार कक्षाओं में कार्यान्वयन और फ़ील्ड/गुण भी हो सकते हैं।

एक सार वर्ग को आईएस-ए संबंध के रूप में देखा जा सकता है (उदाहरण के लिए घोड़ा एक जानवर है)। इंटरफ़ेस के लिए यह अधिकतर एक वर्ग है जिसमें एक वर्ग हो सकता है (उदा। अविश्वसनीय, ISortable)।

इसके अलावा सार तरीकों को तत्काल नहीं किया जा सकता है (न तो इंटरफेस के लिए)।

ओवरराइडिंग फ़ंक्शंस यह दिखाने के लिए हैं कि फ़ंक्शन में बेस क्लास कार्यान्वयन है।

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

+0

धन्यवाद यह बहुत उपयोगी था। – 911TurboS

1

@ ओवरराइड कीवर्ड का उद्देश्य क्या है, क्योंकि अगर मैं इसे छोड़ देता हूं, तो यह अभी भी वही काम करता है।

योग्यता।

यदि मैं सार विधि को लागू नहीं करता हूं, तो मुझे संकलन त्रुटि मिलती है। तो इंटरफ़ेस को लागू करने के लिए अंतर क्या है?

इंटरफेस आपको कोड शामिल करने की अनुमति नहीं देता है।

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

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

+0

पूरी तरह से बिंदु के जवाब में मैंने जो पूछा था :) – 911TurboS

+1

इंटरफेस आपको 'कोड' शामिल करने की अनुमति देता है, वे इस बात की घोषणा कर रहे हैं कि क्लाइंट इंटरफ़ेस को कार्यान्वित करने वाले ऑब्जेक्ट्स के साथ कैसे इंटरैक्ट कर सकता है। उन्हें संदर्भ प्रकार के रूप में उपयोग किया जा सकता है, जो इंटर्न किसी भी अमूर्त या ठोस कार्यान्वयन से ग्राहक को encapsultaing द्वारा polymorphism को बढ़ावा देता है। इंटरफेस में वैरिएबल घोषित किए जा सकते हैं हालांकि डिफ़ॉल्ट रूप से (और परिभाषा) स्थिर हो जाएगा क्योंकि इंटरफ़ेस का कोई उदाहरण कभी नहीं होगा। आप कंक्रीट कार्यान्वयन को लागू करने के लिए अमूर्त विधियों का उपयोग करते हैं जो अज्ञात हैं या बाल कार्यान्वयन –

+0

के बीच बदल सकते हैं आप सही हैं। मैं बस फिर से शुरू करने की कोशिश कर रहा था;) – m0skit0

1

What is the purpose of @Override keyword

बाद में यह जावा इसके अलावा, जो कमजोर आत्म नियंत्रण के लिए है। यह एनोटेशन है, यानी लाइब्रेरी क्लास, कीवर्ड नहीं।

So what is the difference to implementing an interface?

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

Then what is the purpose of explicitly Defining a method abstract in Class A?

आप इसे अमूर्त घोषित करना चाहिए, तभी आप उसे कोई शरीर है। JVM के लिए यह जानना आवश्यक है कि सभी वंशजों के पास यह होगा।

+0

आपके उत्तर के लिए धन्यवाद – 911TurboS

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