Суть интерфейса. Интерфейс — это специальный абстрактный класс, который содержит только определение констант и методов, но не реализацию переменных и методов.
Интерфейсы могут иметь некоторые вещи, которые есть в абстрактных классах. Если все методы в абстрактном классе являются абстрактными, этот абстрактный класс не должен реализовывать ни один метод, и все переменные в этом абстрактном классе являются статическими переменными, которые не могут быть реализованы. быть изменен (окончательно). В этом случае такой абстрактный класс можно определить как интерфейс. Формат определения класса как интерфейса заключается в замене ключевого слова class, объявляющего класс, на ключевое слово интерфейс, объявляющее интерфейс.
Интерфейс — это специальный абстрактный класс. В этом абстрактном классе все методы являются абстрактными методами, а атрибуты (т. е. переменные-члены) этого абстрактного класса объявляются как «имена атрибутов общедоступного статического конечного типа». Таким образом, объявление по умолчанию имеет вид «public static Final», то есть переменные-члены внутри являются общедоступными, статическими и не могут быть изменены. Поэтому при объявлении константы в интерфейсе ее можно записать в виде «константа публичного статического конечного типа имя=значение(значение)», а можно записать непосредственно в виде «константа типа имя=значение(значение)». )», например: «public static Final int id =10» можно напрямую записать в форме «int id=10», поскольку все объявления свойств по умолчанию в интерфейсе являются «public static Final», поэтому «public static Final "можно опустить. Абстрактный метод, объявленный в интерфейсе, не обязательно помечать ключевым словом «абстрактный», поскольку все методы в интерфейсе являются абстрактными, поэтому ключевое слово «абстрактный» по умолчанию опускается. Например, если вы объявляете такие три слова в интерфейсе. , Методы: «public void start()», «public void run()», «public void «stop()» не идентифицируется абстрактным ключевым словом перед этими тремя методами, но они являются абстрактными методами, поскольку все методы, объявленные в интерфейсе, являются абстрактными методами, поэтому абстрактное ключевое слово будет опущено в абстрактных методах в Интерфейс удален, поскольку методы, объявленные по умолчанию, являются абстрактными. , поэтому нет необходимости писать слово «абстрактный». Это отличается от объявления абстрактных методов в абстрактных классах. При объявлении абстрактных методов в абстрактных классах вы должны использовать ключевое слово «абстрактный», а в интерфейсах вы можете опустить «. Abstract» при объявлении абстрактных методов. Примечание. Абстрактный метод, объявленный в интерфейсе, по умолчанию является «публичным» и может быть только «публичным». Причина, по которой он объявлен таким образом, заключается в исправлении проблем, которые легко возникают при множественном наследовании в C++. в C++ подвержен проблемам. Проблема в том, что если несколько родительских классов с множественным наследованием имеют одни и те же переменные-члены, ссылаться на них будет довольно сложно, и во время работы возникнут различные проблемы. Чтобы исправить эту проблему, JAVA изменила все переменные-члены интерфейса на статические окончательные. Если переменная-член имеет статический тип, то переменная-член принадлежит всему классу, а не является эксклюзивной для определенного объекта. При множественном наследовании объект подкласса фактически содержит несколько объектов родительского класса, тогда как при одиночном наследовании в объекте подкласса имеется только один объект родительского класса. Объекты подклассов с множественным наследованием имеют несколько объектов родительского класса, и между этими объектами родительского класса могут быть повторяющиеся переменные-члены, что очень подвержено проблемам. Поэтому в JAVA этой проблемы можно избежать, используя интерфейсы, используемые для реализации множественного наследования. В качестве интерфейса класс может наследовать от интерфейса (или реализовывать интерфейс). Это также множественное наследование. Переменные-члены интерфейса не являются эксклюзивными для определенного объекта. Все они являются статическими переменными-членами и принадлежат всему классу. Поэтому не имеет значения, реализует ли класс несколько интерфейсов, и между объектами не будет конфликта. Реализация нескольких интерфейсов также обеспечивает множественное наследование и позволяет избежать проблем, связанных с множественным наследованием. В этом преимущество использования интерфейсов для реализации множественного наследования.
1. Определите интерфейс
Используйте интерфейс для определения интерфейса. Определения интерфейса аналогичны аналогичным определениям. Они также делятся на объявления интерфейса и тела интерфейса. Тело интерфейса состоит из двух частей: определения константы и определения метода. Основной формат определения интерфейса следующий:
[Модификатор] имя интерфейса интерфейса [расширяет список имен родительского интерфейса] {
[публичная] [статическая] [конечная] константа;
[публичный] [абстрактный] метод;
}
Модификатор: необязательный, используется для указания прав доступа к интерфейсу, необязательное значение — public. Если этот параметр опущен, используются права доступа по умолчанию.
Имя интерфейса: обязательный параметр, используемый для указания имени интерфейса. Имя интерфейса должно быть допустимым идентификатором Java. Обычно требуются заглавные буквы.
расширяется: список имен родительских интерфейсов: необязательный параметр, используемый для указания родительского интерфейса, от которого наследуется определяемый интерфейс. При использовании ключевого слова Extensions имя родительского интерфейса является обязательным параметром.
Методы. Методы интерфейса только определены, но не реализованы.
Например, определите интерфейс для расчета, в котором определены константа PI и два метода. Конкретный код выглядит следующим образом:
public интерфейс CalInterface { Final float PI=3.14159f;//Определить константу PI, используемую для представления числа Пи float getArea(float r);//Определить метод расчета площади getArea() float getCircumference(float r);// Определить a метод вычисления периметра getCircumference() }
Уведомление:
Как и в случае с файлами классов Java, имя файла интерфейса должно совпадать с именем интерфейса.
2. Реализовать интерфейс
После определения интерфейса его можно реализовать в классе. Чтобы реализовать интерфейс в классе, вы можете использовать ключевое слово, его основной формат следующий:
[Модификатор] class <имя класса> [расширяет имя родительского класса] [реализует список интерфейсов]{
............
}
Модификатор: необязательный параметр, используемый для указания разрешения доступа класса. Необязательные значения: общедоступные, абстрактные и окончательные.
Имя класса: обязательный параметр, используемый для указания имени класса. Имя класса должно быть допустимым идентификатором Java. Обычно требуются заглавные буквы.
расширяет имя родительского класса: необязательный параметр, используемый для указания родительского класса, от которого наследуется определяемый класс. При использовании ключевого слова расширений имя родительского класса является обязательным параметром.
реализует список интерфейсов: необязательный параметр, используемый для указания того, какие интерфейсы реализует этот класс. При использовании ключевого словаimplements список интерфейсов является обязательным параметром. Если в списке интерфейсов несколько имен интерфейсов, разделяйте их запятыми.
При реализации интерфейса в классе имя метода, тип возвращаемого значения, количество и тип параметров должны быть точно такими же, как в интерфейсе, и все методы в интерфейсе должны быть реализованы. Например, напишите класс с именем Cire, реализующий интерфейс Calculate, определенный в разделе 5.7.1. Конкретный код выглядит следующим образом:
public class Cire реализует CalInterface { public float getArea(float r) { float area=PI*r*r;//Вычисляем площадь круга и присваиваем ее переменной области return area;//Вернем вычисленную площадь круга} public float getCircumference (float r) { floatcircle=2*PI*r; //Вычисляем длину окружности и присваиваем ее переменной окружности returncircle; //Возвращаем вычисленную длину} public static void main(String[] args) { Cire c = новый Cire(); float f = c.getArea(2.0f); System.out.println(Float.toString(f));
При наследовании классов можно реализовать только одиночное наследование, но при реализации интерфейсов можно реализовать несколько интерфейсов одновременно, и каждый интерфейс отделяется запятой ",".
В это время могут возникнуть конфликты имен констант или методов (в нескольких интерфейсах). При решении этой проблемы, если константы конфликтуют, необходимо явно указать интерфейс константы. Этого можно добиться с помощью «имя интерфейса.константа». Если возникает конфликт методов, вам нужно реализовать только один метод.