Ich versuch's auch mal mit einer Erklärung:
Wenn du ein Objekt mit Typ eines Interfaces deklarierst:
[HIGHLIGHT="Java"]
interface Drivable{
public void drive();
}
class Auto implements Drivable{...}
// nicht:
Auto a = new Auto();
// sondern:
Drivable a = new Auto();[/HIGHLIGHT]
dann kannst du auf diesem Objekt die Methode drive() aufrufen.
Das kannst du jetzt aber auch mit Motorrädern, LKWs, Flugzeugen, und allem anderen
das dieses Interface implementiert.
Das ist aber gar nicht der Vorteil, denn du könntest jeder dieser Klassen die Methode
drive() auch geben ohne Interface.
Der Vorteil ist, dass du diese Objekte abstrahierst: Du wirst nur drive() aufrufen können, und nicht zB getPS() vom Auto oder getKerosin() vom Flugzeug.
An einer Stelle, wo du etwas also nur Fahren willst, und der Rest ist dir egal, nimmst
du Objekte vom Interface-Typ, nicht vom "echten" (Achtung umgangssprachl.) Typ.
Damit ist sichergestellt, dass du keinen Schmarrn machen kannst.
EDIT:
Ein Interface ist eine Schablone. Wenn Auto zwei Interfaces implementiert, das eine
ist Drivable das andere ist zB Verschrottable, dann wird der Schrottplatz alle Autos
als Schrottable-Objekte entgegennehmen, der Chaffeur als Drivable.
Du kannst halt eine Klasse in einem Programmteil, wo du etwas mit Objekten dieser
Klasse tun willst, auf die Funktionalität die du gerade brauchst zusammendrücken.
Wie gesagt: Eine Schablone, die sich über die Klasse legt, und nur ein Loch dort hat,
wo die Interface-Methode steht. Der Rest ist unbekannt.
Vllt noch ein wenig praktisch untermalt, damit der Sinn wirklich klar wird:
Willst du auf einmal dass nur noch Autos Schrottable sind,
und keine Flugzeuge, LKWs, Motorräder, Kühlschränke oder sonst was, dann nimmst
du bei diesen Klassen einfach das Interface raus.
An der Schrottplatz-Klasse muss du gar nix mehr ändern.
Hingegen wenn du es ohne Interface gemacht hättest müsstest du am Schrottplatz
Anpassungen vornehmen, zB die Methoden "überreicheFlugzeug(Flugzeug f)", "überreicheLKW(LKW w)", "überreicheMotorrad(Motarrad m)" usw entfernen.
Mit Interface haste nur "überreicheSchrottable(Schrottable s)", und jetz ist es
dir völlig Wurscht was genau das ist.
Der Code wird also flexibler, du kannst schneller Dinge ändern, erweitern, löschen.