2013-11-11 4 views
0

В настоящее время я изучаю наследование на Java, и у меня возникают проблемы с его пониманием, однако одна из основных вещей, которые я не могу понять, - это почему необходимо вызвать конструктор суперкласса в следующем примере и как это сделать ? Этот пример является правильным из учебника Oracle по методу super(...).Зачем нужно вызывать конструктор суперкласса?

public MountainBike(int startHeight, 
       int startCadence, 
       int startSpeed, 
       int startGear) { 
    super(startCadence, startSpeed, startGear); 
    seatHeight = startHeight; 
} 

То, что я думал изначально, что super(startCadence, startSpeed, startGear); бы сократить код для параметров в моем текущем конструкторе и было бы просто принимать значения, которые были переданы в в родительском классе и добавить его к классу ребенка (например, это):

public MountainBike(int startHeight) { 
... 
} 

однако, как я уже знаю, что это неправильно, и в очередной раз подводит меня к вопросу о том, что super(startCadence, startSpeed, startGear); действительно делает. Я был бы очень признателен за некоторые объяснения, поэтому новичок, как и я, мог бы понять, а не дать мне определение.

+0

Не похоже на дубликат для меня – Cruncher

ответ

1

Предположим, что ваш класс, MountainBike наследует от Bike. Слово super является ссылкой на родительский класс класса.

Если Bike имеет конструктор, который выглядит следующим образом:

public Bike(int startCadence, int startSpeed, int startGear) { 
    cadence = startCadence; 
    speed = startSpeed; 
    gear = startGear; 
} 

Затем MountainBike конструктор, который выглядит следующим образом:

public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) { 
    super(startCadence, startSpeed, startGear); 
    seatHeight = startHeight; 
} 

почти эквивалентно следующему:

public MountainBike(int startCadence, int startSpeed, int startGear, int startHeight) { 
    super.cadence = startCadence; 
    super.speed = startSpeed; 
    super.gear = startGear; 
    seatHeight = startHeight; 
} 

Кроме первого, где мы называем super конструктор лучше. Во-первых, он избегает дублирования кода. Для двоих он сохраняет две строки. Для трех, если мне нужно включить некоторую логику проверки на speed, например, я могу просто включить ее в конструктор Bike и не нужно дублировать этот код в конструкторе MountainBike.

Ответ chepner объясняет некоторые другие причины, по которым вторая версия может быть проблематичной. Но этот ответ, надеюсь, поможет объяснить, что делает вызов конструктора super.

4

Потому что MountainBike является дочерним по отношению к нему (некоторый класс) Bike, его следует использовать в любом контексте, для которого требуется объект Bike. Если вы не вызываете конструктор родительского класса в дочернем, то нет никакой гарантии, что дочерний объект будет инициализирован правильно, чтобы действовать как экземпляр родительского класса.

Я смутно помню, что в Java, если вы не даете явный вызов конструктору родителя в конструкторе дочернего элемента, конструктор по умолчанию для родителя (т. Е. Без аргументов) называется неявным. В вашем случае этого недостаточно, потому что либо нет конструктора по умолчанию, либо вам действительно нужно передать дополнительные аргументы, заданные конструктору дочернего элемента, в конструктор родителя.

Смежные вопросы