Я збентежений тим, як заміщення відрізняється від приховування в 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();
}
}
Тоді вони кажуть:
Результат роботи цієї програми такий:
Метод занять у Тварині.
Метод екземпляра в Cat.
Для мене той факт, що виклик методу класу testClassMethod()
безпосередньо з Animal
класу виконує метод у Animal
класі, є досить очевидним, там немає нічого особливого. Потім вони викликають testInstanceMethod()
з посилання на myCat
, так знову досить очевидно, що метод, який виконується тоді, є методом у екземпляріCat
.
З того, що я бачу, приховування дзвінків поводиться так само, як перевизначення, то навіщо робити таку різницю? Якщо я запустив цей код, використовуючи класи вище:
Cat.testClassMethod();
Я отримаю:
метод класу в Cat.
Але якщо я видалю testClassMethod()
з Cat, то отримаю:
метод класу в Animal.
Що показує мені, що написання статичного методу з тим самим підписом, що й у батьківському, у підкласі майже перекриває.
Сподіваюся, я даю зрозуміти, де я розгублений і хтось може пролити світло. Спасибі заздалегідь!