# Kann ich ein Objekt vom Typ Interface erzeugen?



## pisco (25. Jan 2011)

Hey 

kurze Frage:

ITiere test = new Tiger();

geht sowas ?

Kann ich ein Objekt vom Typ Interface erzeugen? und was bringt es sich?

ITier ist ein interface und Tiger eine Klasse die das Interface implementiert..

gruss


----------



## tfa (25. Jan 2011)

Klar geht das. Wenn Tiger das Interface ITiere (besser wäre wohl "ITier" oder gleich "Tier") implementiert, ist es auch vom Typ ITiere und ein Tiger-Objekt kann einer Variablen dieses Typs zugewiesen werden.


----------



## Fleur de Soleil (26. Jan 2011)

Interessant ist das zum Beispiel wenn man ein Array mit verschiedenen Tieren befüllen möchte. In ein Tiger[] kann man eben nur Tiger-Objekte legen, in ein ITiere[] kann man alle Objekte der Klassen die das Interface ITiere implementieren, ablegen.


----------



## Landei (26. Jan 2011)

Du bist jetzt an einem Punkt, bei dem viele Neulinge etwas falsches lernen, was später schwer auszubügeln ist - obwohl es eigentlich ganz einfach ist.

[c]ITiere test = new Tiger();[/c]

Du kannst _kein_ Objekt von einem Interface-Typ erzeugen. Hier erzeugst du ein Objekt vom Typ Tiger, was ganz klar eine *Klasse* ist. Im Speicher steht also _immer _eine Instanz einer Klasse. Egal was du damit anstellst, es ist immer [c]test.getClass()[/c] gleich [c]Tiger.class[/c] (man sagt deshalb auch, Tiger ist der "Laufzeit-Typ", weil das der Typ ist, der zur Programm-Laufzeit zurückgegeben wird).

Was auf der linken Seite der Zuweisung steht, ist _nicht_ das Objekt (das bekommst du in Java _niemals_ direkt in die Hand), sondern eine Variable mit einer *Referenz* auf das Objekt. Diese Referenz verhält sich wie eine Art Fernbedienung für dein Objekt. Der Typ der Variablen ist schon zur Compile-Zeit bekannt (deshalb "Compilezeit-" oder "statischer Typ"), und kann "allgemeiner" sein als der Laufzeit-Typ. "Allgemeiner" ist sowohl der Typ einer Oberklasse, wie auch ein implementiertes Interface. In diesem Fall sind dir bestimmte Details des Objekts nicht so wichtig, sondern du bist an einem generellen Verhalten interessiert (so als würde man sagen: "Diese Fernbedienung kann für alle ITiere verwendet werden"). An [c]test[/c] kannst nur ITiere-spezifische Methoden aufrufen, und keine, die es nur in Tiger gibt. Das liegt daran, dass du [c]test[/c] in der nächsten Zeile auf eine Kuh verweisen lassen könnstes, die natürlich keine Tiger-Methoden besitzt.


----------



## tfa (26. Jan 2011)

> Du kannst kein Objekt von einem Interface-Typ erzeugen.


Man kann kein Objekt von einem Interface erzeugen. Ein Objekt hat aber im Allgemeinen viele Typen, natürlich auch "Interface-Typen". Wie hier in diesem Beispiel ist ein Objekt der Klasse Tiger gleichzeitig vom (Interface-)Typ ITiere.


----------

