Как я пошел бы о записи конструктора для внутреннего класса, который реализует интерфейс? Я знаю, что мог сделать совершенно новый класс, но я фигурирую, там получен, чтобы быть способом сделать что-то вдоль строки этого:
JButton b = new JButton(new AbstractAction() {
public AbstractAction() {
super("This is a button");
}
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
});
Когда я ввожу это, это не распознает метод AbstractAction как конструктора (компилятор просит тип возврата). У кого-либо есть идея?
Просто вставьте параметры после имени расширенного класса:
JButton b = new JButton(new AbstractAction("This is a button") {
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
});
Также вы можете использовать блок инициализации:
JButton b = new JButton(new AbstractAction() {
{
// Write initialization code here (as if it is inside a no-arg constructor)
setLabel("This is a button")
}
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
});
Результирующий класс имеет не тип AbstractAction
, а некоторый (безымянный, анонимный) тип, который расширяет / реализует AbstractAction
. Следовательно, конструктору для этого анонимного класса потребуется это «неизвестное» имя, но не AbstractAction
.
Это похоже на обычное расширение / реализацию: если вы определяете класс House extends Building
и строите House
, вы называете конструктор House
, а не Building
(или AbstractAction
, просто чтобы вернуться к исходному вопросу).
Если вам действительно нужен конструкт по какой-либо причине, то вы можете использовать блок инициализации:
JButton b = new JButton(new AbstractAction() {
{
// Do whatever initialisation you want here.
}
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
});
Но вы не можете вызвать оттуда конструктор суперкласса. Однако, как сказал Itay, вы можете просто передать нужный вам аргумент в вызове new.
Лично я бы создал новый внутренний класс для этого:
private class MyAction extends AbstractAction {
public MyAction() {
super("This is a button.");
}
public void actionPerformed(ActionEvent e) {
System.out.println("button clicked");
}
}
тогда:
JButton b = new JButton(new MyAction());