2011-01-03 7 views
61

Возможно ли создать экземпляр интерфейса в Java?Можно ли создать экземпляр интерфейса в Java?

Где-то я читал, что с помощью внутреннего анонимного класса, мы можем сделать это, как показано ниже:

interface Test 
{ 
    public void wish(); 
} 
class Main 
{ 
    public static void main(String[] args) 
    { 
     Test t=new Test() 
     { 
      public void wish() 
      { 
       System.out.println("output: hello how r u"); 
      } 
     }; 
    t.wish(); 
    } 
}  

cmd> javac Main.java 
cmd> java Main 
output: hello how r u 

Правильно ли здесь?

+0

Зачем вам это нужно? Цель интерфейсов состоит в том, чтобы пустые методы были расширены с помощью ваших собственных функций. – Ahmed

+6

@Ahmed: чтобы ускорить прототип реализации интерфейса? Или, может быть, реализовать обработчик событий, не создавая для этого именованный класс? И так далее ... – rsenna

+6

Это уже задано здесь: http://stackoverflow.com/questions/4000062/can-we-create-an-object-of-an-interface – jjnguy

ответ

37

Да, ваш пример верен. Анонимные классы могут реализовывать интерфейсы, и это единственный раз, когда я могу думать, что вы увидите класс, реализующий интерфейс без ключевого слова «реализует». Проверьте другой пример кода прямо здесь:

interface ProgrammerInterview { 
    public void read(); 
} 

class Website { 
    ProgrammerInterview p = new ProgrammerInterview() { 
     public void read() { 
      System.out.println("interface ProgrammerInterview class implementer"); 
     } 
    }; 
} 

Это прекрасно работает. Был взят с этой страницы:.

http://www.programmerinterview.com/index.php/java-questions/anonymous-class-interface/

+0

- это компиляция без ошибок, согласно моим знаниям интерфейсы не могут быть созданы, но в ответ вы можете сделать это через строку 'ProgrammerInterview p = new ProgrammerInterview() {' –

+1

в приведенном выше примере мы не создали экземпляр объекта ProgrammerInterview, но то, что мы сделали, мы использовали ProgrammerInterview для создания ссылки, а затем создали объект анонимного класса. Этот анонимный класс реализовал ProgrammerInterview и создал объект анонимного класса за один раз. –

+1

Но разве вы не называете 'new ProgrammerInterview() {...'? Так что технически вы делаете экземпляр интерфейса. Я все еще немного смущен тем, что здесь происходит. – CapturedTree

4

Короткий ответ ... да. Вы можете использовать анонимный класс при инициализации переменной. Взгляните на this

+0

Я бы сказал, нет ... Потому что анонимный реализует интерфейс ... Но у вас нет ключа для реализации –

80

Вы никогда не сможете создать интерфейс в java. Однако вы можете обратиться к объекту, который реализует интерфейс по типу интерфейса. Например,

public interface A 
{ 
} 
public class B implements A 
{ 
} 

public static void main(String[] args) 
{ 
    A test = new B(); 
    //A test = new A(); // wont compile 
} 

Что вы делали выше, это создать анонимный класс, который реализует интерфейс. Вы создаете анонимный объект, а не объект типа interface Test.

+8

У анонимных классов нет имен .... anonymous – jjnguy

+1

Его спросили, был ли его пример верным, и это так. Не уверен, что вы подтвердили, что ... – rsenna

+4

Пример работает ... но не так, как он думает. Его важно понять, что действительно делает код. Я бы не назвал это «правильным», если код был чем-то другим, чем он думает. –

0

Да, это правильно. вы можете сделать это с помощью внутреннего класса.

+0

Это кажется наиболее правильным из ответов, хотя объяснений нет. Для вас, программистов на Android, Google предоставляет пример класса **, создающего ** внутренний интерфейс [здесь] (https://developer.android.com/guide/topics/ui/dialogs.html#PassingEvents). –

4

Нормальный, вы можете создать ссылку для интерфейса. Но вы не можете создать экземпляр для интерфейса.

0

Да, мы можем, «классы Анонимные позволит вам сделать ваш код более кратким Они позволяют объявлять и создавать экземпляр класса, в то же время они, как локальные классы. кроме того, что у них нет имени »- >>Java Doc

3

Нет, на мой взгляд, вы можете создать ссылочную переменную интерфейса, но вы не можете создать экземпляр интерфейса, как абстрактный класс.

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