Я читаю о переопределении и сокрытии методов на веб-сайте docs.oracle.com (https://docs.oracle.com/javase/tutorial/java/IandI/override.html). Под заголовком «Статические методы» Oracle любезно резюмирует для нас:
«Различие между сокрытием статического метода и переопределением метода экземпляра имеет важные последствия:
- Версия переопределенного метода экземпляра, которая вызывается, соответствует версии подкласса.
- Версия скрытого статического метода, который вызывается, зависит от того, вызывается ли он из суперкласса или подкласса».
Первый пункт очень ясен. Второй пункт списка также показался мне очень информативным, но когда я перечитал его, то, похоже, запутался.
С моей точки зрения кажется, что все статические методы как в суперклассе, так и в подклассе скрыты, и при ранней привязке (привязке во время компиляции) выбирается соответствующий метод, а другой скрыт. Это выбирается ссылочным типом переменной, из которой вы ее вызываете. Однако формулировка предложения во втором пункте списка создает впечатление, что компилятор рассматривает эти два метода как один, поскольку они имеют одинаковую сигнатуру и имеют версию super и версию sub, в отличие от необходимости разделять скрытые методы и выбирать подходящий. .
мои вопросы заключаются в том, какой из этих двух углов правильный (оба метода скрыты или один метод с двумя версиями из-за сигнатуры метода), и имеет ли значение, о каком из них я думаю? бонус: мои общие мысли по этому вопросу верны?
public class Animal {
public static void testClassMethod() {
System.out.println("The static method in Animal");
}
public void testInstanceMethod() {
System.out.println("The instance method in Animal");
}
}
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The static 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();
}
}
//The static method in Animal
//The instance method in Cat