Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Markus

the one and only Unterstrich!

  • "Markus" started this thread

Posts: 2,571

Date of registration: Oct 9th 2003

1

Sunday, May 20th 2007, 8:33pm

Java: Initialisierung von Objektvariablen - vor/nach dem this()?

Hallo,

ich bin gerade auf folgende Fragestellung gestoßen, und mich würden einfach mal ein paar Kommentare/Ideen dazu interessieren.

Folgendes Programm (Java):

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test {

	int foo = 3;

	public Test() {
		this("useless");
		System.out.println(foo);
	}

	public Test(String uselessString) 	{
		foo = 4;
	}

	public static void main(String... args) {
		Test t = new Test();
	}
}

Die Ausgabe ist: 4

So, jetzt habe ich bei Java ist auch eine Insel folgendes gelesen

Quoted

Der Aufruf von this() muss die erste Anweisung des Konstruktors sein.
Als Parameter von this() können keine Objektvariablen übergeben werden. Insbesondere Eigenschaften aus der Oberklasse sind noch nicht präsent. Möglich sind aber statische finale Variablen (Konstanten).

Die erste Einschränkung besagt, dass das Erzeugen eines Objektes immer das Erste ist, was ein Konstruktor leisten muss. Nichts darf vor der Initialisierung ausgeführt werden. Die zweite Einschränkung hat damit zu tun, dass die Objektvariablen erst nach dem Aufruf von this() initialisiert werden, so dass ein Zugriff unsinnig wäre – die Werte wären im Allgemeinen 0.

Quelle

Soweit, so klar. Allerdings steht dann ein Kapitel darunter das aus dem Code

Source code

1
2
3
4
int foo = 3;
	public Test(String uselessString) 	{
		foo = 4;
	}

durch den Compiler folgendes stattfindet:

Source code

1
2
3
4
5
int foo;
	public Test(String uselessString) 	{
		foo = 3;
		foo = 4;
	}


Stellt sich mir natürlich die Frage, was bei dem ersten Konstruktor passiert:

Source code

1
2
3
4
5
6
7
8
9
	int foo = 3;

	public Test() {
		foo = 3; //Geht nicht, da Konstruktor als erstes ein Objekt erzeugen muss.
		             //Also: Vor this() darf kein anderer Code stehen
		this("useless");
		foo = 3; //Würde es hier stehen, düfte müsste das Ergebnis 3 sein und nicht vier.
		System.out.println(foo);
	}


Tjo, find ich halt ein wenig seltsam. Ist Java so schlau, dass er dort unterscheidet? Mich würden mal eure Gedanken dazu interessieren (:

Markus



Edit: "Ist Java so schlau, dass er dort unterscheidet?"
-Hm, habe gerade einen Vorschlag erhalten, der stimmig klingt, aber vlt. hat ja noch jemand eine andere Idee ^^
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

2

Sunday, May 20th 2007, 9:42pm

Quoted

Original von Markus an anderer Stelle
[...] Dann geht das nicht, da die an der Stelle des this()-Aufrufes noch nicht initialisiert sind. Das erste, was ein Konstruktor leisten muss, ist das Objekt erzeugen. Erst dann (nach dem this) werden die Variablen initialisiert. Folglich funktioniert auch der Aufruf von Objektvariablen nicht mit this()

Wäre das nicht sogar eine mögliche Antwort auf deine Frage? Dass die Instanzvariablen vor dem Aufruf von this() nicht initialisiert sind deutet ja darauf hin, dass die automatische Initialisierung vom Compiler am Anfang jedes Konstruktors eingefügt wird, der eben NICHT mit this() einen anderen aufruft.

Nur meine zwei Cent

Markus

the one and only Unterstrich!

  • "Markus" started this thread

Posts: 2,571

Date of registration: Oct 9th 2003

3

Sunday, May 20th 2007, 9:58pm

Hehe,
mit den eigenen Waffen geschlagen. Und gleich noch auf einen Fehler hingewiesen.

Quoted

Erst dann (nach dem this) werden die Variablen initialisiert.
Stimmt so wohl nicht.
Logischer (und scheinbar auch so gemacht) ist die Instanziierung der Objektvariablen nach dem super()-aufruf. Damit ist bei dem Beispiel auch wieder alles klar ;)
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

Lucky

Erfahrener Schreiberling

  • "Lucky" is male

Posts: 449

Date of registration: Oct 17th 2003

Location: Dresden

Occupation: Um ein bißchen mehr Ahnung zu haben als andere

4

Monday, May 21st 2007, 6:55pm

Davon abgesehen, dass in der main Methode die Variable t völlig unütz ist. Gereicht hätte auch "new Test();"

Aber das nur Off Topic ;)
no risk no fun, no brain no pain nor gain