Как правильно сначала вызвать метод суперкласса при его переопределении?

#java #inheritance

#java #наследование

Вопрос:

 @Override
public JComponent createControlPanel() {
    super.createControlPanel();
    panel.add(new JLabel("Brain:"));
    brainMode = new JCheckBox("Brain active");
    panel.add(brainMode); 
}

public JComponent createControlPanel() {
    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
}
  

Здесь я пытаюсь переопределить метод createControlPanel() в суперклассе. У суперкласса есть переменная ‘panel’, которая уже была объявлена, но, похоже, ее здесь не видно. Что мне следует сделать, чтобы я мог использовать переменные, объявленные в суперклассе?

Комментарии:

1. Вы хотите сказать, что суперкласс объявляет метод как public JComponent createControlPanel(JPanel panel) ? Если это так, то ваш метод должен иметь тот же параметр, иначе это не переопределение , и вы просто передадите этот параметр в super вызове.

2. Нет, метод суперкласса public JComponent createControlPanel() . panel — это переменная, объявленная в суперклассе, которую я хотел бы использовать в своем подклассе. В основном это панель, к которой я хочу добавить дополнительные кнопки.

3. Поскольку мы не знаем суперкласса, вам трудно помочь. Является panel ли переменная поля или локальной переменной или какой-либо другой переменной? Если поле, является ли оно public , private , protected , или package-private ? Если private есть getPanel() метод? Какое JComponent возвращаемое значение? Судя по имени метода, я бы предположил, что это panel , и в этом случае вы просто присваиваете возвращаемое значение локальной переменной, используете его, а затем возвращаете его в конце, часть, которую вы пропускаете (возвращаете JComponent объект).

4. Я частично добавил (поскольку он очень длинный), как выглядит суперкласс

5. Извините, я отредактировал комментарий, добавив больше вопросов. В частности: каково возвращаемое значение? В обоих методах-заглушках отсутствует return оператор. Если у суперкласса есть return panel; , значит, он у вас уже есть, вы просто забыли захватить возвращаемое значение из super вызова.