2015-11-21 6 views
7

super()を使用してスーパークラスのコンストラクタを呼び出すと、実際に何が起こっているのか不思議です。オブジェクトがサブクラスからインスタンス化されるとき、サブクラスはスーパークラスオブジェクト内にありますか?またはそれはどのように機能しますか?super()を使用したときに何が起きているのですか

は、ここに参考のために私のコードです:

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

サブクラス:

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

技術的にはあなたの 'mountainBike'は'(... argsを) 'スーパーを呼び出し、' Bicycle'である([UpperCamelCase](https://en.wikipedia.org/wiki/CamelCase)クラスのために使用してください)特定のコンストラクターが呼び出されたことを伝えます。 argsの有無にかかわらず 'super()'を起動しないと、デフォルトのコンストラクタが呼び出されます。 – Emz

+1

私はあなたがJavaについてかなり新しいと思うので、[primitive default values](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)を指摘したいと思います。自動的に行われるように、 'frontTravel'、' rearTravel'などの値を '0'に設定する本当の理由です。 – Emz

+0

参照先として_Head First Java_を確認してください(第9章、「オブジェクトの生活におけるスーパークラスコンストラクタの役割」(http://tinyurl.com/usingSuper))。 – Eugene

答えて

5

一切スーパーオブジェクトとサブクラスオブジェクトはありません。 1つのオブジェクトサブクラスで宣言されたフィールドと、親クラスから継承される可能性のあるフィールドのフィールドです。

superが呼び出されると、JVMは親クラスのコンストラクタを呼び出して、親クラスから継承したフィールドを初期化します。その背後では、コンストラクタはフィールドに値を割り当てる<init>というJVM命令に変換されます。

ので、直感的に、あなたのようなものと考えることができます答えを

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

ありがとう!私はちょうどresource私はこの質問を見て誰のためにこれを非常によく説明して渡って残したいと思います。

私たちは、オブジェクトがインスタンス化された からクラスのデータ型であることを見てきました。たとえば、書き込む場合は

public MountainBike myBike = new MountainBike(); myBikeは タイプのMountainBikeです。

MountainBikeは自転車とオブジェクトの子孫です。したがって、 MountainBikeは自転車であり、オブジェクトでもあり、 は、BicycleオブジェクトまたはObjectオブジェクトが呼び出されたときに使用できます。

逆は必ずしも真ではありません。自転車はMountainBike、 でもかまいませんが、必ずしもそうではありません。同様に、Objectは自転車か MountainBikeでもかまいませんが、必ずしもそうではありません。

関連する問題