Czytałem Podręcznik programisty po certyfikacji Java ™ SCJP autorstwa Khalida Mughala.
W rozdziale Dziedziczenie wyjaśnia to
Dziedziczenie członków jest ściśle związane z ich deklarowaną dostępnością. Jeśli element członkowski nadklasy jest dostępny poprzez swoją prostą nazwę w podklasie (bez użycia dodatkowej składni, takiej jak super), ten element członkowski jest uznawany za dziedziczony
Wspomina również, że metody statyczne nie są dziedziczone. Ale poniższy kod jest w porządku:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
// This works - accessing display() by its simple name -
// meaning it is inherited according to the book.
display();
}
}
Jak mogę używać bezpośrednio display()
w klasie B
? Co więcej, B.display()
też działa.
Czy wyjaśnienie w książce dotyczy tylko metod instancji?
java
inheritance
static
Algorytmista
źródło
źródło
Odpowiedzi:
Wszystkie dostępne metody są dziedziczone przez podklasy.
Z samouczków Sun Java :
Jedyną różnicą w przypadku dziedziczonych metod statycznych (klasowych) i dziedziczonych metod statycznych (instancji) jest to, że podczas pisania nowej metody statycznej z tym samym podpisem stara metoda statyczna jest po prostu ukrywana, a nie zastępowana.
Ze strony na temat różnicy między nadpisywaniem a ukrywaniem.
źródło
Jeśli tak naprawdę mówi książka, to źle. [1]
Java Language Specification # 8.4.8 stanowi:
[1] Nie jest powiedziane, że w moim egzemplarzu, wydanie 1, 2000.
źródło
Możesz zauważyć różnicę w następującym kodzie, który jest nieznaczną modyfikacją w stosunku do twojego kodu.
Wynika to z faktu, że metody statyczne są metodami klasowymi.
A.display () i B.display () wywołają metody swoich klas.
źródło
B.display () działa, ponieważ deklaracja statyczna sprawia, że metoda / element członkowski należy do klasy, a nie do żadnej konkretnej instancji klasy (aka Object). Więcej na ten temat przeczytasz tutaj .
Inną rzeczą, na którą należy zwrócić uwagę, jest to, że nie można przesłonić metody statycznej, można zadeklarować metodę statyczną z taką samą sygnaturą w swojej podklasie, ale jej zachowanie może być inne niż oczekiwane. Prawdopodobnie jest to powód, dla którego nie uważa się go za dziedziczony. Możesz sprawdzić problematyczny scenariusz i wyjaśnienie tutaj .
źródło
Metody statyczne w Javie są dziedziczone, ale nie można ich przesłonić. Jeśli deklarujesz tę samą metodę w podklasie, ukrywasz metodę nadklasy zamiast ją przesłonić. Metody statyczne nie są polimorficzne. W czasie kompilacji metoda statyczna zostanie połączona statycznie.
Przykład:
Otrzymasz:
źródło
Metody statyczne są dziedziczone w Javie, ale nie biorą udziału w polimorfizmie. Jeśli spróbujemy przesłonić metody statyczne, po prostu ukryją one statyczne metody nadklasy zamiast je przesłonić.
źródło
Ta koncepcja nie jest taka prosta, jak się wydaje. Możemy uzyskać dostęp do statycznych elementów członkowskich bez dziedziczenia, co jest relacją HasA. Możemy uzyskać dostęp do statycznych elementów członkowskich, rozszerzając również klasę nadrzędną. Nie oznacza to, że jest to relacja ISA (dziedziczenie). W rzeczywistości statyczne elementy członkowskie należą do klasy, a static nie jest modyfikatorem dostępu. Dopóki modyfikatory dostępu pozwalają na dostęp do statycznych elementów członkowskich, możemy ich używać w innych klasach. Na przykład jeśli jest publiczny, będzie dostępny w tym samym pakiecie, a także poza pakietem. Prywatnie nie możemy go nigdzie używać. Domyślnie możemy go używać tylko w pakiecie. Ale dla chronionych musimy przedłużyć superklasę. Zatem przeniesienie metody statycznej do innej klasy nie zależy od bycia statycznym. To zależy od modyfikatorów dostępu. Tak więc moim zdaniem Statyczne elementy członkowskie mogą uzyskać dostęp, jeśli pozwalają na to modyfikatory dostępu. W przeciwnym razie możemy ich używać tak, jak używamy w relacji Hasa. A związek nie jest dziedzictwem. Ponownie nie możemy przesłonić metody statycznej. Jeśli możemy użyć innej metody, ale nie możemy jej zastąpić, to jest to relacja HasA. Jeśli nie możemy ich zastąpić, nie będzie to dziedziczenie, więc autor miał 100% racji.
źródło
Metoda statyczna jest dziedziczona w podklasie, ale nie jest to polimorfizm. Podczas pisania implementacji metody statycznej metoda klasy nadrzędnej jest ukryta, a nie nadpisana. Pomyśl, jeśli nie jest dziedziczony, jak możesz uzyskać dostęp bez
classname.staticMethodname();
?źródło
Wszyscy publiczni i chronieni członkowie mogą być dziedziczeni z dowolnej klasy, podczas gdy domyślni lub członkowie pakietu mogą być również dziedziczeni z klasy w tym samym pakiecie, co klasa nadrzędna. Nie zależy od tego, czy jest to element statyczny, czy niestatyczny.
Ale prawdą jest również, że statyczne funkcje składowe nie biorą udziału w dynamicznym wiązaniu. Jeśli sygnatura tej metody statycznej jest taka sama zarówno w klasie nadrzędnej, jak i podrzędnej, wówczas obowiązuje koncepcja cieniowania, a nie polimorfizmu.
źródło
Możesz przesłonić metody statyczne, ale jeśli spróbujesz użyć polimorfizmu, będą one działać zgodnie z zakresem klasy (w przeciwieństwie do tego, czego zwykle oczekujemy).
W pierwszym przypadku o / p jest "w statycznej metodzie B" # pomyślne zastąpienie W drugim przypadku o / p jest "w statycznej metodzie A" # Metoda statyczna - nie będzie uwzględniać polimorfizmu
źródło
Możemy zadeklarować metody statyczne z tą samą sygnaturą w podklasie, ale nie jest to uważane za nadpisanie, ponieważ nie będzie żadnego polimorfizmu w czasie wykonywania, ponieważ wszystkie statyczne elementy członkowskie klasy są ładowane w momencie ładowania klasy, więc decyduje o kompilacji czas (nadpisywanie w czasie wykonywania) Dlatego odpowiedź brzmi „nie”.
źródło
Wielu wyraziło swoją odpowiedź słowami. To jest rozszerzone wyjaśnienie w kodach:
Wyniki:
Dlatego taki wniosek:
null
instancji. Domyślam się, że kompilator użyje typu zmiennej do znalezienia klasy podczas kompilacji i przetłumaczy to na odpowiednie wywołanie metody statycznej.źródło
Członkowie statyczni są członkami uniwersalnymi. Dostęp do nich można uzyskać z dowolnego miejsca.
źródło
Statyczne elementy członkowskie nie zostaną odziedziczone do podklasy, ponieważ dziedziczenie dotyczy tylko niestatycznych elementów członkowskich. Statyczne elementy członkowskie zostaną załadowane do puli statycznej przez program ładujący klasy. Dziedziczenie dotyczy tylko tych elementów, które są ładowane wewnątrz obiektu
źródło