ClassLoader / Constructor Call intern

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
Hallo, folgende Aufgabe beschäftigt mich gerade, und ich könnte das Ergebnis zwar einfach so hinnehmen, aber 1) will ich es verstehen und 2) kann ich es mir nur merken, wen es für mich auch Sinn ergibt.

Hier die Aufgabe:

Java:
public class InheritanceInvokation {

	
	public static void main(String[] args) {
		new Bottom();
	}
}

class Top {
	{
		System.out.println("A");
	}

	public Top() {
		System.out.println("B");
	}
}

class Middle extends Top {
	{
		System.out.println("D");
	}

	public Middle() {
		System.out.println("E");
	}
}

class Bottom extends Middle {
	{
		System.out.println("G");
	}

	public Bottom() {
		System.out.println("H");
	}
}

Die Ausgabe ist:


Was ich nicht verstehe ist folgendes: Ich finde es durchaus logisch dass erstmal eine Superklasse geladen werden muss, bevor eine davon abgeleitete Klasse geladen wird. Aber wie kommt es, dass sogar der Konstruktor der Superklasse zuerst aufgerufen wird?
Eigentlich wird doch der Konstruktor von Top erst im Konstruktor von Middle - durch ein implizites super() - aufgerufen? Aber zu dem Zeitpuntk hätte doch die Klasse Middle geladen sein müssen, sprich ihr static-block ausgeführt werden müssen..

Also die Ausgabe, die ich erwartet hätte wäre diese:

Kann mir einer erklären welche Logik da dahinter steckt? Von wem oder was wird wie durch Geisterhand der Konstruktor von Top aufgerufen, wenn ich ein Bottom()-Objekt erzeuge, und die Klassen Bottom und Middle noch nicht mal geladen sind ???:L
 
Aber wie kommt es, dass sogar der Konstruktor der Superklasse zuerst aufgerufen wird?
Eigentlich wird doch der Konstruktor von Top erst im Konstruktor von Middle - durch ein implizites super() - aufgerufen?

super(); wird immer aufgerufen, weil der compiler das explizit einfügt für dich.
 
Sag ich doch: in jedem Konstruktor steht implizit als erste Zeile ein super(). D.h. im Konstruktor der Klasse Middle wird erstmal der Konstruktor der Klasse Top aufgerufen. Aber hier wird der Top-Konstruktor ja aufgerufen, bevor überhaupt die Klasse Middle geladen wurde. Also von wem wird der aufgerufen? Bekanntlich wird ja nicht beim Laden einer Klasse automatisch ein Konstruktor davon aufgerufen.

edit: Mein Post bezog sich auf eRaaa's Post, ich werd mir den Link zu Classes mal ansehen, danke

PS:
ich hoff doch du hast nicht vor das selbst zu bezahlen?
Naja ich könnte bei meiner Arbeit fragen. Aber dort mache ich nix mit Java, also wieso sollten die das zahlen...
 
ja, aber ich versteh dann nicht was du nicht verstehst 🙂
bottom ruft middle auf/middle-konstruktor (dort steht ja eig. auch ein super()😉, der ruft halt auch wieder top/top-konstruktor auf ??!

/edit:
es wird doch quasi zu sowas, oder
Java:
.....
class Middle extends Top {
	{
		System.out.println("D");
	}

	public Middle() {
		super(); //top
		System.out.println("E");
	}
}

class Bottom extends Middle {
	{
		System.out.println("G");
	}

	public Bottom() {
		super(); //middle
		System.out.println("H");
	}
}
 
Zuletzt bearbeitet:
Was liest du denn da so lang, wichtig ist doch eh nur der allererste Satz:
"An instance initializer declared in a class is executed when an instance of the class is created (§15.9), as specified in §8.8.5.1."
ja, was mich wundert ist dass die konstruktoren von bottom/middle vor ihrem static Block auferufen werden. Bei der Top-Klasse ist das ja auch nicht so... Aber.. ich war grad am Lesen noch 😉
Was für ein static Block :bahnhof:
 
Ja okay also mal sehen ob ich das jetzt zusammenhab:

1) grober Fehler war dass ich an static Blocks dachte. Ist mir bisher gar nicht aufgefallen, dass es instance-Blocks gibt. Was ist denn der Unterschied zwischen einem instance-Block und dem Konstruktor??

2) ein instance-block wird immer direkt nach dem super() des Konstruktors aufgerufen, aber niemals davor. Also:

Java:
public Constructor(){
   super(); // vllt implizit
   // hier jetzt der instance block
   // hier der Rest, der hier steht
}

Ist das richtig?

Uf, teures Klopapier würd ich sagen
Ich tu mich meist sehr schwer mit solchen Methaphern. Was meinst du?
edit: Dass das SCJP ein Haufen Sch*** ist?? ???:L
 
Zuletzt bearbeitet:
1) grober Fehler war dass ich an static Blocks dachte. Ist mir bisher gar nicht aufgefallen, dass es instance-Blocks gibt. Was ist denn der Unterschied zwischen einem instance-Block und dem Konstruktor??

Initializing Fields (The Java™ Tutorials > Learning the Java Language > Classes and Objects)
Insbesondere: The Java compiler copies initializer blocks into every constructor.

Ich tu mich meist sehr schwer mit solchen Methaphern. Was meinst du?
edit: Dass das SCJP ein Haufen Sch*** ist?? ???:L

Davon gehe ich mal stark aus. 😉
 
Davon gehe ich mal stark aus.
Also dass die Prüfung zum größten Teil Schrott ist, ist schon klar. Man kann auch der absolute Java-Experte sein und seit 15 Jahren gute Applikationen schreiben, aber würde denke ich wohl trotzdem durchfallen, wenn man sich nicht auf diese Prüfung vorbereitet hat. Ist halt zum allergrößten Teil praxisfremd.
Trotzdem denke ich ist es n kleiner Bonus für Bewerbung und die Gehaltsverhandlung. Immerhin haben die Chefs keine Ahnung davon, und die glauben Sun dann schon, wenn die sagen dass ich ein zertifizierter Programmierer bin. Ist einfach nice to have, zumindest für den Einstieg ins Berufsleben denke ich, wenn man sonst keine Referenzen hat. Daher möchte ich das Teil halt in der Tasche haben wenn ich mit dem Studium fertig bin.
 
The Java compiler copies initializer blocks into every constructor.
Gut, da steht jetzt aber nich direkt, wo das hinkopiert wird. Ist meine Annahme richtig, dass es an den Anfang des Konstruktors, aber erst nach dem super-Aufruf reinkopiert wird? Es sieht so aus, aber ich möchte sicherstellen dass es wirklich immer so ist, und nicht nur in diesem Bsp.

Therefore, this approach can be used to share a block of code between multiple constructors.
Ahhh.. coole Sache, hätte ich schon das ein oder andere mal verwenden können. Man kann dann doch nicht immer alle Konstruktoren zu einem einzigen mittels this()-Aufrufen zurückführen, und dann ist sowas natürlich nice 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben