It follows some of the same rules as redefinition, but that does not mean that it redefines. In this case, these are the rules in the section of 8.4.8.3 JLS , "Requirements for Overriding and Hiding":
The access modifier (ยง6.6) of the override or hide method must provide at least the same access as the overridden or hidden method, as follows: [...]
It still does not override, since the method will not be called polymorphically - you cannot write a call that sometimes ends with a call to StaticOverrideFunda.foo , and sometimes calls B.foo ; the target is fully determined at compile time.
It would be useful to consider the rest of section 8.4.8, which defines overriding as something that happens in instance methods.
source share