Creo que el concepto que está tratando de entender es el uso de una interfaz como tipo. En un programa Java, se puede declarar que una variable tiene el tipo de alguna interfaz definida. Las clases que implementan esa interfaz se pueden instanciar para variables del tipo de interfaz. Sin embargo, solo se pueden usar métodos declarados en la interfaz. En tiempo de compilación, la interfaz se usa para verificar tipos. Sin embargo, en tiempo de ejecución, el bytecode que realmente hace el trabajo proviene del implementador de la interfaz. Un ejemplo:
public interface foo {
public void bar();
}
public class A implements foo {
public void bar() {
// some code
}
}
public class Example {
public static void main(String[] args) {
foo aFoo = new A();
aFoo.bar();
}
}
En el Ejemplo de clase, una variable llamada afoo se declara a ser de tipo foo, la interfaz. A, que implementa la interfaz foo, contendrá el código para hacer el trabajo de method bar(). En la clase Ejemplo, la variable aFoo obtiene una instancia de la clase A, de modo que cualquier código que esté en el método bar() de A se ejecutará cuando se invoque aFoo.bar() aunque aFoo se declare de tipo foo.
Por lo tanto, hemos establecido que todo el trabajo se realiza en la clase A. Las dos clases y una interfaz anterior se pueden definir en su propio archivo. Los tres archivos .class resultantes se pueden empaquetar en un contenedor y enviarse a los clientes como la versión 1.0 del programa. Algún tiempo después, se podría descubrir un error en la implementación de bar() en la clase A. Una vez que se desarrolla una solución, suponiendo que los cambios están contenidos dentro del método bar(), solo se debe enviar el archivo .class para A clientes. La clase A. actualizada se puede insertar en el archivo .jar del programa (después de todo, los archivos .jar son solo archivos .zip) sobrescribiendo la versión anterior y sin formato de A.class. Cuando se reinicia el programa, la JVM cargará la nueva implementación de A.bar() y la clase Ejemplo obtendrá el nuevo comportamiento.
Como con casi todo, los programas más complicados pueden ser más complicados. Pero los principios son lo mismo.