2015-11-21 60 views
7

Sono curioso di sapere cosa succede realmente dietro le quinte quando usi super() per chiamare un costruttore della super classe. Quando un oggetto viene istanziato dalla sottoclasse, la sub-classe eredita l'oggetto super-classe? O come funziona?Cosa succede dietro le quinte quando usi super()

Ecco il mio codice di riferimento:

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; 
} 

sottoclasse:

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

Tecnicamente il tuo 'mountainBike' (si prega di usare [UpperCamelCase] ​​(https://en.wikipedia.org/wiki/CamelCase) per le classi) è un' Bicycle', invocando 'super (args ...)' ti dice che è stato invocato un costruttore specifico. Se non invochi 'super()' con o senza argomenti verrà chiamato il costruttore predefinito. – Emz

+1

Presumo che tu sia abbastanza nuovo in Java, quindi vorrei anche sottolineare [valori predefiniti primitivi] (https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html), non c'è vera ragione per impostare il valore di 'frontTravel',' rearTravel' ecc. a '0', poiché ciò avviene automaticamente. – Emz

+0

Controllare _Head Primo Java_ come riferimento (9 ° capitolo, ["Il ruolo dei costruttori della superclasse nella vita di un oggetto"] (http://tinyurl.com/usingSuper)). – Eugene

risposta

5

Non v'è alcun oggetto oggetto e sottoclasse eccellente. È solo un oggetto con campi dichiarati nella sottoclasse oltre ai campi ereditati dalla classe padre.

Quando viene invocato il numero super, la JVM richiama il costruttore della classe padre per inizializzare i campi ereditati dalla classe padre. Dietro le quinte il costruttore si traduce in un'istruzione JVM chiamata <init> che assegna valori ai campi.

Così intuitivamente si si può pensare ad esso come qualcosa di simile:

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

Grazie per le risposte! Voglio solo lasciare un resource mi sono imbattuto in questo che spiega questo abbastanza bene per tutti coloro che visualizzano questa domanda.

Abbiamo visto che un oggetto è del tipo di dati della classe da che è stato istanziato. Ad esempio, se scriviamo

public MountainBike myBike = new MountainBike(); allora myBike è del tipo MountainBike.

MountainBike discende da biciclette e oggetti. Pertanto, un MountainBike è una bicicletta ed è anche un oggetto e può essere utilizzato ovunque siano richiesti oggetti bicicletta o oggetto.

Il contrario non è necessariamente vero: una bicicletta può essere un MountainBike, ma non è necessariamente. Allo stesso modo, un oggetto può essere una bicicletta o un MountainBike , ma non è necessariamente.