Разницу можно увидеть по уже упомянутому коду @SMA:
public static final void main(String... strings) {
final Child obj = new MainClass.Child();
obj.f1();
final Parent p = obj;
p.f1();
}
приведет к:
дочернему классу
дочернему классу
, тогда как статическая альтернатива будетпривести к:
Дочернему классу
Родительскому классу
Таким образом, в случае переопределения родительский метод может быть вызван только из метода переопределения. В то время как в статическом случае скрытый метод все еще существует и будет вызываться при использовании соответствующего контекста (следовательно, родительского класса).
(я знаю, что вызов статических методов через экземпляры класса не является хорошей практикой, но это помогаетчтобы проиллюстрировать ответ на этот вопрос.)