Here's my understanding...
Suppose SubClass extends SuperClass. Then within SubClass,
super is interpreted as
(SuperClass)this. In other words, it is a reference to the current
instance (this) upcast to the type of the immediate superclass. Consequently, super can be used only in a non-static context, which is why the error message applies.
The above works fine for fields, but due to
polymorphism,
((SuperClass)this).method() would still invoke the overridden version. So in the case of overridden methods, "super" goes a little further and ensures that the body of the superclass method is invoked. Now, you
can call super.method() for a method that's
not overridden, but it will
not have any special effect, because the superclass method is already inherited in the subclass.
(See JLS
15.11.12 and
15.12.4.9.)
[ December 13, 2006: Message edited by: marc weber ]