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.