home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Interfaces

Ein Interface ist eine besondere Form einer Klasse, die ausschließlich abstrakte Methoden und Konstanten enthält. Anstelle des Schlüsselwortes "class" wird ein Interface mit dem Bezeichner "interface" deklariert. Alle Methoden eines Interfaces sind implizit abstrakt und öffentlich, deswegen müssen oder sollten sie nicht als "public abstract" definiert werden. Neben Methoden kann ein Interface auch Konstanten enthalten, die Definiton von Konstruktoren ist allerdings nicht erlaubt.

package interfaces;

public interface IPersistence {
  //CRUD Create, Read, Update, Delete
  
  String name = "Persistence";
  
  void save(Object o, String key);
  Object load(String key);
}

Alle Klassen, die das Interface implementieren ( <Klasse> implements <Interface>), müssen die gleichen öffentlichen Methoden implementieren. Eine Klasse kann sich so zum Beispiel eine Variable des Typs <Interface> anlegen und kann Methoden dieses Interfaces nutzen, da es garantiert wird, dass die implementierende Klasse diese Methode definiert und implementiert.

Das Konzept der Interfaces dient also zur Entkopplung von Klassen, indem nur an einer Stelle im Code Bezug zu der konkrekten Implementierung genommen wird.


Im folgenden Beispiel wird eine Variable vom Typ "IPersistence" angelegt. Mit dieser Variablen "db" können nun die Methoden aufgerufen werden, die auf dem Interface definiert sind, denn diese sind bereits zur Zeit der Implementierung bekannt. Was tatsächlich in den Methoden "void save(Object o, String key)" und "Object load(String key)" passiert ist zu diesem Zeitpunkt noch nicht bekannt.

Erst zur Laufzeit wird jetzt bestimmt welche konkrete Klasse hinter der Variablen "db" steckt. Mit "new PersistenceFile()" wird eine Instanz erzeugt, wobei die Klasse PersistenceFile das Interface "IPersistence" implementiert haben muss. Mit der Implementierung des Interfaces unterschreibt die Klasse gewissermaßen einen Vertrag und verpflichtet sich damit die im Interface definierten Methoden zu implementieren, der Inhalt der Methode spielt dabei keine Rolle. Man spricht bei diesem Konzept auch von "Design-by-contract".

 

package interfaces;

public class ERP {
  public static void main(String[] args) {
    String kunde = "Wichtiger Kunde";
    
    IPersistence db = new PersistenceFile();
    
    db.save(kunde, "1");  
    System.out.println("Lade " + db.load("2"));
  }

}

Abstrakte Klassen

Eine Klasse, die mindestens eine abstrakte Methode enthält, wird als abstrakt angesehen und muss mit dem Schlüsselwort "abstract" versehen werden. Abstrakte Klassen können nicht instanziert werden, da sie Methoden enthalten, die nicht implementiert wurden. Stattdessen werden abstrakte Klassen abgeleitet und in der abgeleiteten Klassen werden die abstrakten Methoden implementiert. Abstrakte Methoden enthalten nur die Deklaration der Methode, nicht aber ihre Implementierung. Bei abstrakten Methoden fallen die geschweiften Klammern weg, es steht lediglich ein Semikolon am Ende. Zusätzlich wird die Methode mit dem Attribut "abstract" versehen. Diese Methoden können nicht aufgerufen werden.

package progstruk.abstractclass;

import java.util.Date;

public abstract class Mitarbeiter {
  int persnr;
  String name;
  Date eintritt;
  public void printName()
  {
    System.out.println("Der Name des Mitarbeiters lautet "+name);
  }
  public abstract double monatsBrutto();
}
package progstruk.abstractclass;

public class Arbeiter extends Mitarbeiter {
  private double stundenlohn;
  private double anzahlstunden;
  @Override
  public double monatsBrutto() {
    return stundenlohn * anzahlstunden;
  }

}

Abstrakte Klasse vs. Interface

Zwischen abstrakten Klassen und Interfaces bestehen folgende Unterschiede.

ABSTRAKTE KLASSE INTERFACE
konkrete Implementierung möglich keine Implementierung
innerhalb von Komponenten zwischen Komponenten
wenn Implementierung zum Teil schon verbindlich ist falls Implementierung nicht bekannt oder häufig verändert wird
nur von einer Klasse erben möglich (Einfachvererbung) mehrere Interfaces implementieren möglich

Abstrakte Klassen und Interfaces können nicht instanziert werden.