2012-04-18 6 views
6

Так что я только что нашел этот пример кода в Интернете некоторое время назад, и я перехожу к нему снова, но довольно смущен.Java - Интерфейс, создающий интерфейс?

От взгляда на это я собираюсь (и это может быть неправильно) заключается в том, что он передает метод печати в классе NumberPrinter объект Printer. Однако интерфейс также называется принтером, так что мы не создаем анонимный класс интерфейса принтера, определяя методы и затем передавая его?

Мой основной вопрос в том, является ли мое первоначальное предположение правильным? И если так, я думал, что вы не можете создать интерфейс?

public class NumberPrinter { 

    public interface Printer { 
     public void print (int idx); 
    } 

    public static void print (Printer p) { 
     for (int i = 0; i < 4; i++) { 
      p.print(i); 
     } 
    } 

    public static void main(String[] args) { 
     print(new Printer() { 

      @Override 
      public void print(int idx) { 
       System.out.println(idx); 
      } 

     }); 
    } 

} 
+0

Это похоже, что это может быть дублирующий вопрос. Попробуй сюда http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – astidham2003

ответ

17

Это называется анонимный внутренний класс.

Он создает неименованный класс, который реализует интерфейс Printer.

+0

А, я думаю, я понял! – mino

3

Ваше предположение верно, и вы не можете создать экземпляр интерфейса. Однако вы можете создать экземпляр анонимного класса, что и делает код.

+0

Итак, вы можете создать анонимный внутренний класс интерфейса? – mino

+0

Да, это правильно. –

1

Вам нужен объект Printer для функции печати NumberPrinter. Когда вы вызываете эту функцию, вы фактически не создаете экземпляр интерфейса принтера, а создаете его реализацию, и именно поэтому он работает.

Ваше предположение было правильным, кстати.

+0

Итак, извините, я смущен, почему вы можете передать это анонимный внутренний класс? Это объект типа Printer? – mino

+0

Поскольку это анонимный внутренний класс, на него нет объекта, поэтому я не думаю, что здесь есть объект Printer. Новый вызов Printer() создает новый экземпляр этого класса и возвращает его в результате оператора. – Chris911

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