Nie wiem, jak zastępowanie różni się od ukrywania w Javie. Czy ktoś może podać więcej szczegółów na temat różnic między nimi? Przeczytałem samouczek Java, ale przykładowy kod nadal mnie zdezorientował.
Żeby było jaśniej, dobrze rozumiem nadpisywanie. Mój problem polega na tym, że nie widzę, czym różni się ukrywanie, z wyjątkiem faktu, że jeden jest na poziomie instancji, a drugi na poziomie klasy.
Patrząc na kod tutoriala Java:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Następnie mamy podklasę Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Następnie mówią:
Dane wyjściowe tego programu są następujące:
Metoda klasowa w Animal.
Metoda instancji w Cat.
Dla mnie fakt, że wywołanie metody klasowej testClassMethod()
bezpośrednio z klasy powoduje Animal
wykonanie metody w Animal
klasie, jest dość oczywisty, nie ma w tym nic specjalnego. Następnie wywołują metodę testInstanceMethod()
from a reference do myCat
, więc znowu całkiem oczywiste, że metoda wykonywana wtedy jest tą w instancji Cat
.
Z tego, co widzę, ukrywanie wywołania zachowuje się jak nadpisywanie, więc po co to rozróżniać? Jeśli uruchomię ten kod przy użyciu powyższych klas:
Cat.testClassMethod();
Otrzymam:
Metoda klasowa w Cat.
Ale jeśli usunę testClassMethod()
z Cat, otrzymam:
Metoda klasy w Animal.
Co pokazuje mi, że pisanie metody statycznej, z taką samą sygnaturą jak w klasie nadrzędnej, w podklasie w zasadzie powoduje nadpisanie.
Mam nadzieję, że wyjaśniam, gdzie jestem zdezorientowany i ktoś może rzucić trochę światła. Z góry bardzo dziękuję!