Why is it necessary to invoke a superclass constructor?
我目前正在学习Java中的继承,我理解它有很大的困难,但是我不能理解的一个主要原因是为什么在下面的例子中调用超类构造函数是必要的,它又有什么帮助呢?这个例子正好来自Oracle的
1 2 3 4 5 6 7 | public MountainBike(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } |
我最初的想法是,
1 2 3 | public MountainBike(int startHeight) { ... } |
然而,正如我已经知道的那样,这是错误的,再一次让我想到一个问题,那就是
型
因为
我模糊地记得,在Java中,如果您不给子构造函数中的父构造函数显式调用,则默认地调用父级的默认构造函数(即,不带参数)。在您的例子中,这还不够,因为或者没有默认的构造函数,或者您确实需要将给子构造函数的额外参数传递给父构造函数。
型
假设您的类
如果
1 2 3 4 5 | public Bike(int startCadence, int startSpeed, int startGear) { cadence = startCadence; speed = startSpeed; gear = startGear; } |
然后是
1 2 3 4 | public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } |
号
几乎等同于:
1 2 3 4 5 6 | public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) { super.cadence = startCadence; super.speed = startSpeed; super.gear = startGear; seatHeight = startHeight; } |
除前者外,我们称之为
切普纳的回答解释了为什么第二个版本会有问题的一些其他原因。但这个答案有助于解释对