classFahrzeug{publicFahrzeug(){
IO.writeln("Fahrzeug erzeugt");}publicvoidfahre(){
IO.writeln("Auto fährt");}}classAutoextendsFahrzeug{publicAuto(){
IO.writeln("Auto erzeugt");}publicvoidfahre(){
IO.writeln("Auto fährt");}}classTest{publicstaticvoidtesten(Fahrzeug fg){
fg.fahre();}publicstaticvoidmain(String[] args){Fahrzeug f =newAuto();testen(f);
f =null;}}
Meine Frage:
Ich habe den Code in Java so eingegeben und kann die Ausgabe nicht nachvollziehen:
Fahrzeug erzeugt
Auto erzeugt
Auto fährt
Müsste dem Code nach nicht eigentlich nur "Auto fährt" ausgegeben werden? Es wird doch
in der Test Klasse nur fg.fahre aufgerufen und sonst nichts anderes?
Danke für die Antwort! Aber es wird doch die Methode fahre() angesprochen, warum werden dann die anderen Zeilen mit ausgegeben? Habs beim Debugger auch nicht nachvollziehen können.
falsch !!
Mit "new Auto()" wird auch der Konstruktor "public Auto()" angesprochen !!
Und wie gesagt, vermutlich implizit durch Deine Deklaration auch der Konstruktor der Elternklasse "public Fahrzeug" !!
Nicht nur vermutlich, bevor der aufgerufene Konstruktor seinen Code ausführt werden noch alle Konstruktoren der Superklassen ausgeführt (sofern welche vorhanden sind usw.)
Jep, das wird es sein, dass bei einem parameterlosen Konstruktor automatisch der parameterlose Konstruktor der Superklasse aufgerufen wird, sofern ein solcher vorhanden ist.
Die JLS behandelt diesen Punkt leider etwas verwirrend: https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8
Kapitel 8.8.7. Das was mich verwirrt ist fett markiert. vermutlich wollen sie sagen, dass das automatische aufrufen des parameterlosen Konstruktors der Superklasse NICHT erfolgt, wenn die aktuelle Klasse die Klasse Object ist. is ja auch logisch, denn die hat ja keine Superklasse.
"If a constructor body does not begin with an explicit constructor invocation and the constructor being declared is not part of the primordial class Object, then the constructor body implicitly begins with a superclass constructor invocation "super();", an invocation of the constructor of its direct superclass that takes no arguments"
Jep, das wird es sein, dass bei einem parameterlosen Konstruktor automatisch der parameterlose Konstruktor der Superklasse aufgerufen wird, sofern ein solcher vorhanden ist.
Achtung: es ist egal ob der eigene Konstruktor parameterlos ist oder nicht! Habe ich eine Superklasse wird trotzdem deren Default Konstruktor (parameterloser Konstruktor) aufgerufen. Die Einzige Ausnahme ist wenn ich einen bestimmten Konstruktor der Superklasse aufrufe!
Vielen Dank für die zahlreichen Antworten! Ein paar Fragen hätte ich noch:
Werden im Body des Konstruktors somit alle system.out.println bzw. IO.writeln Zeilen automatisch ausgegeben?
Das Coding war gegeben. Hat das "f = null" am Ende eine Bedeutung? Denn der Compiler hat beim auskommentieren nichts gesagt.
Und schlussendlich: Wie kann man Coding formtieren, sodass es wie beim ersten Beitrag als solches hervorsteht? In der Menüleiste hab ich nichts dazu gefunden (Das hat übrigens ein Moderator eingefügt )
Nein diese Zeile macht nichts besonderes, sie entfernt die Referenz von der Variable "f". Da dass Programm nach dieser Zeile eh endet hat es keine Auswirkungen auf die Ausführung.
Bei umfangreicheren Programmen kann so eine Zeile aber schon mal Sinn machen und große Auswirkungen haben ... aber das wirst du dann schon sehen.
Und schlussendlich: Wie kann man Coding formtieren, sodass es wie beim ersten Beitrag als solches hervorsteht? In der Menüleiste hab ich nichts dazu gefunden (Das hat übrigens ein Moderator eingefügt )
Mit "new Auto()" wird auch der Konstruktor "public Auto()" angesprochen !!
Und wie gesagt, vermutlich implizit durch Deine Deklaration auch der Konstruktor der Elternklasse "public Fahrzeug" !!
Nur noch mal zur Verdeutlichung, weil das vielleicht etwas mißverständlich formuliert war: Der Konstruktor von Fahrzeug würde auch aufgerufen werden, wenn die Deklaration von f nicht so:
Java:
Fahrzeug f =newAuto();
sondern so:
Java:
Auto f =newAuto();
aussehen würde. Entscheidend ist, dass die Klasse Auto die Klasse Fahrzeug erweitert.