На мой взгляд, реальный прецедент, который делает это настолько нечитаемым, выглядит примерно так. Что выводит код ниже?
//in a main method somewhere
Super instance = new Sub();
instance.method();
//...
public class Super {
public static void method() {
System.out.println("Super");
}
}
public class Sub extends Super {
public static void method() {
System.out.println("Sub");
}
}
Ответ заключается в том, что он печатает «Супер», потому что статические методы не являются виртуальными. Хотя instance
есть-a Sub
, компилятор может перейти только к типу переменной, которая является Super
. Однако, вызывая метод через instance
, а не Super
, вы тонко подразумеваете, что он будет виртуальным.
На самом деле разработчику, читающему instance.method()
, пришлось бы посмотреть на объявление метода (его подпись), чтобы узнать, какой метод он фактически вызывает. Вы упоминаете
, мне кажется, что это может сделать мою жизнь проще, поэтому мне не нужно беспокоиться о том, что статично или нет
blockquote>Но в данном случае контекст действительно очень важен!
Я могу с уверенностью сказать, что разработчикам языка было ошибкой, чтобы это разрешить в первую очередь. Держитесь подальше.