interface Adressierbar {
 
    public abstract String getWohnort();
 
    public default String getAnschrift() {
        return "Anschrift: " + getWohnort();
    }
}
  • Statt class wird interface vorangeschrieben
  • Zusatandslose, abstrakte Klasse
  • Keine änderbare Attribute
    • Alle Attribute sind immer public static final
  • Kein Konstruktor (kann ja nicht instantiiert werden)
  • Methoden:
    • Entweder public abstract oder private
    • default-Methoden bieten Standardfunktionalität (implementiert), die von einer implementierenden Klasse genutzt oder überschrieben werden kann
    • Statische Methoden static sind auch möglich, auch gleich im interface zu implementieren

Interfaces implemtieren

class Brief implements Adressierbar {
    private String adresse;
 
    Brief(String adresse) {
        this.adresse = adresse;
    }
 
    @Override public String getWohnort() { return adresse; }
}
 
class Paket implements Adressierbar {
    /* ... */
}

Klassen können beliebig viele Interfaces implementieren, aber nur von einer Oberklasse abgeleitet sein:

interface A { } interface B { } class C { }
class D extends C implements A, B { }

Interfaces als Typen nutzen

class Test {
    public static void main(String[] args) {
 
    Adressierbar[] sendungen = {
        new Brief("Esplanade 10"),
        new Paket("Domplatz 13")
    };
 
    for (Adressierbar s : sendungen)
        System.out.println(s.getAnschrift());
    }
}

Interfaces im Klassendiagramm

  • Box mit Namen, darüber <<interface>>
  • Gestrichelter Pfeil der implementierenden Klasse zum Interface

Alternativ: Lollipop-Notation

  • Kreis mit Namen des Interfaces daneben
  • Verbunden zu implementierender Klasse mit einfacher Linie

Erweitern von Interfaces

Interfaces können andere Interfaces erweitern:

interface Rot
interface Tomate
interface RoteTomate extends Rot, Tomate

Nützliche Interfaces

Das Interface Comparable

public interface Comparable<T> {
    public abstract int compareTo(T o);
}
  • compareTo vergleicht this mit dem Objekt o und liefert eine negative ganze Zahl, Null, oder eine positive ganze Zahl, je nachdem ob this kleiner als, gleich, oder größer als o ist.
  • Wird bei vielen Sortieralgorithmen verwendet, möchte man also seine Klassen sortieren lassen, sollte man compareTo implementieren.

Das Interface Comparator

public interface java.util.Comparator<T> {
    public abstract int compare(T o1, T o2);
}

Erst nach einem, dann nach dem anderem Kriterium vergleichen:

public default Comparator<T> thenComparing(Comparator<T> other)