2011-09-23 12 views
6

Powiel możliwe:
Why doesn't Java allow overriding of static methods?Czy istnieją uzasadnione powody, aby ukrywać metody statyczne?

Czy istnieje uzasadniony powód, by chcieć klasy pochodnej do ręcznym ukryć static metodę klasy bazowej?

+5

Nie można ich zmienić. Mogą być ukryte. – BalusC

+0

Zobacz ten wątek - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost

+0

@BalusC Semantyka ... Niezależnie, nie sądzę, aby ktokolwiek rzeczywiście odpowiedział na pytanie. – NullUserException

Odpowiedz

6

Terminologia na bok, metody statyczne w Javie mają pewien rodzaj nadrzędnej relacji, co sugeruje sekcja 13.4.12 dotycząca kompatybilności binarnej. Jeśli T rozszerza S, S deklaruje m(), T.m() może odnosić się do metody w T lub S, w zależności od tego, czy m() jest zadeklarowane w T; i można dodawać lub usuwać m() z T, bez łamania jakiegokolwiek kodu wywołującego T.m(). (To implikuje, że instrukcja invokestatic JVM dokonuje pewnego rodzaju dynamicznej analizy łańcucha super klasy). Naprawdę niebezpiecznie jest, gdy znaczenie T.m() po cichu się zmienia, ponieważ teraz wskazuje na inną metodę. (Metody instancji dziedziczą umowy, więc nie stanowi to problemu, nie ma takiego zrozumienia w metodach statycznych.)

Takiej "cechy" nigdy nie należy używać; język nie powinien był umożliwiać jej rozpoczęcia.

Dobra praktyka: jeśli nazwiemy T.m(), m() musi być zadeklarowane w T; i nigdy nie powinno się go usuwać z T bez uprzedniego usunięcia wszystkich T.m().

+0

W pełni zgadzam się, że nigdy nie powinny być używane. Jednak jest * możliwe *. Czy możesz wymyślić jakieś uzasadnione przykłady z prawdziwego świata? W mojej karierze Java nigdy ich nie spotkałem. – BalusC

+0

Ja też nigdy ich nie spotkałem, więc to rzadko ludzie "nadpisują" statyczne metody. Myślę, że najpierw nauczyłem się tego podczas badania innego trudnego pytania http://stackoverflow.com/questions/6643648 – irreputable

+0

+1 dla wyjaśnienia. Ale właśnie to chciałbym wiedzieć, dlaczego jest to w ogóle możliwe, jeśli nie wydaje się to logiczne (przynajmniej dla większości z nas). – Saket

4

metody statyczne nie mogą być nadpisane

Aby zmieniać sposób, metoda musi być najpierw dziedziczona. Jeśli metoda nie jest dziedziczona, nie ma szans na przesłonięcie. Dlatego nigdy nie można przesłonić metody prywatnej, ponieważ nie są one dziedziczone.

Powiązane problemy