Что такое интерфейс в Java?

Как контрапункт для этого вопроса: что такое интерфейс в Java?

Ответ 1

Интерфейс представляет собой особую форму абстрактного класса, который не реализует никаких методов. В Java вы создаете такой интерфейс:

interface Interface
{
    void interfaceMethod();
}

Так как интерфейс не может реализовать какие-либо методы, он подразумевает, что все, включая все методы, является общедоступным и абстрактным (абстракция в терминах Java означает "не реализована этим классом" ). Таким образом, интерфейс выше идентичен интерфейсу ниже:

public interface Interface
{
    abstract public void interfaceMethod();
}

Чтобы использовать этот интерфейс, вам просто нужно реализовать интерфейс. Многие классы могут реализовывать интерфейс, а класс может реализовывать множество интерфейсов:

interface InterfaceA
{
     void interfaceMethodA();
}

interface InterfaceB
{
    void interfaceMethodB();
}

public class ImplementingClassA
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
        System.out.println("interfaceA, interfaceMethodA, implementation A");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation A");
    }
}

public class ImplementingClassB
    implements InterfaceA, InterfaceB
{
    public void interfaceMethodA()
    {
         System.out.println("interfaceA, interfaceMethodA, implementation B");
    }

    public void interfaceMethodB()
    {
        System.out.println("interfaceB, interfaceMethodB, implementation B");
    }
}

Теперь, если вы хотите, вы могли бы написать такой метод:

public void testInterfaces()
{
    ImplementingClassA u = new ImplementingClassA();
    ImplementingClassB v = new ImplementingClassB();
    InterfaceA w = new ImplementingClassA();
    InterfaceA x = new ImplementingClassB();
    InterfaceB y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    u.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    u.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    v.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    v.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
    w.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation A"
    x.interfaceMethodA();
    // prints "interfaceA, interfaceMethodA, implementation B"
    y.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation A"
    z.interfaceMethodB();
    // prints "interfaceB, interfaceMethodB, implementation B"
}

Однако вы можете никогда делать следующее:

public void testInterfaces()
{
    InterfaceA y = new ImplementingClassA();
    InterfaceB z = new ImplementingClassB();

    y.interfaceMethodB(); // ERROR!
    z.interfaceMethodA(); // ERROR!
}

Причина, по которой вы не можете сделать этого, состоит в том, что y имеет тип interfaceA, а interfaceMethodB() в interfaceA нет. Аналогично, z имеет тип interfaceB и в interfaceB нет interfaceMethodA().

Ранее я упоминал, что интерфейсы - это просто особая форма абстрактного класса. Чтобы проиллюстрировать этот момент, посмотрите следующий код.

interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
{
    abstract public void abstractMethod();
}

Вы бы наследовали эти классы почти точно так же:

public class InheritsFromInterface
    implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

public class InteritsFromAbstractClass
    extends AbstractClass
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

Фактически вы могли бы даже изменить интерфейс и абстрактный класс следующим образом:

interface Interface
{
    void abstractMethod();
}

abstract public class AbstractClass
    implements Interface
{
    abstract public void abstractMethod();
}

public class InheritsFromInterfaceAndAbstractClass
    extends AbstractClass implements Interface
{
    public void abstractMethod() { System.out.println("abstractMethod()"); }
}

Однако между интерфейсами и абстрактными классами существуют два различия.

Первое отличие состоит в том, что интерфейсы не могут реализовывать методы.

interface Interface
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}

Интерфейс выше генерирует ошибку компилятора, так как он имеет реализацию для implementedMethod(). Если вы хотите реализовать метод, но не сможете создать экземпляр класса, вам нужно будет сделать это следующим образом:

abstract public class AbstractClass
{
    public void implementedMethod()
    {
        System.out.println("implementedMethod()");
    }
}

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

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

abstract public class AbstractClassA { }
abstract public class AbstractClassB { }
public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

Приведенный выше код генерирует ошибку компилятора, а не потому, что все классы пустые, а потому, что InheritsFromTwoAbstractClasses пытается наследовать два абстрактных класса, что является незаконным. Следующее совершенно законно.

interface InterfaceA { }
interface InterfaceB { }
public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{ }    

Первое различие между интерфейсами и абстрактными классами является причиной второй разницы. Взгляните на следующий код.

interface InterfaceA
{
    void method();
}

interface InterfaceB
{
    void method();
}

public class InheritsFromTwoInterfaces
    implements InterfaceA, InterfaceB
{
    void method() { System.out.println("method()"); }
}

Нет проблем с кодом выше, потому что interfaceA и interfaceB нечего скрывать. Легко сказать, что вызов method будет печатать "метод()".

Теперь посмотрите на следующий код:

