Problem beim Objekterzeugen

mjkraus

Mitglied
Hallo!

Ich habe folgende Klasse:

Java:
abstract public class TestKlasse{
  protected Test test;

  public TestKlasse{
    this.test = new Test();
  }
}

Soweit ist auch alles in Ordung. Wenn ich aber das Objekt wie folgt erzeuge:

Java:
this.test = new Test(){
  //...
};

ist das Objekt allerdings vom Typ "TestKlasse$1" und nicht "Test". Was habe ich falsch gemacht?

Ciao Max
 
Ich habe den Code vereinfacht geschrieben: Test ist eine von mir geschriebenen Klasse, die in TestKlasse instanziiert werden (bei gleichzeitigem überschreiben von Methoden). Wenn ich aber das Objekt "test" ausgebe gehört es nicht der Klasse "Test" sondern "TestKlasse$1" an. Was das bedeutet weiß ich leider nicht.
 
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
Java:
protected Test test;
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.
 
Zurück