Конструкторы во внутренних classах (реализация интерфейсов)

Как я могу написать конструктор для внутреннего classа, который реализует интерфейс? Я знаю, что могу создать совершенно новый class, но я полагаю, что есть способ сделать что-то по этому поводу:

JButton b = new JButton(new AbstractAction() { public AbstractAction() { super("This is a button"); } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } }); 

Когда я вхожу в это, он не распознает метод AbstractAction как конструктор (компилятор запрашивает тип возврата). У кого-нибудь есть идея?

Просто вставьте параметры после имени расширенного classа:

 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"); } }); 

Если вам действительно нужен конструктор по какой-либо причине, вы можете использовать блок инициализации:

 JButton b = new JButton(new AbstractAction() { { // Do whatever initialisation you want here. } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } }); 

Но вы не можете назвать конструктор суперclassа оттуда. Как сказал Итай, вы можете просто передать аргумент, который вы хотите, в призыв к новому.

Лично, однако, я бы создал для этого новый внутренний class:

 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()); 

Получаемый class не относится к типу AbstractAction но некоторого (неназванного, анонимного) типа, который расширяет / реализует AbstractAction . Поэтому для конструктора для этого анонимного classа должно быть это «неизвестное» имя, но не AbstractAction .

Это похоже на нормальное расширение / реализацию: если вы определяете class House extends Building и строите House вы называете House а не Building (или AbstractAction чтобы вернуться к исходному вопросу).

Причина, по которой компилятор жалуется, заключается в том, что вы пытаетесь объявить конструктор внутри вашего анонимного classа, что запрещено для анонимных classов. Как и другие, вы можете решить это, используя инициализатор экземпляра или преобразовать его в неанонимный class, чтобы вы могли написать для него конструктор.