当你使用super()时幕后发生了什么

时间:2015-11-21 12:18:10

标签: java oop inheritance subclass superclass

当我使用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;
}

2 个答案:

答案 0 :(得分:5)

没有超级对象和子类对象。它只是 一个对象 ,除了可能从父类继承的字段外,还在子类中声明了字段。

当调用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;
}

答案 1 :(得分:0)

感谢您的回答!我只想留下resource我遇到的问题,这对于查看此问题的人来说非常好。

  

我们已经看到一个对象属于该类的数据类型   它被实例化了。例如,如果我们写

     公共MountainBike myBike = new MountainBike();那么myBike就是   键入MountainBike。

     

MountainBike是Bicycle和Object的后裔。因此,一个   MountainBike是一个自行车,也是一个对象,它可以使用   无论在哪里调用Bicycle或Object对象。

     

反过来不一定如此:自行车可能是MountainBike,   但这不一定。类似地,对象可以是自行车或   MountainBike,但不一定。