it-swarm.com.de

Warum kann ich eine geschützte Methode mit einer öffentlichen Methode überschreiben?

Der Java-Compiler beschwert sich nicht, wenn ich eine protected-Methode mit einer public-Methode überschreibe. Was ist hier wirklich los? Überschreibt oder verbirgt es die übergeordnete Methode, da die übergeordnete Methode eine geringere Sichtbarkeit aufweist?

18
Monstieur

Eine Unterklasse kann den Zugriffsmodifizierer immer erweitern, da er immer noch eine gültige Ersetzung für die Oberklasse ist. Aus der Java-Spezifikation zu Anforderungen beim Überschreiben und Ausblenden :

Der Zugriffsmodifizierer (§6.6) einer überschreibenden oder versteckenden Methode muss mindestens so viel Zugriff bieten wie die überschriebene oder ausgeblendete Methode:

  • Wenn die überschriebene oder ausgeblendete Methode öffentlich ist, muss die überschreibende oder versteckende Methode öffentlich sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
  • Wenn die überschriebene oder ausgeblendete Methode geschützt ist, muss die überschreibende oder versteckende Methode geschützt oder öffentlich sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
  • Wenn die überschriebene oder ausgeblendete Methode über einen Standardzugriff (Paket) verfügt, darf die überschreibende oder ausgeblendete Methode nicht privat sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
30
Harmlezz

Aus Sicht einer externen Klasse ist die öffentliche Methode nur eine neue Methode, keine überschreibende Methode, da die externe Klasse ohnehin nicht auf die geschützte Methode zugreifen kann.

Andererseits darf die Sichtbarkeit nicht verringert werden, da die externe Klasse immer eine Referenz vom Typ einer Oberklasse verwenden kann, um auf ein Objekt der Unterklasse zu verweisen und dieselbe Methode aufzurufen.

2
Rohan

Die Sichtbarkeit beeinflusst nur den externen Zugriff. Eine public-Methode kann von jeder externen Klasse aufgerufen werden.

Die Zugriffsebene der überschreibenden Methode hat keinen Einfluss auf die Sichtbarkeit der ursprünglichen Methode. Nach dem Überschreiben kann auf die ursprüngliche Methode mit beliebigen Zugriffsebenen nur durch Aufruf von super in der Unterklasse zugegriffen werden.

0
Mikael Lindlöf