Der Java-Compiler beschwert sich nicht, wenn ich eine protected
-Methode mit einer public
-Methode überschreiben. Was passiert hier wirklich? Wird die übergeordnete Methode überschrieben oder ausgeblendet, da die übergeordnete Methode weniger sichtbar ist?Warum kann ich eine geschützte Methode mit der öffentlichen Methode überschreiben?
Antwort
Eine Unterklasse kann den Zugriffsmodifizierer immer erweitern, da sie immer noch eine gültige Ersetzung für die Superklasse darstellt. Aus der Java-Spezifikation über Requirements in Overriding and Hiding:
Der Zugriffsmodifizierer (§6.6) eines überwiegenden oder Verfahren verstecken muss mindestens so viel Zugang als überschriebene oder versteckte Methode bieten, wie folgt:
- Wenn Wenn die überschriebene oder ausgeblendete Methode öffentlich ist, muss die Methode zum Überschreiben oder Ausblenden öffentlich sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
- Wenn die überschriebene oder ausgeblendete Methode geschützt ist, muss die überschreibende oder ausgeblendete Methode geschützt oder öffentlich sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
- Wenn die überschriebene oder ausgeblendete Methode über den Standardzugriff (Paket) verfügt, darf die Methode zum Überschreiben oder Ausblenden nicht privat sein. Andernfalls tritt ein Fehler bei der Kompilierung auf.
Aus der Sicht einer externen Klasse, ist die öffentliche Methode nur eine neue Methode, nicht ein überwiegendes Verfahren, da die externe Klasse ohnehin nicht die geschützte Methode zugreifen konnte.
Auf der anderen Seite ist eine Verringerung der Sichtbarkeit nicht zulässig, da die externe Klasse immer eine Referenz vom Typ einer Superklasse verwenden kann, um auf ein Objekt der Unterklasse zu verweisen und die gleiche Methode aufzurufen.
Die Sichtbarkeit betrifft nur die externe Zugänglichkeit. Als eine public
Methode kann jede externe Klasse es aufrufen.
Die Zugriffsebene der überschreibenden Methode hat keinen Einfluss auf die Sichtbarkeit der ursprünglichen Methode. Nach dem Überschreiben mit Zugriffsebenen kann auf die ursprüngliche Methode nur zugegriffen werden, indem in der Unterklasse super
aufgerufen wird.
- 1. Geschützte Methode nicht vererbt
- 2. Geschützte Methode in der Schnittstelle
- 3. Wie kann ich eine geschützte Methode in C++ testen?
- 4. Wie kann ich eine Moq-geschützte Methode bestätigen/bestätigen?
- 5. kann nicht überschreiben Methode
- 6. Eine Java-Methode überschreiben
- 7. überschreiben Geschützte Methoden
- 8. Wie kann ich eine Methode mit einem abhängigen Rückgabetyp überschreiben?
- 9. Wie wird mit der Pfeilnotation (->) eine geschützte Methode erstellt?
- 10. Eine statische Methode überschreiben
- 11. Wo kann ich die Methode jwt_response_payload_handler überschreiben?
- 12. eine geschützte virtuelle Methode in C++
- 13. IllegalAccessError: Zugriff auf eine geschützte Methode
- 14. Sollte ich privat/geschützte Methode unittest
- 15. Kann ich nur eine Methode in Erben überschreiben?
- 16. Warum kann ich nicht mit Methode hinzufügen `
- 17. Django - Überschreiben der Model.create() -Methode?
- 18. Enthält der Objekttyp eine geschützte virtuelle Finalize-Methode?
- 19. Warum Clone-Methode in Java überschreiben
- 20. NSURL versteckte Methode queryParameters kann Kategorie überschreiben
- 21. Die richtige Methode zum Überschreiben der __dir__ Methode in Python
- 22. Registrierung überschreiben Methode erstellen
- 23. Warum kann ich nicht auf die geschützte Java-Methode zugreifen, obwohl ich die Klasse erweitert habe?
- 24. UILabels setText-Methode überschreiben?
- 25. Endgültige Methode überschreiben
- 26. Java-Methode überschreiben/Schnittstellenproblem
- 27. Die OpenExeConfiguration-Methode überschreiben
- 28. Warum kann ich eine Methode von einer Erweiterung von UIViewController in einem anderen UIViewController nicht überschreiben?
- 29. Methode überschreiben in Angular2
- 30. Probleme überschreiben eine Methode in der Galerieansicht in Android