abstract public class AbstractClassA
{
    void method() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void method() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

Это точно так же, как и в нашем другом примере, за исключением того, что, поскольку нам разрешено применять методы в абстрактных классах, мы это сделали, а потому, что нам не нужно реализовывать уже реализованные методы в наследующем классе, мы didn "т. Но вы, возможно, заметили, есть проблема. Что происходит, когда мы вызываем new InheritsFromTwoAbstractClasses().method()? Печатает ли" Hello "или" Goodbye "? Вероятно, вы этого не знаете, и компилятор Java тоже. Другой язык, С++ разрешал такое наследование, и они решали эти проблемы способами, которые часто были очень сложными. Чтобы избежать подобных неприятностей, Java решила сделать это" множественное наследование" незаконным.

Недостатком решения Java является следующее:

abstract public class AbstractClassA
{
    void hi() { System.out.println("Hello"); }
}

abstract public class AbstractClassB
{
    void bye() { System.out.println("Goodbye"); }
}

public class InheritsFromTwoAbstractClasses
    extends AbstractClassA, AbstractClassB
{ }

AbstractClassA и AbstractClassB являются "mixins" или классами, которые не предназначены для создания экземпляров, но добавляют функциональность классам, которые они "смешаны" с наследованием. Очевидно, нет никакой проблемы при определении того, что произойдет, если вы вызываете new InheritsFromTwoAbstractClasses().hi() или new InheritsFromTwoAbstractClasses().bye(), но вы не можете этого сделать, потому что Java не разрешает это.

(Я знаю, что это длинный пост, поэтому, если в нем есть какие-либо ошибки, сообщите мне об этом, и я исправлю их.)

Ответ 2

Интерфейс - это контракт. Простым примером являются Арендатор и Арендодатель, которые являются двумя сторонами, а договор - это Договор аренды. Договор аренды содержит различные условия, которым арендаторы должны следовать. Аналогично, Интерфейс - это контакт, который содержит различные методы (Декларации), которые Сторона должна реализовать (предоставить тела методов). Здесь первая сторона - это класс, который реализует интерфейс, а вторая сторона - Клиент, и способ использования и интерфейса имеет "Ссылка Интерфейс "и" Объект Реализующего класса ": ниже представлены 3 компонента: (объяснено с помощью примера)

Компонент 1] Интерфейс: Контракт

interface myInterface{

 public void myMethod();

 }

Компонент 2] Реализация Класс: Партия № 1

 class myClass implements myInterface {

 @Override

 public void myMethod() {

 System.out.println("in MyMethod");

 }

 }

Компонент 3] Код клиента: Партия № 2

 Client.java

 public class Client {

 public static void main(String[] args) {

 myInterface mi = new myClass();

 // Reference of Interface = Object of Implementing Class

 mi.myMethod(); // this will print in MyMethod

 }

 }

Ответ 3

Интерфейс в java - это проект класса. Он имеет только статические константы и абстрактные методы. Интерфейс в java - это механизм, позволяющий полностью абстрагироваться. Могут существовать только абстрактные методы в интерфейсе java, а не в методе. Он используется для достижения полной абстракции и множественного наследования в Java. Интерфейс представляет собой набор абстрактных методов. Класс реализует интерфейс, тем самым наследуя абстрактные методы интерфейса. Интерфейс не является классом. Написание интерфейса аналогично написанию класса, но это два разных понятия. Класс описывает атрибуты и поведение объекта. Интерфейс содержит поведение (абстрактные методы), которое реализует класс. Если класс, реализующий интерфейс, является абстрактным, все методы интерфейса должны быть определены в классе. Поскольку множественное наследование не разрешено в java, интерфейс является всего лишь способом реализации множественного наследования. Вот пример понимания интерфейса

interface Printable{  
void print();  
}  

interface Showable{  
void print();  
}  

class testinterface1 implements Printable,Showable{  

public void print(){System.out.println("Hello");}  

public static void main(String args[]){  
testinterface1 obj = new testinterface1();  
obj.print();  
 }  
}

Ответ 4

Интерфейс - это проект класса.

Существует одна концепция oop под названием Абстракция данных, в которой есть две категории: абстрактный класс, а другой - интерфейс.. p >

Абстрактный класс достигает только частичной абстракции, но интерфейс достигает полной абстракции.

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

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

Интерфейс не может быть создан.

interface A() {
    void print()
}

Ответ 5

Этот вопрос составляет 6 лет, и многие вещи изменили определение интерфейса на протяжении многих лет.

От oracle документация (после выпуска Java 8):

В языке программирования Java интерфейс является ссылочным типом, похожим на класс, который может содержать только константы, сигнатуры методов, методы по умолчанию, статические методы и вложенные типы. Органы метода существуют только для методов по умолчанию и статических методов. Интерфейсы не могут быть инстанцированы - они могут быть реализованы только классами или расширены другими интерфейсами.

Посмотрите на связанные вопросы SE для лучшего объяснения:

Есть ли больше для интерфейса, чем правильные методы

В чем разница между интерфейсом и абстрактным классом?

Ответ 6

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

  • Интерфейсы определяют, что должен делать класс, а не как. Это план класса.
  • Интерфейс о возможностях, таких как Player, может быть интерфейс и любой реализующий класс Player должен иметь возможность (или должен реализовывать) move(). Поэтому он определяет набор методов, которые класс должен реализовать.

  • Если класс реализует интерфейс и не предоставляет метод тела для всех функций, указанных в интерфейсе, тогда класс должен быть объявлен абстрактным.

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

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

