It seems that you can override a concrete method and make it abstract. I actually came across some code that did this, so I had to check how it worked. Consider the following:
abstract class Grandfather
{
protected String speak ()
{
return ( "I'm old" );
}
}
abstract class Father
extends Grandfather
{
@Override
protected abstract String speak ();
}
public class Child
extends Father
{
@Override
protected String speak ()
{
return ( "I'm young" );
}
public static void main ( final String [] args )
{
System.out.println ( new Child ().speak () );
}
} It prints "I'm young" (unsurprisingly) but the interesting part is that despite
Grandfather defining a
speak method,
Father is forcing
Child to re-implement it.
Grandfather's
speak method can't be called by
Child because
Father has made it abstract. I had to test that this worked by commenting out some of the
speak methods. It really is the case that
Grandfather has an implementation but
Father doesn't.