2015-11-21 20 views
7

Ich bin gespannt, was passiert hinter den Kulissen, wenn Sie super() verwenden, um einen Konstruktor der Superklasse aufzurufen. Wenn ein Objekt von der Unterklasse instanziiert wird, übernimmt die Unterklasse das Superklassenobjekt? oder wie funktioniert es?Was passiert hinter den Kulissen, wenn Sie super() verwenden

Hier ist mein Code als Referenz:

public class Bicycle { 
//Declaring bicycles states 
public int movSpeed = 0; 
public int cadence = 0; 
public int curGear = 0; 

//Class constructor 
public Bicycle(){ 
} 

//Class constructor with params 
public Bicycle(int movSpeed, int cadence, int curGear) { 
    this.movSpeed = movSpeed; 
    this.cadence = cadence; 
    this.curGear = curGear; 
} 

Unterklasse:

public class mountainBike extends Bicycle { 
//Declare mountainBikes states 
public int frontTravel = 0; 
public int rearTravel = 0; 
public int gearMult = 0; 

//Class constructor 
public mountainBike(){ 
} 

//Class constructor with params 
public mountainBike(int movSpeed, int cadence, int curGear, int frontTravel, int rearTravel,int gearMult){ 
    super(movSpeed,cadence,curGear); 
    this.frontTravel = frontTravel; 
    this.rearTravel = rearTravel; 
    this.gearMult = gearMult; 
} 
+0

Technisch ist dein 'mountainBike' (bitte benutze [UpperCamelCase] ​​(https://en.wikipedia.org/wiki/CamelCase) für Klassen) ein' Bicycle', das 'super (args ...)' aufruft teilt Ihnen mit, dass ein bestimmter Konstruktor aufgerufen wird. Wenn Sie 'super()' nicht mit oder ohne Argumente aufrufen, wird der Standardkonstruktor aufgerufen. – Emz

+1

Ich nehme an, Sie sind ziemlich neu in Java, also möchte ich auch auf [primitive Standardwerte] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) hinweisen, da gibt es keine Grund, den Wert von "frontTravel", "retrTravel" usw. auf "0" zu setzen, da dies automatisch erfolgt. – Emz

+0

Überprüfen Sie _Head First Java_ als Referenz (9. Kapitel, ["Die Rolle von Superklassenkonstruktoren im Leben eines Objekts"] (http://tinyurl.com/usingSuper)). – Eugene

Antwort

5

Es gibt kein Super-Objekt und Unterklasse-Objekt. Es ist nur ein Objekt mit Feldern in der Unterklasse zusätzlich zu Feldern möglicherweise von der übergeordneten Klasse geerbt.

Wenn super aufgerufen wird, ruft die JVM den Konstruktor der übergeordneten Klasse auf, um die von der übergeordneten Klasse geerbten Felder zu initialisieren. Hinter den Kulissen wird der Konstruktor in eine JVM-Anweisung mit dem Namen übersetzt, die den Feldern Werte zuweist.

Sie also intuitiv kann man darüber nachdenkt, wie so etwas wie:

public mountainBike(int movSpeed, int cadence, int curGear, int frontTravel, int rearTravel,int gearMult) { 
    // an object is created here 
    // call the super constructor special method <init> 
    // which initializes the inherited fields movSpeed, cadence, and curGear 
    // initialize the below fields 
    this.frontTravel = frontTravel; 
    this.rearTravel = rearTravel; 
    this.gearMult = gearMult; 
} 
0

Danke für die Antworten! Ich möchte nur eine resource verlassen, die ich gefunden habe, erklärt das ziemlich gut für jeden, der diese Frage ansieht.

Wir haben gesehen, dass ein Objekt vom Datentyp der Klasse von ist, in dem es instanziiert wurde. Zum Beispiel, wenn wir schreiben

öffentliche MountainBike myBike = new MountainBike(); dann ist myBike von Typ MountainBike.

MountainBike stammt von Bicycle and Object ab. Daher ist ein MountainBike ein Fahrrad und ist auch ein Objekt, und es kann überall dort verwendet werden, wo Fahrrad oder Objekt Objekte aufgerufen werden.

Das Gegenteil ist nicht unbedingt wahr: ein Fahrrad kann ein MountainBike, sein, aber es ist nicht unbedingt. Ähnlich kann ein Objekt ein Fahrrad oder ein MountainBike sein, aber es ist nicht unbedingt.

Verwandte Themen