2015-09-02 34 views
7

Po nadpisaniu metod nie można zmniejszyć widoczności odziedziczonej metody. Zgodnie z poniższą tabelą, protected jest bardziej dostępna niż no modifier:Zastępowanie metody, która nie ma modyfikatora dostępu z chronionym modyfikatorem dostępu

 
      | 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 

Ale gdy próbuję zastąpić f() (patrz podklasy), a następnie pojawia się błąd:

nie może zmniejszyć widoczność odziedziczonej metody z MyInterface.

Metoda w MyInterface nie ma modyfikatora dostępu, a ten w SubClass jest chroniony, więc jest bardziej dostępny. Czego tu mi brakuje?

public interface MyInterface { 
    void f(); 
} 

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

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

Nie można * przesłonić * metod interfejsu. Wprowadzasz * je. –

+0

@TJCrowder - [jls jargon] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1) - metoda instancji mC zadeklarowana w klasie C, * nadpisuje * inną metodę mI zadeklarowaną w superinterfejsie, iff ... – ZhongYu

+0

@ bayou.io: Interesujące, nigdy nie słyszałem, żeby tak było. –

Odpowiedz

13

Metody interfejsów implicitly mają modyfikator dostępu public. Więc kiedy zaimplementujesz go z protected, jest to słabszy modyfikator dostępu.

+0

@ T.J.Crowder To odrobina sztyletu, ponieważ wciąż używasz '@ Override' kiedy je implementujesz. – ajb

+0

@ T.J.Crowder Naprawiono. – Amila

+0

@Amila Czy jest to tylko dla interfejsów, czy istnieją inne przypadki, w których brak modyfikatora = publiczny? – Stanko

3

Metody interfejsów są domyślnie zaznaczone public a nie default

0

w skali uczący w java, jest to dobre pytanie. Trzeba jednak pamiętać, że istnieją domyślne i niejawne modyfikatory dostępu, takie jak interfejs, który domyślnie jest domyślnie publicdomyślnie.

public interface MyInterface { 
    void f(); 
} 

i

public interface MyInterface { 
    public void f(); 
} 

są takie same zarówno w sposób dorozumiany. Interfejsy są zaprojektowane w taki sposób, że ich zachowanie jest ujawnione publicznie.

0

W interfejsie java, wszystkie metody są publiczne. wszystkie zmienne są publiczne statyczne końcowe. (Stałe)

0

metody interfejsu rodzą się z publicznej

Daj

protected void f(); 

Albo

private void f(); 

W MyInterface i zobaczyć, co otrzymać.

1

Od Java 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.

metody w interfejsie są domyślnie public. Nie można więc przesłonić/ukryć tej metody za pomocą jakiegokolwiek modyfikatora innego niż public.