Я смущен тем, что Overriding отличается от скрытия на Java. Может ли кто-нибудь предоставить более подробную информацию о том, как они отличаются? Я прочитал Java Tutorial, но образец кода все еще оставил меня в замешательстве.Overriding vs Hiding Java - Confused
Чтобы быть более ясным, я понимаю, что переопределение хорошо. Моя проблема заключается в том, что я не вижу, чтобы скрытие было иным, за исключением того факта, что один находится на уровне экземпляра, а другой - на уровне класса.
Глядя на код учебник 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.");
}
}
Тогда мы имеем подкласс кота:
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();
}
}
Тогда они говорят:
Вывод этой программы выглядит следующим образом :
Метод класса в животных.
Метод экземпляра в Cat.
Для меня факт, что вызов метода класса testClassMethod() непосредственно из класса Animal, выполняет метод в классе Animal, довольно очевиден, ничего особенного нет. Затем они вызывают testInstanceMethod() из ссылки на myCat, поэтому снова довольно очевидно, что тогда выполненный метод является тем же, что и в случае Cat.
Из того, что я вижу, что скрывает вызов, ведет себя так же, как переопределение, поэтому зачем делать это различие. Если я запускаю этот код, используя классы выше:
Cat.testClassMethod();
Я получаю: метод класса в Каталоге. Но если я удалю testClassMethod() из Cat, то я получу: Метод класса в Animal.
Что показывает мне, что запись статического метода с той же сигнатурой, что и в родительском, в подклассе в значительной степени делает переопределение.
Надеюсь, я разъясняю, где я смущен, и кто-то может пролить свет. Большое спасибо заранее!
Благодарим за быстрый ответ, это разъясняет это! Я заметил, что в примере JavaRanch они использовали переменную, чтобы вызвать метод класса, а не использовать класс, который упрощает его понимание. Думаю, что в учебнике Java они использовали класс напрямую, потому что использование экземпляра для вызова статического метода, вероятно, не является хорошей практикой, но они должны были использовать _myAnimal.testClassMethod() _ вместо _Animal.testClassMethod() _. – Lostlinkpr
+1 за то, что он может правильно записать его словами, а не примером! :) – WhyNotHugo
@ Kazekage Gaara Есть ли разница между перегрузкой и скрытием? – gstackoverflow