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