Literatur

Interface als Datentyp

Interfaces können in Java auch als Datentyp verwendet werden. Dabei ist allerdings zu beachten, dass von einem Interface kein Objekt mit dem new-Operator erzeugt werden kann. Eine Instanz eines Interfaces kann nur über Zuweisungen erstellt werden, indem ein Objekt einer das Interface implementierenden Klasse einer Referenzvariablen, die das Interface zum Datentyp hat, zugewiesen wird.

Dadurch wird es einem, wie im nachfolgenden Beispiel gezeigt wird, auch möglich, Objekte unterschiedlicher Klassen in einem Array zu speichern.

Schauen wir uns dazu erstmal ein kleines Beispiel an.

interface PunktSchnittstelle
{
    public int getX();
    public void setX(int i);
}
 
public class Punkt implements PunktSchnittstelle
{
    private int x;
 
    public int getX()
    {
        return x;
    }
 
    public void setX(int i)
    {
        x = i;
    }
}
 
public class Strich implements PunktSchnittstelle
{
    private int x,y;
 
    public int getX()
    {
        return x;
    }
 
    public void setX(int i)
    {
        x = i;
    }
 
    public int getY()
    {
        return y;
    }
 
    public void setY(int i)
    {
        y = i;
    }
}
 
// Unsere Startklasse zum Testen
public class PunktSchnittstellenTest
{
    public static void main(String[] args)
    {
        /* Zuweisung eines Punkt-Objektes an die Variable schnittObjekt mit dem Datentyp PunktSchnittstelle */
        PunktSchnittstelle schnittObjekt = new Punkt();
 
        /* Zuweisung eines Strich-Objektes an die Variable schnittObjekt_zwei mit dem Datentyp PunktSchnittstelle */
        PunktSchnittstelle schnittObjekt_zwei = new Strich();
 
        /* Erzeugung eines Arrays mit dem Datentyp PunktSchnittstelle */
        PunktSchnittstelle schnittArray [] = new PunktSchnittstelle[2];
 
        /* Aufruf der setX-Methode aus dem Interface */
        schnittObjekt.setX(10);
        schnittObjekt_zwei.setX(30);
 
        /* schnittObjekt und schnittObjekt_zwei werden in das Array eingetragen */
        schnittArray[0]= schnittObjekt;
        schnittArray[1]= schnittObjekt_zwei;
 
        /* for-Schleife zur Ausgabe der x-Werte */
        for(int i =0; i < schnittArray.length; i++)
        {
            /* Aufruf der getX-Methode des Interfaces */
            System.out.println("Schnittstellen-Objekt liefert für x den Wert: "+ schnittArray[i].getX());
        }
    }
}

Wir verwenden an dieser Stelle wieder unsere Klasse Punkt und das Interface PunktSchnittstelle aus einem vorherigen Kapitel. Wir fügen jetzt noch eine Klasse Strich hinzu. Diese bindet auch das Interface PunktSchnittstelle ein und implementiert auch dessen Methoden. Desweiteren besitzt diese Klasse noch ein Attribut y und die dazu gehörige get- bzw. set-Methode.

Damit wir dieses testen können, benötigen wir eine Startklasse PunktSchnittstellenTest. Dort deklarieren wir zwei Variablen schnittObjekt und schnittObjekt_zwei, die das Interface PunktSchnittstelle zum Datentyp haben, und weisen der ersten ein Objekt  vom Typ Punkt und der zweiten eine Instanz vom der Klasse Strich zu. Daraufhin deklarieren wir noch ein Array, dessen Elemente vom Typ PunktSchnittstelle sein sollen. Anschließend rufen wir für jedes Objekt die setX-Methode aus dem Interface auf. Danach verschieben wir die Objekte in das Array und lassen uns in der for-Schleife die x-Werte über die im Interface deklarierte Methode getX ausgeben.

Sie sehen, dass die Klasse Strich ein weiteres Attribut und zwei weitere Methoden besitzt. Diese sind aber nach der Zuweisung an die Variable schnittObjekt_zwei nicht mehr zugänglich, da das Objekt nur noch über die Methoden des Interfaces verfügt. Es müsste erst eine Typumwandlung in die Klasse Strich erfolgen, damit der Zugriff möglich ist.

Wie Sie an diesem Beispiel sehen, können Interfaces auch als Datentyp verwendet werden, dabei ist allerdings zu beachten, dass man nur auf die in dem Interface deklarierten Methoden zugreifen kann. Ein Zugriff auf die in der  ursprünglichen Klasse zusätzlich implementierten Methoden ist nicht möglich.