2010-06-15 2 views
21

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

JButton b = new JButton(new AbstractAction() { 

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


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

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

+6

Когда вы достигнете предела того, что могут сделать анонимные внутренние классы, тогда это сильный намек на то, что вместо этого вы должны написать обычный внутренний класс. –

ответ

35

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

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

отвечает на мой вопрос отлично, спасибо! – thepandaatemyface

4

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

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

9

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

JButton b = new JButton(new AbstractAction() { 

    { 
     // Do whatever initialisation you want here. 
    } 

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

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

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

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

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

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