Abstrakte Klassen und Interfaces

Bezüglich Interfaces sowie der Frage ob “ein Objekt vom Typ Interfacename” ist. Zunächst: Interfaces sehr ähnlich zu abstrakten Klassen:

Abstrakte Klasse

abstract class Klasse {
    public abstract void f();
}

class KonkreteKlasse extends Klasse() {
    public void f() {
        // ...
    }
}
  • Die abstrakte Klasse kann nicht direkt instanziiert werden (new Klasse(); ist Syntaxfehler!)
  • …sie kann aber als Referenztyp verwendet werden, um auf Instanzen zu verweisen, für die o instanceof Klasse gilt, also z.B. Klasse k = new KonkreteKlasse();.
  • Methoden können entweder abstrakt sein (also ... abstract ... methode(); mit abstract und ohne Anweisungsblock), oder aber “normal” (kein abstract, mit Anweisungsblock).

Interface

interface Interface {
    // Weder `public abstract` noch Anweisungsblock,
    // Sonderfall `default` (siehe unten).
    void f();
}

class KonkreteKlasse implements Interface {
    // muss public sein, da vom Interface
    public void f() {
        // ..
    }
}
  • Das Interface kann ebenfalls nicht direkt instanziiert werden (new Interface(); ist Syntaxfehler!)
  • …es kann aber als Referenztyp verwendet werden, um auf Instanzen zu verweisen, für die o isntanceof Interface gilt, also z.B. Interface i = new KonkreteKlasse();.
  • Methoden sind immer abstrakt und öffentlich, daher wird beides im Interface nicht angegeben.
  • In der Regel haben Methoden im Interface keine Implementierung, ausser sie sind als default annotiert (mehr dazu für Interessierte).

Der Hauptunterschied zwischen Interface und abstrakter Klasse ist in deren Verwendung: Klassen können von nur genau einer Klasse erben, aber mehrere Interfaces implementieren, also z.B.

class KonkreteKlasse extends Klasse implements Interface1, Interface2 {
    // hier müssen nun alle abstrakten Methoden von Klasse sowie
    // alle Methoden der Interfaces Interface{1,2} implementiert werden.
}
Written on March 1, 2017