2015-09-02 5 views
7

जब आप विधियों को ओवरराइड करते हैं तो आपको विरासत विधि की दृश्यता को कम करने की अनुमति नहीं है। निम्न तालिका के अनुसार, protectedno modifier की तुलना में अधिक पहुँचा जा सकता है:संरक्षित एक्सेस संशोधक के साथ कोई एक्सेस संशोधक नहीं है

 
      | Class | Package | Subclass | World 
————————————+———————+—————————+——————————+——————— 
public  | y | y | y  | y 
————————————+———————+—————————+——————————+——————— 
protected | y | y | y  | n 
————————————+———————+—————————+——————————+——————— 
no modifier | y | y | n  | n 
————————————+———————+—————————+——————————+——————— 
private  | y | n | n  | n 

y: accessible 
n: not accessible 

लेकिन जब मैं f() ओवरराइड करने के लिए (उपवर्ग देखें) की कोशिश तो मैं त्रुटि मिलती है:

विरासत में मिला विधि की दृश्यता को कम नहीं किया जा सकता MyInterface से।

माइइंटरफेस में विधि में कोई एक्सेस संशोधक नहीं है और सबक्लास में से एक संरक्षित है, इसलिए अधिक सुलभ है। मुझे यहां क्या समझ नहीं आ रहा है? इंटरफेस implicitly में

public interface MyInterface { 
    void f(); 
} 

public abstract class MyClass { 
    protected abstract void f(); 
} 

public class SubClass extends MyClass implements MyInterface{ 
    protected void f() { } 
} 
+5

आप * इंटरफ़ेस विधियों को ओवरराइड नहीं करते हैं। आप * उन्हें लागू *। –

+0

@TJCrowder - [jls jargon] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1) - कक्षा में घोषित एक उदाहरण विधि एमसी सी, * overrides * एक superinterface, iff में घोषित एक और विधि एमआई ... – ZhongYu

+0

@ bayou.io: दिलचस्प, मैंने इसे कभी नहीं सुना है। –

उत्तर

13

तरीके public की पहुँच संशोधक है। तो जब आप इसे protected के साथ कार्यान्वित करते हैं, तो यह एक कमजोर पहुंच संशोधक है।

इंटरफेस में
+0

@ टीजे।क्रॉउडर यह एक नाइटपिक है क्योंकि आप अभी भी उन्हें लागू करते समय '@ ओवरराइड' का उपयोग करते हैं। – ajb

+0

@ टीजेड्रोडर फिक्स्ड। – Amila

+0

@ एमिला यह केवल इंटरफेस के लिए है या क्या कोई अन्य मामला है जहां कोई संशोधक = सार्वजनिक नहीं है? – Stanko

3

तरीके परोक्ष चिह्नित कर रहे हैं public और नहीं default

0

जावा में एक नौसिखिया पैमाने पर, यह एक अच्छा सवाल है। लेकिन आपको यह याद रखना होगा कि डिफ़ॉल्ट और निहित पहुंच संशोधक हैं, जैसे कि इस मामले में इंटरफ़ेस जो publicडिफ़ॉल्ट रूप से है।

public interface MyInterface { 
    void f(); 
} 

और

public interface MyInterface { 
    public void f(); 
} 

दोनों परोक्ष ही हैं। इंटरफेस इस तरह से डिजाइन किए गए हैं कि उनके व्यवहार को सार्वजनिक रूप से उजागर किया गया है।

0

जावा इंटरफ़ेस में, सभी विधियां सार्वजनिक हैं। सभी चर सार्वजनिक स्थिर अंतिम। (स्थिरांक) कर रहे हैं

0

इंटरफ़ेस तरीकों सार्वजनिक

साथ पैदा होते हैं दो

protected void f(); 

या

private void f(); 

MyInterface में और आप जो देखते हैं प्राप्त।

1

जावा doc से:

The access modifier (§6.6) of an overriding or hiding method must provide at least as much access as the overridden or hidden method, as follows:

  1. If the overridden or hidden method is public, then the overriding or hiding method must be public; otherwise, a compile-time error occurs.
  2. If the overridden or hidden method is protected, then the overriding or hiding method must be protected or public; otherwise, a compile-time error occurs.
  3. If the overridden or hidden method has default (package) access, then the overriding or hiding method must not be private; otherwise, a compile-time error occurs.

एक अंतरफलक में तरीकों डिफ़ॉल्ट public से कर रहे हैं। तो आप public के अलावा किसी भी संशोधक का उपयोग करके इस विधि को ओवरराइड/छुपा नहीं सकते हैं।

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