Конструкторы во Внутренних классах (реализующий Интерфейсы)

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

JButton b = new JButton(new AbstractAction() {

    public AbstractAction() {
        super("This is a button");                        
    }


    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}); 

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

21
задан HoLyVieR 3 December 2011 в 03:10
поделиться

3 ответа

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

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");
    }
}); 
35
ответ дан 29 November 2019 в 20:06
поделиться

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

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

4
ответ дан 29 November 2019 в 20:06
поделиться

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

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());
9
ответ дан 29 November 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: