Abstract ArrayList

Bananabert

Bekanntes Mitglied
hallöchen community,

vorab, ein hallöchen an die community 🙂 mit regnerischen grüßen aus dem norden.
ich hoffe die die durchgehende missachtung der groß- und kleinschreibung stört keinen^^.
zudem bin ich relativ neu in java und seit ein paar minuten in hier in dem forum angemeldet.

bisher kam ich eigentlich ganz gut zurecht, nur habe ich jetzt eine verständnis frage.

ich habe mir eine kleine abstracte klasse "DefaultMain" geschrieben, die mir die arbeit fürs JFrame abnimmt.
am ende des konstruktor rufe ich die abstracte methode "init()" auf.
in der "Main" klasse die von "DefaultMain" erbt habe ich eine ArrayList mit dem typ <BasicEntity>
(BasicEntity abstract, BasicBot abstract erbt BasicEntity, Worker class erbt BasicBot)

nun die eigentlich frage
wieso kann ich
Java:
public List<BasicEntity> List = new ArrayList<BasicEntity>();

protected void init() {
		List.add(new Worker(1, 50, 50));
}
nicht direkt initialisieren und in der "init()" methode ein object der klasse worker hinzufügen?
mir fliegt immer eine "NullPointerException" um die ohren.
erst wenn ich die variable deklariere und in der "init()" zuweise und danach dann ein neues object der klasse worker erzeuge und hinzufüge klappt das ganze.
Java:
public List<BasicEntity> List;

protected void init() {
		List = new ArrayList<BasicEntity>();
		List.add(new Worker(1, 50, 50));
}

ich hoffe das war verständlich ???:L

LG Bananabert
 
Folgendes passiert: Der Konstruktor deiner konkreten Klasse wird aufgerufen. Sofort (implizit oder explizit in der ersten Zeile) wird der Konstruktor der Elternklasse aufgerufen, hier also von [c]DefaultMain[/c]. Erst wenn der fertig abgearbeitet ist, geht es in deiner konkreten Klasse weiter, und erst dann werden deine Membervariablen initialisiert. Damit ist klar, was schief läuft: [c]init()[/c] ist abstrakt, somit ruft der Konstruktor von [c]DefaultMain[/c] die Implementierung in deiner konkreten Klasse auf, bevor deren Initialisierung erfolgen konnte.

Generell würde ich versuchen, diese Situation zu vermeiden, auch wenn die Initialisierung innerhalb von [c]init()[/c] funktioniert. Ich frage mich, welchen Mehrwert diese Funktion überhaupt hat, wenn man genauso gut den Initialisierungscode dort schreiben kann, wo er erwartet wird: im Konstruktor. Konstruktoren unterscheiden sich aus gutem Grund von Methoden, und man sollte wirklich einen noch besseren Grund haben, wenn man von diesem Konzept abweicht.
 
Zuletzt bearbeitet:
hallo landei,

danke für deine antwort, also anstatt die "init()" in abstrakten konstruktor aufzurufen, die eigentlich sachen im richtigen konstruktor aufrufen?
der code der nach dem "super()" kommt, wird dann auch wohl am ende des superkonstruktors aufgerufen, oder?

mehrwert? hmm 😀, ich fands ein klein wenig übersichtlicher, der konstruktor baut mir mein fenster zusammen und in die "init()" klatsch ich dinge, die nicht dazu gehören.

LG Bananabert
 

Zurück
Oben