Вы здесь ничего не отменяли. Чтобы убедиться в этом, попробуйте ввести @Override
аннотация перед public static void a()
в классе B
и Java сделает ошибку.
Вы только что определили функцию в классе B
называется a()
, которая отличается (никакого отношения) от функции a()
в классе A
.
Но Поскольку B.a()
имеет такое же имя, как функции в родительском классе, он скрываетA.a()
[Как указал на англ. Фуад]. Во время выполнения компилятор использует фактический класс объявленной ссылки для определения того, какой метод запускать. Например,
B b = new B();
b.a() //prints B.a()
A a = (A)b;
a.a() //print A.a(). Uses the declared reference's class to find the method.
Вы не можете переопределить статические методы в Java. Помните static
методы и поля связаны с классом, а не с объектами. (Хотя, на некоторых языках, таких как Smalltalk, это возможно).
Я нашел несколько хороших ответов здесь: Why doesn't Java allow overriding of static methods?
Потому что вы этого не сделали. 'B.a()' доступен только через класс 'B'. Если у вас есть что-то вроде 'A a = new B(); a.a(); ', он напечатает« A.a() », хотя это тип B. Если бы это было действительно переопределено, тогда оно напечатало бы« B.a() ». Обратите внимание, что это нечетная функция Java, которая позволяет вам вызывать статические методы из экземпляра объекта, что помогает вызывать путаницу здесь. – dlev
Что заставляет вас думать, что вы переопределяете 'a' внутри' B'? Вы можете легко проверить это, добавив аннотацию '@ Override' до этого метода. – Pshemo
Вы можете проверить, если 'a()' наследуется 'B', если вы удаляете функцию' a() 'из' B'. Он наследует, но не отменяет. Вместо этого он скрывает 'a()', если вы объявляете другую функцию 'a()' в 'B'. – Dorus