2009-09-29 11 views
5

मैं जावाजावा में, मुझे इंटरफ़ेस में एक अमूर्त विधि का उपयोग कब करना चाहिए?

public interface IFoo 
{ 
    public abstract void foo(); 
    public void bar(); 
} 

foo() और बार() में क्या अंतर है में निम्नलिखित इंटरफेस है? मुझे सार का उपयोग कब करना चाहिए?

दोनों जो कुछ मैं चाहता हूं उसे पूरा करने के लिए प्रतीत होता है जब तक कि मुझे कुछ सूक्ष्म नहीं लगे?

अद्यतनWhy would one declare a Java interface method as abstract?

+0

क्या यह वास्तव में संकलित करता है? –

+1

यह संकलित करता है; बस अमूर्त संशोधक अनावश्यक है। – Anoop

+3

इस प्रश्न की एक डुप्ली की तरह दिखता है - http://stackoverflow.com/questions/641536/why-would-one-declare-a-java-interface-method-as-abstract –

उत्तर

18

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

देखें [1]: http://java.sun.com/docs/books/tutorial/java/IandI/abstract.html

एक प्रत्यक्ष उद्धरण फार्म ऊपर:

नोट: एक अंतरफलक (इंटरफेस अनुभाग देखें) में सभी पद्धतियों का परोक्ष सार है, इसलिए सार संशोधक इंटरफेस विधियों के साथ प्रयोग नहीं किया जाता है (यह हो सकता है - यह सिर्फ जरूरी नहीं है)।

2

abstract के इस परिदृश्य में डुप्लिकेट (के रूप में के रूप में public इंटरफेस में तरीकों अंकन किया जाता है) अनावश्यक है।

इसके बजाय एक उप-वर्ग द्वारा ओवरराइडिंग को लागू करने के लिए एक सार वर्ग में एक विधि पर इसका उपयोग करें।

3

दोनों इसे पूरा करते हैं, क्योंकि इंटरफ़ेस में सभी विधियां सार हैं।

2

घोषणाओं के बीच कोई अंतर नहीं है। संकल्पनात्मक रूप से, एक इंटरफ़ेस में सभी विधियां सार हैं।

17

इंटरफ़ेस विधियां डिफ़ॉल्ट रूप से public और abstract दोनों हैं। foo() और bar() के बीच कोई अंतर नहीं है और आप सभी public और abstract कीवर्ड सुरक्षित रूप से हटा सकते हैं।

+4

मैं "डिफ़ॉल्ट रूप से" नहीं कहूंगा बल्कि "निस्संदेह"। "डिफ़ॉल्ट रूप से" का अर्थ "सार्वजनिक सार" के अलावा अन्य विकल्पों के रूप में किया जा सकता है। –

5

तुम कुछ भी याद आ रही नहीं कर रहे हैं। Java Language Specification से:

शरीर एक अंतरफलक के में हर विधि घोषणा परोक्ष सार है, इसलिए अपने शरीर हमेशा अर्धविराम, नहीं एक ब्लॉक का प्रतिनिधित्व करती है।

एक इंटरफ़ेस के शरीर में प्रत्येक विधि की घोषणा पूरी तरह से सार्वजनिक है।

दूसरे शब्दों में, आप public के साथ-साथ इंटरफेस तरीकों पर abstract छोड़ सकते हैं।

4

यह (वहाँ दो घोषणाओं के बीच कोई अंतर नहीं है) और स्पष्ट रूप से जावा भाषा विशिष्टता की section 9.4 में हतोत्साहित किया बेमानी है:

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

और public इसी तरह अनावश्यक और हतोत्साहित है:

यह अनुमति दी है, लेकिन दृढ़ता से शैली के एक मामले के रूप में हतोत्साहित, प्रचुरता से इंटरफ़ेस तरीकों के लिए सार्वजनिक संशोधक निर्दिष्ट करने के लिए।

पता नहीं क्यों publicदृढ़ता से हतोत्साहित लेकिन abstract सिर्फ हतोत्साहित किया जाता है है ...

+1

बस अटकलें ... लेकिन अमूर्त कीवर्ड के लिए - यह अनावश्यक और स्पष्ट है - वहां कोई कार्यान्वयन नहीं है। यह पहचानना आसान है कि क्या आप इंटरफेस की सामान्य अवधारणा को जानते हैं। यदि सार्वजनिक संशोधक निर्दिष्ट किया गया था तो यह किसी ऐसे व्यक्ति का नेतृत्व कर सकता है जो जनता को नहीं जानता है वह डिफ़ॉल्ट (और केवल) विकल्प है, यह सोचने के लिए कि वे किसी अन्य चीज़ के लिए एक्सेस संशोधक को बदल सकते हैं। – Nate

0

दोनों foo() और बार() सार हैं के रूप में वे एक अंतरफलक के अंदर घोषित कर रहे हैं। आपके द्वारा यहां उपयोग किए जाने वाले अमूर्त शब्द का कोई महत्व नहीं है - आप इसे बेहतर ढंग से हटा दें।

0

जावा में इंटरफेस पूरी तरह से सार तत्वों के लिए "किसी भी तरह" के बराबर हैं, इसलिए इंटरफ़ेस में विधि घोषणा में "अमूर्त" कीवर्ड जोड़ने से विधि के साथ कुछ लेना देना नहीं है!

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