
/**
 * Illustrates that parameters are statically bound.
 */
class Base
{
    public void foo( Base other )
    {
        System.out.println( "Base::Base" );
    }
    
    public void foo( Derived other )
    {
        System.out.println( "Base::Derived" );
    }
}

class Derived extends Base
{ 
    public void foo( Base other )
    {
        System.out.println( "Derived::Base" );
    }
    
    public void foo( Derived other )
    {
        System.out.println( "Derived::Derived" );
    }
}    
    
class OverridingDemo
{
    public static void main( String [] args )
    {
        Base    b1 = new Base( );
        Derived d1 = new Derived( );
        Base    b2 = d1;

        b1.foo( b1 );      // Base::Base
        d1.foo( d1 );      // Derived::Derived
        b2.foo( b1 );      // Derived::Base
        b2.foo( d1 );      // Derived::Derived
        b2.foo( b2 );      // Derived::Base
    }
}    
