MyInterface myObj = new Obj();
MyInterface mySec = new Sec();
Para que esto sea legal, tanto Obj
y Sec
se tiene que ser implementadores de MyInterface
. La diferencia entre estos dos objetos sería cómo proporcionan esa implementación. Obj
y Sec
podrían hacer dos cosas muy diferentes o muy similares, pero su punto en común es que cumplirían un contrato en el que podrían confiar. Considere usted tiene un método
public void doSomethingWith(MyInterface thing) {
thing.frob();
}
Cada objeto, myObj
y mySec
, se podría pasar en este método, y este método podría utilizar frob
método de ese objeto (FROB suponiendo que es parte de la declaración de interfaz). Esto es que libera. Esto le permite hacer cosas muy potentes, programando interfaces y no implementaciones. Por ejemplo, puede ampliar la funcionalidad de las clases y no cambiar una línea de código en esas clases, simplemente pasa una implementación diferente de una dependencia. No está vinculado a, o junto con, cualquier implementación dentro del método doSomethingWith
.
pero también leí que si declaramos los myObj de objeto como MyInterface, myObj no será capaz de utilizar sus propios métodos (de la clase Obj), es que corregir
Internamente , las instancias de Obj
continuarán teniendo acceso completo a la API Obj
. myObj
sigue siendo Obj
, siempre podrá usar sus propios detalles de implementación.
public interface MyInterface {
void frob();
}
public class Obj implements MyInterface {
public void frob() {
doFrobbing();
}
private void doFrobbing() {
System.out.println("frobbing");
}
public static void main(String[] args) {
MyInterface myObj = new Obj();
myObj.frob(); // still internally calls doFrobbing()
((Obj)myObj).doFrobbing(); // visible only via class reference
}
}
Las instancias de Obj
todavía serán instancias de Obj
, y aquellos casos todavía será capaz de utilizar doFrobbing
. Externamente, las personas usando esas instancias a través de la referencia de interfaz solo podrán acceder a los métodos de interfaz.
[this] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html) podría ser de ayuda. – Nerdtron