переменная типа интерфейса - PullRequest
10 голосов
/ 07 декабря 2011

Я изучаю Java, я видел следующее описание относительно интерфейса в книге:

Когда объявлена ​​переменная типа интерфейса, она просто означает, что объект должен реализовать этот интерфейс.

Что это значит? Если я определю интерфейс :

public interface Myinterface{

   void method_one(); 
   int method_two();
}

Затем я объявляю переменную типа интерфейса, например:

Myinterface foo = new Myinterface();
  • Как реализован интерфейс ??
  • При каких обстоятельствах я должен определять переменную типа интерфейса?

Я полностью запутался в описании книги ...

Ответы [ 3 ]

17 голосов
/ 07 декабря 2011

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

MyInterface foo = new MyInterface(); // Compile-time error.

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

public class MyClass implements MyInterface {
  // ...

  @Override
  void method_one() {
    // ...
  }
  @Override
  int method_two() {
    // ...
  }
}

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

MyInterface foo = new MyClass();

Если у вас был другой класс, реализующий MyInterface

class MyClass2 implements MyInterface {
  // ...
}

вы также можете подставить ссылку на экземпляр этого класса в вашей переменной:

MyInterface foo = new MyClass2();

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

Очень хорошая практика программирования - создавать классы для реализации интерфейсов и использовать их для ссылки на экземпляры этих классов. Эта практика обеспечивает большую гибкость и повторное использование.

Следовательно, вы должны использовать аргументы и переменные типа интерфейса всякий раз, когда возможно, что различные реализации могут быть переданы в реализуемый вами метод. Например, если вы работаете с экземпляром HashSet<T>, вы должны использовать переменную типа Set<T> для ссылки на него (класс HashSet<T> реализует интерфейс Set<T>).

4 голосов
/ 07 декабря 2011

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

Myinterface foo = new MyObject();

Предполагая, что MyObject реализует MyInterface.

Это может быть полезно, например, при получении объектов из внешнего источника.В таком случае вы не знаете (и не заботитесь) о реальном типе объекта.

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

Предполагается, что у вас есть следующая переменная:

Myinterface foo;

И два класса (Foo и Bar), оба из которых реализуют MyInterface.После этого вы сможете назначать foo переменные с экземплярами Foo и Bar.

То же самое относится, конечно, к аргументам методов.

1 голос
/ 07 декабря 2011

Вы не создаете экземпляр интерфейса.Вы создаете классы, которые реализуют интерфейс, создают их, но ссылаются на интерфейс (в отличие от реализующего класса).

Это позволяет вашему коду оставаться независимым от реализации, подобно использованиюList ссылка, но реализация ArrayList.

В сочетании с внедрением зависимостей это значительно упрощает тестирование и расширяемость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...