Ich glaube du hast hier einiges was OOP angeht etwas missverstanden.
1) In einer abstrakten Klasse wird niemals etwas implementiert. Eine abstrakte Klasse dient als Grundgerüst für Klassen welche davon abgeleitet sind. In der Regel sollte man eine abstrakte Klasse auch so konzipieren das sie nie dierekt instanzierbar ist sondern nur über Methoden welche Objekte einer abgeleiteten , implementierten Sub-Klasse returnen.
2) Natürlich kann man innerhalb von Konstruktoren auch Objekte anderer Klassen erzeugen , es gibt nirgendwo eine Regel die dir das verbietet , aber überlege doch ein mal selbst ob das überhaupt Sinn macht oder ob es nicht einfacher ist beide Objekte seperat zu erzeugen und dann von außen beide in Abhängigeit zu manipulieren.
3) TestKlasse$1 - woher kommt das ? Der Grund dafür ist das was ich bereits erwähnte : in einer abstrakten Klasse wird nicht implementiert. Da du jetzt aber einen Konstruktor implementiert hast baut der Compiler daraus eine abgeleitete , implementierte Sub-Klasse TestKlasse$1 welche , da innerhalb der Klasse TestKlasse erzeugt , richtigerweise als anonyme innere Klasse bezeichnet wird.
Warum jetzt allerdings
vom Typ TestKlasse$1 ist verstehe ich nicht. Ich glaube du hast dich hier falsch ausgedrückt und meintest ein Objekt der Klasse TestKlasse , oder ? Denn test ist laut deklaration vom Typ Test , welche hier zwar nicht aufgführt ist aber auf Grund des Names auszuschließen ist das Test von TestKlasse$1 erbt.
Wenn du jetzt also ein Objekt des Super-Typs TestKlasse willst dann musst du eine Klasse implementieren welche davon erbt. Dies kann eine anonyme innere , eine bezeichnete innere oder auch eine eigenständige Klasse sein ... so lange du nicht versuchst TestKlasse selbst zu instanzieren *was aus dem bei 1) genannten zu vermeiden ist.