Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

super-Aufruf in Java
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> super-Aufruf in Java
 
Autor Nachricht
colorblind
Newbie
Benutzer-Profile anzeigen
Newbie


Anmeldungsdatum: 30.06.2012
Beiträge: 11

BeitragVerfasst am: 03 Apr 2013 - 19:06:26    Titel: super-Aufruf in Java

folgendes Beispiel:

Code:

public class Fahrzeug{
}

public class Auto extends Fahrzeug{
}

public class Kleinwagen extends Auto{
}


public class Test{
   public static void main(String[] args){
      Kleinwagen kw = new Kleinwagen();
   }
}


Den Standardkonstruktor habe ich jeweils nicht angegeben, weil ich es nicht muss.
Implizit wird in einem Standardkonstruktor einer Unterklasse die Methode super() aufgerufen, so wie ich es verstanden habe.

Meine Vermutung: Es wird beim Aufruf von "new Kleinwagen()" dreimal super() aufgerufen.
-> super() wird im Konstruktor von Kleinwagen aufgerufen, also der Konstruktor von Auto.
-> dort wird super() aufgerufen, also der Konstruktor von Fahrzeug
-> dort wird super() aufgerufen, also der Konstruktor von Object

Meine Fragen:
1) Stimmt das so, wie ich das vermute?
2) Falls es stimmt, würde das bedeuten, dass mit der Erzeugung eines Kleinwagen-Objektes auch noch drei weitere Objekte erzeugt werden?
(Das wäre doch ganz schön viel Speicherplatz?)
maze77
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2012
Beiträge: 160

BeitragVerfasst am: 03 Apr 2013 - 19:52:08    Titel:

Natürlich enthält dein Kleinwagen-Objekt ein Auto-Objekt, und dieses wiederum ein Fahrzeug-Objekt.

Angenommen, ein Fahrzeug hat eine Membervariable für Höchstgeschwindigkeit. Und ein Auto eine, die angibt, wieviele Türen es gibt.

Wo genau soll deiner Meinung nach denn die Höchstgewindigkeit
deines Kleinwagens abgelegt sein? Und wo ist gespeichert, wieviele Türen dein Kleinwagen hat?
quatsch
Moderator
Benutzer-Profile anzeigen
Moderator


Anmeldungsdatum: 31.08.2005
Beiträge: 3493

BeitragVerfasst am: 06 Apr 2013 - 20:07:18    Titel:

Moment, es wird nur genau ein Objekt erzeugt. Dieses Objekt enthält die Felder/Attribute aller Klassen (man beachte den Unterschied Klasse/Objekt) aus der Vererbungshierarchie. Von "enthalten" würde ich hier nicht sprechen, denn das klingt wie eine "Ist-Enthalten-Beziehtung", die wir hier nicht haben (die hätten, wir wenn Kleinwegen ein Attribut vom Typ Auto hätte, dann "enthielte" Kleinwagen ein Auto), hier haben wir es mit einer "ist-ein-Beziehung", vulgo Vererbung zu tun.
Die Vermutung, dass implizite super()-Aufrufe bis hoch zu Object erfolgen ist richtig. Das heißt aber nicht, dass mehrere Objekte erzeugt werden. Es wird nur mehrmals initialisierungs-Code ausgeführt.
maze77
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2012
Beiträge: 160

BeitragVerfasst am: 09 Apr 2013 - 05:57:58    Titel:

Dann lies mal bitte den ersten Absatz des folgenden Artikels:

http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ308_002.htm

Ich bin zugegebenermassen kein Java-Spezialist, aber ein langjähriger C++ Entwickler. Und in C++ ist es so; wieso sollte es in Java total anders sein?
quatsch
Moderator
Benutzer-Profile anzeigen
Moderator


Anmeldungsdatum: 31.08.2005
Beiträge: 3493

BeitragVerfasst am: 09 Apr 2013 - 19:23:40    Titel:

Hm, was heißt denn Objekterzeugung? Doch eigentlich Speicherreservierung. Und diese geschieht in Java genau einmal. Im Speicher ist natürlich Platz für alle Felder aus der gesamten Vererbungshierarchie vorgesehen, insofern "enthält" das subobjekt quasi eine Instanz des Superobjekts, weil es alle Felder des Superobjekts enhtält. Ich halte es aber für unglücklich, hier von "enthält Objekt" zu sprechen. Dein Link überzeugt mich nicht recht, denn er unterscheidet nicht klar zwischen Objekterzeugung und Konstruktorausführung. Für den Java-Programmierer ist das natürlich das gleiche, aber intern ist es was anderes: Im Falle eines new X(...) Aufrufes wird genau einmal Speicher alloziert, es wird aber die Konstruktorkette bis hoch zu Object durchlaufen, um die Initialisierung hinzukriegen.
Letztlich müssten wir wohl den Quellcode der Java-VM studieren, um es sicher beantworten zu können. Dazu habe ich jetzt ehrlich gesagt keine Lust...

Btw, hier: http://www.artima.com/designtechniques/initialization6.html wird meine Sicht gestützt.
maze77
Full Member
Benutzer-Profile anzeigen
Full Member


Anmeldungsdatum: 28.09.2012
Beiträge: 160

BeitragVerfasst am: 10 Apr 2013 - 17:28:58    Titel:

Darüber, wie oft Speicher reserviert wird, hatte ich keine Aussage gemacht.
Auch über die Konstruktorausführung hatte ich keine Aussage gemacht.

Ich sagte, das Kleinwagenobjekt enthält ein Wagenobjekt und ein Fahrzeugobjekt.

Für jedes dieser Objekte existiert jeweils ein Zustand und ein Verhalten.
Es ist auch möglich, jederzeit via Cast einen Zeiger auf jedes dieser Objekte zu erhalten.
Wieso also sollten sie keine Objekte sein?

Du sagst, Objekterstellung=Speicherplatzreservierung, und es werde Platz für alle Variablen aller Objekte reserviert.
Das ist doch gleichbedeutend mit der Aussage, dass mehrere Objekte erzeugt werden.
Manicopus
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 09.09.2019
Beiträge: 64

BeitragVerfasst am: 13 Sep 2019 - 19:04:48    Titel:

Nun, es ist unwahrscheinlich, dass es irgendwo kostenlos herauskommt, aber ich weiß, wo Sie einen Online-Shop sehr billig erstellen können. Ich habe es selbst erstellt - https://de.supr.com/start/
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> super-Aufruf in Java
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum