|
Autor |
Nachricht |
colorblind Newbie


Anmeldungsdatum: 30.06.2012 Beiträge: 11
|
Verfasst 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


Anmeldungsdatum: 28.09.2012 Beiträge: 160
|
Verfasst 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


Anmeldungsdatum: 31.08.2005 Beiträge: 3493
|
Verfasst 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


Anmeldungsdatum: 28.09.2012 Beiträge: 160
|
|
 |
quatsch Moderator


Anmeldungsdatum: 31.08.2005 Beiträge: 3493
|
Verfasst 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


Anmeldungsdatum: 28.09.2012 Beiträge: 160
|
Verfasst 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


Anmeldungsdatum: 09.09.2019 Beiträge: 64
|
Verfasst 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/ |
|
 |
|