Я понимаю, что в этом коде:
class Foo {
public static void method() {
System.out.println("in Foo");
}
}
class Bar extends Foo {
public static void method() {
System.out.println("in Bar");
}
}
.. статический метод в Bar скрывает статический метод, объявленный в Foo, в отличие от переопределения его в смысле полиморфизма.
class Test {
public static void main(String[] args) {
Foo.method();
Bar.method();
}
}
... выведет:
в Foo
в баре
Повторное определение method() как final в Foo отключит возможность Bar скрыть его, а повторный запуск main() будет выводиться:
в Foo
в Foo
( Изменить: компиляция завершилась неудачно, если вы пометили метод как final и снова запускаете, когда я удаляю Bar.method())
Считается ли плохой практикой объявлять статические методы как final, если он останавливает подклассы от намеренного или непреднамеренно переопределения метода?
(это является хорошим объяснением того, что поведение использования final есть..)