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() { }
}
Nie można * przesłonić * metod interfejsu. Wprowadzasz * je. –
@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
@ bayou.io: Interesujące, nigdy nie słyszałem, żeby tak było. –