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
 

eRaaaa

Top Contributor
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.
 

hdi

Top Contributor
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...
 

eRaaaa

Top Contributor
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:

ModellbahnerTT

Bekanntes Mitglied
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:
 

hdi

Top Contributor
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:

musiKk

Top Contributor
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. ;)
 

hdi

Top Contributor
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.
 

hdi

Top Contributor
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Eigenener ClassLoader wirft java.lang.NoClassDefFoundError Allgemeine Java-Themen 0
D Classloader ohne Package Allgemeine Java-Themen 10
N Klasse via ClassLoader laden Allgemeine Java-Themen 2
D ClassLoader für Variablen einer Klasse setzen Allgemeine Java-Themen 24
K [Refactoring] ClassLoader Verzeichnis durchsuchen lassen Allgemeine Java-Themen 7
schlingel Webstart/Applet Problem - Classloader-Bug Allgemeine Java-Themen 7
M Security Manager für bestimmte Klassen/Classloader? Allgemeine Java-Themen 3
C inteface not visible from classloader Allgemeine Java-Themen 2
M jdbc treiber (h2) mit eigenem ClassLoader laden Allgemeine Java-Themen 4
B Eigener ClassLoader Allgemeine Java-Themen 9
MQue ClassLoader Pfad ausgeben Allgemeine Java-Themen 6
S Problem mit ClassLoader.getSystemResource !! Allgemeine Java-Themen 3
V Image laden - URL über ClassLoader ermitteln Allgemeine Java-Themen 2
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
E Wieder mal der Classloader Allgemeine Java-Themen 6
F ClassLoader und "Cache" Allgemeine Java-Themen 2
MQue ClassLoader Allgemeine Java-Themen 5
N ClassLoader - Laden von Bytecode aus einer Datenbank Allgemeine Java-Themen 6
P Klasse über eigenen Classloader laden: SecurityException Allgemeine Java-Themen 11
N Classpath mit ClassLoader künstlich erweitern Allgemeine Java-Themen 2
P System.getProperty zu Classloader Allgemeine Java-Themen 21
G Classloader Problem Allgemeine Java-Themen 10
M Bibliotheksname zur Laufzeit ermitteln (Classloader) Allgemeine Java-Themen 7
MQue ClassLoader Allgemeine Java-Themen 18
G Problem mit URL classloader Allgemeine Java-Themen 10
S classloader + jar + resourcen in dem jar Allgemeine Java-Themen 4
F mit classloader klassen ausserhalb *.jar einlesen Allgemeine Java-Themen 4
G Font mittels ClassLoader in .jar wirft NotFoundException Allgemeine Java-Themen 10
P Kompilerfehler: at java.lang.ClassLoader.loadClassInternal(U Allgemeine Java-Themen 16
T ClassLoader und Zugriff auf unbekannte Klassen Allgemeine Java-Themen 5
C ClassLoader - dymisches Laden von JDBC Drivers Allgemeine Java-Themen 3
R Problem mit Classloader Allgemeine Java-Themen 2
D Programm mit eigenem ClassLoader funktioniert nicht Allgemeine Java-Themen 12
K Problem mit ClassLoader - Laden von Resourcen aus Jar's Allgemeine Java-Themen 14
C Problem mit ClassLoader Allgemeine Java-Themen 2
T Brauche Hilfe bei ClassLoader Allgemeine Java-Themen 2
G cachender ClassLoader u.v.m. Allgemeine Java-Themen 5
G ClassLoader Allgemeine Java-Themen 3
R ClassLoader funktioniert in Verbindung mit JAR-Datei nicht Allgemeine Java-Themen 8
Maxi-JOO Klassen Dummy Objekt in anderen Constructor übergeben Allgemeine Java-Themen 5
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
ReinerCoder Eclipse Fehlermeldung - The constructor Double(double) is deprecated Allgemeine Java-Themen 8
P Default constructor cannot handle exception type Allgemeine Java-Themen 6
M Constructor Problem Allgemeine Java-Themen 8
Kr0e Reflection - Instanz einer Klasse erstellen, ohne Default-Constructor Allgemeine Java-Themen 15
A Listener für constructor einer bestimmen Klasse Allgemeine Java-Themen 9
X Copy Constructor in Java ? Allgemeine Java-Themen 7
P Copy-Constructor aufrufen - Wie ??? Allgemeine Java-Themen 3
E Wie Constructor mit Parametern benutzen (getConstructor) Allgemeine Java-Themen 2
G JAXB "no default constructor" Allgemeine Java-Themen 2
P sql.Date -> the constructor Date() is undefined! Allgemeine Java-Themen 3
V Vererbungsproblem --> Implicit super constructor Allgemeine Java-Themen 5
T Exception im Constructor -> null-Referenz zurückgeben Allgemeine Java-Themen 6
A Java Call-Hierarchie Allgemeine Java-Themen 2
M Java - Call by value <-> Call by reference Allgemeine Java-Themen 16
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
E wie call by reference mit Wrapper-Klassen? Allgemeine Java-Themen 2
K Als Rückgabewert ode call by referenz was ist sauberer? Allgemeine Java-Themen 12
J InvocationException im Thread (innerhalb von call() einer Callable Klasse) Allgemeine Java-Themen 2
S Performance und Function Call Depth Allgemeine Java-Themen 6
MQue call by value Allgemeine Java-Themen 5
P call by value/referenz Allgemeine Java-Themen 4
N Sieht aus wie ein "Call by Referece/Call by Value" Allgemeine Java-Themen 7
S Active-X Call / Invoke?` Allgemeine Java-Themen 7
S Call by Value Allgemeine Java-Themen 9
sliwalker Call by Reference - Was stimmt denn nun ? Allgemeine Java-Themen 14
H Aus der FAQ: Call by Value <-> Call by Reference Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben