MyInterface myObj = new Obj();
MyInterface mySec = new Sec();
Perché ciò sia legale, sia Obj
e Sec
sarà devono essere implementatori di MyInterface
. La differenza tra questi due oggetti sarebbe in cui forniscono tale implementazione. Obj
e Sec
potrebbero fare due cose molto diverse o molto simili, ma la loro comunanza è che aderirebbe ad un contratto su cui si poteva fare affidamento. Si consideri di avere un metodo
public void doSomethingWith(MyInterface thing) {
thing.frob();
}
Ogni oggetto, myObj
e mySec
, potrebbe essere passato in questo metodo, e questo metodo potrebbe quindi utilizzare frob
metodo dell'oggetto (frob supponendo che fa parte della dichiarazione di interfaccia). Questo è liberando. Questo ti permette di fare cose molto potenti, programmando interfacce e non implementazioni. Ad esempio, è possibile estendere la funzionalità delle classi e non modificare una riga di codice in tali classi, è sufficiente passare una diversa implementazione di una dipendenza. Non sei legato a, o accoppiato con, un qualsiasi impianto all'interno del metodo doSomethingWith
.
ma ho anche letto che se noi dichiariamo le myObj oggetto come MyInterface, myObj non sarà in grado di utilizzare i propri metodi (dalla classe Obj), è che correggere
Internamente , le istanze di Obj
continueranno ad avere pieno accesso all'API Obj
. myObj
è ancora un Obj
, sarà sempre in grado di utilizzare i propri dettagli di implementazione.
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
}
}
istanze di Obj
saranno ancora le istanze di Obj
, e quei casi saranno ancora in grado di utilizzare doFrobbing
. Esternamente, le persone utilizzando quelle istanze tramite il riferimento all'interfaccia saranno solo in grado di accedere ai metodi di interfaccia.
fonte
2011-12-07 00:35:21
[questo] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html) potrebbe essere di aiuto. – Nerdtron