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

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

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

, Поскольку другие сказали, если нет ничего в cpp файле, который стоит представить другим частям кода, поскольку обычно имеет место с main.c, то нет никакой потребности в заголовочном файле.

иногда стоит поместить все, что Вы хотите представить в единственном заголовочном файле (например, Func1and2and3.h), так, чтобы что-либо, что знает о Func1, знало о Func2 также, но я лично не увлечен этим, поскольку это означает, что Вы склонны загружать адскую партию спама наряду с материалом, который Вы на самом деле хотите.

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

32
задан 2 revs 23 May 2017 в 11:47
поделиться

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 , и нет 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()");
    }
}

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

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
{ }

Это точно так же, как и в нашем другом примере, за исключением того, что мы Нам разрешено реализовывать методы в абстрактных классах, и поскольку нам не нужно реализовывать уже реализованные методы в наследующем классе, мы этого не сделали. Но вы могли заметить, что есть проблема. Что происходит, когда мы вызываем 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 не позволяет это.

(Я знаю, что это длинный пост,

53
ответ дан 27 November 2019 в 20:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: