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

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

32 голосов
/ 24 августа 2009

Так же, как контрапункт этот вопрос : что такое интерфейс в Java?

Ответы [ 9 ]

52 голосов
/ 24 августа 2009

Интерфейс - это особая форма абстрактного класса, которая не реализует никаких методов. В 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, и в interfaceA нет interfaceMethodB(). Аналогично, z имеет тип interfaceB и interfaceMethodA() в interfaceB.

нет.

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

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 выведет «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
{ }

Это точно так же, как и в нашем другом примере, за исключением того, что нам разрешено реализовывать методы в абстрактных классах, и мы не должны реализовывать уже реализованные методы в наследующем классе, поэтому «т. Но вы могли заметить, есть проблема. Что происходит, когда мы звоним new InheritsFromTwoAbstractClasses().method()? Это печатает "Привет" или "До свидания"? Вы, вероятно, не знаете, как и Java-компилятор. Другой язык, C ++, допускал такое наследование, и они решали эти проблемы часто очень сложными способами. Чтобы избежать такого рода проблем, 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 являются «миксинами» или классами, которые не предназначены для создания экземпляров, но добавляют функциональность к классам, в которые они «смешиваются» посредством наследования. Очевидно, нет проблем с выяснением того, что произойдет, если вы позвоните new InheritsFromTwoAbstractClasses().hi() или new InheritsFromTwoAbstractClasses().bye(), но вы не можете этого сделать, потому что Java не позволяет этого.

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

1 голос
/ 04 сентября 2018

Интерфейс является контрактом. Простой пример - это Арендатор и Арендодатель , которые являются двумя сторонами , а контракт является Договор аренды . Договор аренды содержит различные условия, которым арендаторы должны следовать. Аналогично, Интерфейс - это контакт, который содержит различные методы (Декларации), которые Сторона должна реализовать (предоставить тела методов). Здесь первая сторона - это класс, который реализует интерфейс, а вторая сторона - Клиент, и способ использования и интерфейса имеет «Ссылку Интерфейс »и« Объект класса реализации »: ниже представлены 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

 }

 }
0 голосов
/ 17 апреля 2019

Из последнего определения Oracle , интерфейс:

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

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

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

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

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

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

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

Ознакомьтесь с , узнайте больше об интерфейсах .

0 голосов
/ 10 марта 2017

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

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

0 голосов
/ 20 января 2017

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

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

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

0 голосов
/ 02 января 2017

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

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

[public] [abstract] ReturnType methodName();

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

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

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

0 голосов
/ 05 марта 2016

Этому вопросу 6 лет, и многие вещи изменили определение интерфейса за эти годы.

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

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

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

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

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

0 голосов
/ 04 марта 2016

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

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

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

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

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

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

interface A() {
    void print()
}
0 голосов
/ 25 апреля 2015

Интерфейс в 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();  
 }  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...