Я понимаю, что в этом коде:
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
есть..)