static
методы не наследуются.Статические методы с одинаковой сигнатурой могут скрывать только похожие методы в суперклассе.Это означает, что вы никогда не увидите желаемого результата - вы всегда точно знаете окружающий класс.Никогда не возможно, чтобы статический метод был каким-то образом «внутри» другого класса.Так что просто невозможно добиться желаемого результата.По этой причине плохой идеей является вызов статического метода из подкласса или экземпляра, поскольку он просто скрывает реальный класс.(Среды IDE и инструменты статического анализа кода могут пометить или исправить это.)
Источники:
Итак, что работает с унаследованными методами, не работает с static
методами, которые не наследуются.
class Base {
static void foo() {
// Only the static context is available here so you can't get class dynamic class information
}
void bar() {
System.out.println(getClass());
}
}
class Derived extends Base {
}
class Another extends Base {
static void foo() {
// No super call possible!
// This method hides the static method in the super class, it does not override it.
}
void bar() {
super.bar();
}
}
Derived derived = new Derived();
derived.bar(); // "class Derived"
Base base = new Base();
base.bar(); // "class Base"
// These are only "shortcuts" for Base.foo() that all work...
derived.foo(); // non-static context
Derived.foo(); // could be hidden by a method with same signature in Derived
base.foo(); // non-static context
Base.foo(); // Correct way to call the method
Another a = new Another();
a.foo(); // non-static context
Another.foo();
Хорошо ли, что язык допускает это?Хм.Я думаю, это говорит о том, что IDE и инструменты анализа кода предупреждают и могут даже исправить это автоматически.