Number n = new Number(5)
ist illegal, Number n = 5
jedoch nicht. Warum?
Grundlegend ist es, weil Number
eine abstrakte Klasse ist - dort ist kein Konstruktor, der Number(5)
entspricht, und selbst wenn es wäre, wäre es immer noch nicht möglich, die Klasse direkt zu instanziieren, weil Es ist abstrakt.
Wie Bombe erklärt, erstellen Sie in Ihrem zweiten Fall ein Integer
-Objekt *, das einer Unterklasse von Number
zugewiesen werden kann. Und da es sich um eine konkrete Klasse handelt, können Sie sie instanziieren.
* Obwohl es in der Praxis eher mit Integer.valueOf(5)
übereinstimmt, wird auf Sun JREs kein zusätzliches Integer-Objekt erstellt, sondern eine gepoolte Version (wie das Flyweight-Muster).
Es ist ähnlich wie das Folgende funktionieren würde:
%Vor%List ist eine Schnittstelle, daher können Sie sie nicht direkt instanziieren. Sie können jedoch eine Variable vom Typ List deklarieren und ihr dann ein konkretes Objekt zuweisen, das diese Schnittstelle implementiert. In derselben Richtung können Sie eine Variable vom Typ Number deklarieren und ihr ein beliebiges Wertobjekt zuweisen, das eine konkrete Instanz dieses Typs ist. Was Sie mit dem Funktionscode gemacht haben, ist (durch Autoboxing) in jeder Hinsicht:
%Vor%