Interface

aus www.iwiki.de, der freien Wissensdatenbank

Inhaltsverzeichnis

Definition

Ein Interface (engl.: Schnittstelle) ist in Java eine besondere Form einer Klasse, die ausschließlich abstrakte Methoden und Konstanten enthält. Anstelle von class wird zur Definition eines Interfaces das Schlüsselwort interface verwendet. Alle Methoden sind daraufhin standardmäßig abstrakt. Über den Punkt-Operator können zwei Elementarten von Objekten angesprochen werden:


Interfaces sind Klassen

Interfaces besitzen zwei wichtige Eigenschaften, die auch Klassen haben:

  1. Sie lassen sich vererben. Wird ein Interface B aus einem Interface A abgeleitet, so erbt es alle Deklarationen von A und kann diese um eigene Erweiterungen ergänzen.
  2. Variablen können vom Typ eines Interfaces sein. In diesem Fall kann man ihnen Objekte zuweisen, die aus Klassen abstammen, die dieses oder eines der daraus abgeleiteten Interfaces implementieren. Sie selbst können Variablen zugewiesen werden, die zu Klassen gehören, die dieses Interface implementieren.

Es macht also Sinn, ein Interface als eine Typvereinbarung anzusehen. Eine Klasse, die dieses Interface implementiert, ist dann vom Typ des Interfaces. Wegen der Mehrfachvererbung von Interfaces kann eine Instanzvariable damit insbesondere mehrere Typen haben und zu mehr als einem Typen zuweisungskompatibel sein.


Konstanten in Interfaces

Neben abstrakten Methoden können Interfaces auch Konstanten, also Variablen mit den Attributen static und final, enthalten. Wenn eine Klasse ein solches Interface implementiert, erbt es gleichzeitig auch all seine Konstanten. Es ist auch erlaubt, daß ein Interface ausschließlich Konstanten enthält. Dieses Feature kann zum Beispiel nützlich sein, wenn ein Programm sehr viele Konstanten definiert. Anstatt diese in ihren korrespondierenden Klassen zu belassen und mit Klasse.Name aufzurufen, könnte ein einzelnes Interface definiert werden, das alle Konstantendefinitionen vereinigt. Wenn nun jede Klasse, die eine der Konstanten benötigt, dieses Interface implementiert, so stehen alle darin definierten Konstanten direkt zur Verfügung und können ohne die Qualifizierung mit einem Klassennamen aufgerufen werden.


Aufbau eines Interface in Java

Zur Beschreibung der Schnittstelle eines Objektes werden nur Methodenköpfe angegeben, Methodenrümpfe und Datenfelder werden als Teil der Implementierung nicht sichtbar (information hiding). Zusätzlich können auch klassenspezifische Konstanten mit in eine Java-Schnittstelle aufgenommen werden.

Im Prinzip ist ein Interface wie eine Klasse aufgebaut:

  • Referenztyp
  • Schnittstellendeklaration
  • Schnittstellenrumpf
public interface SchnittstelleName extends  Schnittstelle2
{
  ....
  // Definition von Konstanten
  // Deklaration von Methoden
  ....
}// endinterface
  • public: auch default möglich (dann nur im eigenen Paket verwendbar)
  • extends: ermöglicht Schnittstellenhierarchien (optional)
  • alle Attribute in einer Schnittstelle sind implizit public static final.
  • alle Methoden einer Schnittstelle sind implizit public abstract.


Verwendung

Implementiert eine Klasse eine Schnittstelle, so muss sie diese vollständig realisieren (d.h., sie muss alle Methoden implementieren). Andernfalls muss sie explizit als abstrakte Klasse gekennzeichnet werden, und kann nicht instanziiert werden. Die Implementierung eines Interfaces wird durch das Schlüsselwort implements bei der Klassendefinition angezeigt. Eine Schnittstelle bildet einen eigenen Referenztyp:

  • So können Referenzvariablen vom Typ der Schnittstelle gebildet werden, die auf Objekte zeigen, deren Klassen die Schnittstelle implementieren.
  • Arrays von Schnittstellen sind möglich.


Beispiel

public interface Fortbewegungsmittel
{
  public int kapazitaet();
  public double kilometerPreis();
}


public class Auto implements Fortbewegungsmittel
{
  public  String name;
  public  int    erstzulassung;
  public  int    leistung;
  private int    anzahlSitze;
  private double spritVerbrauch;
  private double spritPreis;

  public double kapazitaet()
  {
    return anzahlSitze;
  }

  public double kilometerPreis()
  {
    return spritVerbrauch*spritPreis/100;
  }

}


Vererbung von Schnittstellen

Schnittstellen können - mit dem Schlüsselwort extends - eine schon vorhandene Schnittstelle erweitern. Im Gegensatz zu Klassen lassen Schnittstellen auch Mehrfachvererbung zu (Achtung: Mehrfachvererbung von Methodenköpfen, keine Implementierungen!). Die Implementierung mehrerer Schnittstellen durch eine Klasse kann mehrere Gründe haben:

  1. „Ersatz“ für Mehrfachvererbung
  2. Ermöglicht elegante Möglichkeiten der Kommunikation zwischen Objekten
  3. Beispielsweise können Vermittler zwischen 2 Objekten gebildet werden die nicht direkt miteinander kommunizieren können.