Я сбит с толку тем, чем Overriding отличается от Hiding в Java. Может ли кто-нибудь предоставить более подробную информацию о том, как они отличаются? Я читал Учебник по Java, но пример кода все равно сбил меня с толку.
Чтобы быть более ясным, я хорошо понимаю Overriding. Моя проблема в том, что я не вижу, чтобы скрытие отличалось, за исключением того факта, что одно находится на уровне экземпляра, а другое - на уровне класса.
Глядя на код учебника по 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.");
}
}
Затем у нас есть подкласс 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();
}
}
Затем они говорят:
Вывод этой программы выглядит следующим образом:
Метод класса в Animal.
Метод экземпляра в Кат.
Для меня тот факт, что вызов метода класса testClassMethod() непосредственно из класса Animal приводит к выполнению метода класса Animal, довольно очевиден, ничего особенного в этом нет. Затем они вызывают testInstanceMethod() из ссылки на myCat, поэтому снова довольно очевидно, что метод, выполняемый тогда, является тем же, что и в экземпляре Cat.
Из того, что я вижу, скрытие вызова ведет себя точно так же, как переопределение, так зачем проводить такое различие. Если я запущу этот код, используя приведенные выше классы:
Cat.testClassMethod();
, я получу: Метод класса в Cat. Но если я удалю testClassMethod() из Cat, то получу: Метод класса в Animal.
Это показывает мне, что написание статического метода с той же сигнатурой, что и у родителя, в подклассе в значительной степени приводит к переопределению.
Надеюсь, я разъяснил, где я запутался, и кто-то может пролить свет. Большое спасибо заранее!