2015-09-02 20 views
7

Quando si annullano i metodi non è possibile ridurre la visibilità del metodo ereditato. Secondo la tabella che segue, protected è più accessibile rispetto no modifier:Metodo di sovrascrittura che non ha modificatore di accesso con modificatore di accesso protetto

 
      | 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 

Ma quando cerco di ignorare f() (vedi SubClass) tanto sono l'errore:

non può ridurre la visibilità del metodo ereditato da MyInterface.

Il metodo in MyInterface non ha modificatore di accesso e quello in SubClass è protetto, quindi più accessibile. Cosa mi manca qui?

public interface MyInterface { 
    void f(); 
} 

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

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

Non * sovrascrive * i metodi di interfaccia. Voi * li implementate. –

+0

@TJCrowder - [jls jargon] (http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1) - un metodo di istanza mC dichiarato in classe C, * sovrascrive * un altro metodo mI dichiarato in una superinterfaccia, iff ... – ZhongYu

+0

@ bayou.io: Interessante, non l'ho mai sentito dire in questo modo. –

risposta

13

metodi nelle interfacce implicitly hanno il modificatore di accesso di public. Quindi, quando lo si implementa con protected, si tratta di un modificatore di accesso più debole.

+0

@ T.J.Crowder Questo è un po 'un pignolo dal momento che usi ancora '@ Override' quando li implementi. – ajb

+0

@ T.J.Crowder corretto. – Amila

+0

@Amila È solo per le interfacce o ci sono altri casi in cui nessun modificatore = pubblico? – Stanko

3

metodi nelle interfacce sono implicitamente contrassegnati public e non default

0

Su una scala da studente in Java, è una buona domanda. Ma devi ricordare che, ci sono modificatori di accesso predefiniti e impliciti, come l'interfaccia in questo caso che è implicitamente publicper impostazione predefinita.

public interface MyInterface { 
    void f(); 
} 

e

public interface MyInterface { 
    public void f(); 
} 

entrambi sono nello stesso modo implicito. Le interfacce sono progettate in modo tale che il loro comportamento sia esposto pubblicamente.

0

Nell'interfaccia java, tutti i metodi sono pubblici. tutte le variabili sono public static final. (Costanti)

0

I metodi di interfaccia sono nati con pubblico

Dare

protected void f(); 

O

private void f(); 

In MyInterface e vedere cosa si ottenere.

1

Da 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.

I metodi di un'interfaccia sono per default public. Pertanto non è possibile sovrascrivere/nascondere questo metodo utilizzando qualsiasi modificatore diverso da public.