Новые функции, добавленные в интерфейсы в JDK 8

  • До JDK 8 интерфейс не смог определить реализацию. Мы можем теперь добавьте реализацию по умолчанию для методов интерфейса. Это значение по умолчанию реализация имеет особое применение и не влияет на намерение за интерфейсами.

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

  • В JDK 8 мы теперь можем определять статические методы в интерфейсах, которые можно вызывать независимо без объекта. Примечание: эти методы не наследуются.

Ответ 7

Что это такое
Интерфейс является ссылочным типом, как и класс. Это два основных типа ссылок в Java.

Что он содержит
Интерфейс может содержать подмножество того, что может содержать нормальный класс. Это включает в себя все, что есть static, как методы, так и переменные, и декларации метода не static. Нельзя иметь переменные не static.
Объявление метода отличается от обычного метода несколькими вещами; здесь приведен пример:

[public] [abstract] ReturnType methodName();

Эти объявления могут быть помечены как public и abstract, как показано в [optional braces]. Это не обязательно, поскольку это значение по умолчанию. private, protected, package-private (aka. nothing) и модификатор final не разрешены и помечены как ошибка компилятора. Они не реализуются, поэтому вместо фигурных скобок есть точка с запятой.

Как и в случае с Java 8, они могут содержать не static методы с реализацией, они должны быть отмечены модификатором default. Тем не менее применяются те же ограничения, что и для других модификаторов (добавив, что strictfp теперь действителен и abstract больше нет).

Что это полезно для
Одно из его применений заключается в том, чтобы оно использовалось как лицо для службы. Когда две стороны работают вместе, чтобы сформировать отношения службы-запросчика и поставщика услуг, поставщик услуг предоставляет лицо службы (в зависимости от того, как выглядит служба) в форме интерфейса.
Одной из концепций ООП является "Абстракция", что означает скрыть сложную работу систем и показать только то, что необходимо для понимания системы. Это помогает визуализировать работу сложной системы. Это может быть достигнуто через интерфейс, где в каждом модуле визуализируется (а также реализовано) для работы через интерфейс другого модуля.

Ответ 8

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

Кодирование на интерфейс, а не на реализацию. Кодирование в интерфейс делает свободную пару.

Интерфейс является ссылочным типом в Java. Он похож на класс. Это коллекция абстрактных методов. Класс реализует интерфейс, тем самым наследуя абстрактные методы интерфейса. Наряду с абстрактными методами интерфейс может также содержать константы, методы по умолчанию, статические методы и вложенные типы. для более подробнее

Ответ 9

Интерфейс представляет собой классную конструкцию, содержащую только константы и абстрактные методы (Введение в java-программирование, n.d.). Более того, он может распространять более одного интерфейса, например, надкласс. Java допускает только одно наследование для расширения класса, но допускает несколько расширений для интерфейсы (Введение в программирование на Java, n.d.) Например,

public class NewClass extends BaseClass
implements Interface1, ..., InterfaceN {
    ...
}

Во-вторых, интерфейсы могут использоваться для указания поведения объектов в классе. Однако они не могут содержать абстрактные методы. Кроме того, интерфейс может наследовать другие интерфейсы, используя ключевое слово extends.

public interface NewInterface extends Interface1, ... , InterfaceN {

}

Ссылка

Введение в программирование на Java. Интерфейсы и абстрактные классы (n.d). Получено 10 марта 2017 г. из https://viewer.gcu.edu/7NNUKW

Ответ 10

Согласно последнему определению Oracle, интерфейс - это:

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

Например, представьте себе футуристическое общество, в котором роботизированные автомобили с компьютерным управлением перевозят пассажиров по улицам города без оператора. Производители автомобилей пишут программное обеспечение (конечно, Java), которое управляет автомобилем - остановка, запуск, ускорение, поворот налево и так далее. Другая промышленная группа, производители электронных навигационных приборов, производят компьютерные системы, которые принимают данные о местоположении GPS (Global Positioning System) и беспроводную передачу условий движения, и используют эту информацию для управления автомобилем.

Производители автомобилей должны опубликовать стандартный для отрасли интерфейс, в котором подробно объясняется, какие методы можно использовать для приведения автомобиля в движение (любой автомобиль любого производителя). Затем производители могут написать программное обеспечение, которое вызывает методы, описанные в интерфейсе, для управления автомобилем. Ни одной промышленной группе не нужно знать, как внедряется программное обеспечение другой группы. Фактически, каждая группа считает свое программное обеспечение очень проприетарным и оставляет за собой право изменять его в любое время, пока оно продолжает придерживаться опубликованного интерфейса.

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

Наиболее популярное использование интерфейсов - это API-интерфейсы (Application Programming Interface), которые распространены в коммерческих программных продуктах. Как правило, компания продает программный пакет, содержащий сложные методы, которые другая компания хочет использовать в своем программном продукте.

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

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

Проверьте, чтобы узнать больше об интерфейсах.