interface Base { 
   void f( );                             // función pública y abstracta 
   default void g( ) {                    // función pública pero no abstracta (es decir, no es virtual pura; sólo es virtual) 
      System.out.println("g de Base"); 
   } 
} 
 
class Derivado implements Base { 
   @Override                                 // opcional, pero sirve para solicitarle al compilador que verifique que estamos redefiniendo una función que viene desde el tipo base 
   public void f( ) {                        // esto puede ser útil para detectar inconsistencias no intencionales; por ejemplo, si ponemos otro nombre u otros parámetros, estaríamos 
      System.out.println("f de Derivado");   // declarando una *nueva* función en lugar de redefiniendo una que viene desde el tipo base 
   } 
} 
 
void main( ) { 
   Base b = new Derivado( ); 
   b.f( ); 
   b.g( ); 
} 
