Переопределение и скрытие Java — путаница

Я сбит с толку тем, чем 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.

Это показывает мне, что написание статического метода с той же сигнатурой, что и у родителя, в подклассе в значительной степени приводит к переопределению.

Надеюсь, я разъяснил, где я запутался, и кто-то может пролить свет. Большое спасибо заранее!

77
задан Dan Neely 12 May 2019 в 14:04
поделиться