PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Default Konstruktor in Java


Aqualon
2004-11-28, 22:37:43
Ich habe ein ziemlich seltsames Problem mit Default Konstruktoren in Java.

Folgende Klassen spielen eine Rolle:

abstract class ALGOBinaryExpression extends ALGOExpression {
protected ALGOExpression rightArg;

protected ALGOExpression leftArg;

/**
* default constructor
*/

public ALGOBinaryExpression() {
System.err.println("Syntax Error! I need 2 Arguments!");

}
}



class ALGONestedExpression extends ALGOBinaryExpression {

private ALGOExpression firstArg;

/**
* Default Constructor
*/

public ALGONestedExpression() {
}

/**
* Constructor uses param to set firstArg
*/

public ALGONestedExpression(ALGOExpression x) {
firstArg = x;
}
}


Wenn ich nun ein neues Objekt von ALGONestedExpression erstelle (mit einer ALGOExpression als Argument), wird neben dem Konstruktor ALGONestedExpression(ALGOExpression x) auch der default Konstruktor von ALGOBinaryExpression aufgerufen.

Meine Frage, wieso wird dies gemacht?

Aqua

Corrail
2004-11-28, 23:31:59
AFAIK muss das gemacht werden, da auch die Ur-Klasse initialisiert werden muss. Aber kurze Frage, wenn deine Klasse sowieso nur einen Konstruktor mit 2 Parameter nimmt, warum programmierst du dann einen Standard-Konstruktor?

Aqualon
2004-11-28, 23:37:20
Vorgabe vom Übungsleiter an der Uni. Jede Klasse muss einen default Konstruktor enthalten.

Das Problem bei dem Beispiel ist grundsätzlich, dass ALGONestedExpression nicht von ALGOBinaryExpression erben darf, da es eben nur ein Argument und keine zwei bekommt.

Hab mich dann halt gewundert, warum der Konstruktor überhaupt aufgerufen wird.

Aqua

Senior Sanchez
2004-11-29, 00:05:48
Wird in Java ein neues Objekt erzeugt so hangelt sich die JVM automatisch durch die Klassenhierarchie bis zu java.lang.Object und ruft dabei immer die default-Konstruktoren auf. Das ist auch logisch, denn es kann ja sein das bestimmte Attribute in der Oberklasse initialisiert werden müssen oder überhaupt etwas getan werden muss (beispielsweise GUI-Klassen) damit de mit dem Objekt was anfangen kannst.


Möchteste in einem Konstruktor mal nen anderen als den default-Konstruktor aufrufen so machste das einfach mit super() und übergibst nötige Parameter.


mfg Senior Sanchez

Aqualon
2004-11-29, 01:37:09
Danke für die Antwort! Das erklärt das Verhalten natürlich.

Aqua