Я считал что выполнение:
public final void foo() {}
равняется:
private static void foo() {}
оба подразумевать, что метод не является переопределяемым!
Но я не вижу эквивалентности, если метод закрыт, это автоматически не доступно...
Это правда, что вы не можете @Override
ни один из методов. Вы можете только @Override
не final
instance метод.
final
, то вы никак не можете @Override
его static
, то это не метод экземпляра для началаЭто НЕ правда, что они "равны", потому что один из них private static
, а другой public final
.
static
Вы не можете @Override
метода static
, но можете скрыть его другим static
методом. Метод static
, конечно, не допускает динамической диспетчеризации (что достигается с помощью @Override
).
Оба метода не могут быть переопределены, но по совершенно разным причинам. Первый является публичным нестатическим методом, а второй - статическим. Поэтому первый не переопределяется только потому, что он был объявлен final, а второй, будучи статическим, никогда не может быть переопределен.
Обратите внимание, что из первого метода можно получить доступ к нестатическим членам класса, а из второго - нет. Поэтому они используются совершенно по-разному и не являются "одинаковыми".