Как создать файл интерфейса java

Обновлено: 07.07.2024

Интерфейсы. Особенности использования в сочетании с классами. Преимущества применения интерфейсов. Ключевые слова interface , implements . Примеры

Перед изучением данной темы рекомендуется изучить тему:

Содержание

  • 1. Для чего используются интерфейсы? Преимущества применения интерфейсов
  • 2. Общая форма объявления интерфейса. Ключевое слово interface
  • 3. Какая общая форма реализации интерфейса в классе? Ключевое слово implements
  • 4. Что нужно обязательно выполнить (реализовать) в классе, который реализует заданный интерфейс?
  • 5. Примеры объявление интерфейсов и классов, которые их реализуют
  • 6. Можно ли создать экземпляр (объект) интерфейса?
  • 7. Во скольких классах может быть реализованн интерфейс?
  • 8. Сколько интерфейсов может реализовать один класс?
  • 9. Какой тип доступа обязательно должны иметь методы, объявленные в интерфейсе?
  • 10. Какой тип доступа по умолчанию имеют методы, объявленные в интерфейсе?
  • 11. Как вызвать методы класса с помощью ссылок на интерфейсы?
  • 12. Требования к объявлению переменных в интерфейсах
  • 13. В каких случаях можно применять спецификатор доступа public в объявлении интерфейса?
  • 14. Как добавить объявление интерфейса в Java Eclipse?

Поиск на других ресурсах:

1. Для чего используются интерфейсы? Преимущества применения интерфейсов

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

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

Использование интерфейсов дает следующие взаимосвязанные преимущества:

2. Общая форма объявления интерфейса. Ключевое слово interface

Общая форма объявления интерфейса имеет следующий вид:

  • interface – ключевое слово, которое определяет, что объявляемый элемент языка Java есть интерфейсом;
  • access_modifier – один из модификаторов доступа public или abstract;
  • Name – имя интерфейса;
  • return_type – некоторый тип, который возвращает метод с именем method_name1 , method_name2 , method_nameN ;
  • parameters1 , parameters2 , parametersN – параметры методов method_name1 , method_name2 , method_nameN ;
  • type – тип переменной, объявленной в интерфейсе;
  • var_name1 , var_name2 , var_nameN – имена переменных, которые объявлены в интерфейсе. Любая переменная, объявленная в интерфейсе объявляется с модификаторами final и static . Эта переменная должна быть инициализирована. В классе, который реализует интерфейс нельзя изменить значение переменной.
3. Какая общая форма реализации интерфейса в классе? Ключевое слово implements

Если интерфейс определен, то его можно реализовать в классе. Общая форма реализации интерфейса в классе имеет вид:

здесь SomeClass – имя класса, реализующего интерфейс SomeInterface .

4. Что нужно обязательно выполнить (реализовать) в классе, который реализует заданный интерфейс?

Если класс реализует интерфейс, то для данного класса устанавливаются следующие обязательства:

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

Пример 1. В примере демонстрируется:

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

Пусть в пределах пакета в файле IMathFunctions.java объявлен интерфейс с именем IMathFunctions как показано ниже

В интерфейсе указываются следующие объявления:

  • переменная pi , которая определяет число Пи. Эта переменная неявно объявлена как final и static . Если некоторый класс реализует этот интерфейс, то изменять значения этой переменной нельзя;
  • математическая функция Power() , предназначенная для возведения числа в степень;
  • математическая функция AbsComplex() , возвращающая модуль комплексного числа.

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

Использование интерфейса в классе может быть, например, следующим

В вышеприведенном коде сначала объявляется ссылка mf на интерфейс IMathFunctions . Затем для этой ссылки mf создается экземпляр класса MathFuncions . Такая реализация работает, поскольку класс MathFunctions реализует ( implements ) интерфейс IMathFunctions . С помощью ссылки mf можно вызвать методы интерфейса.

Пример 2. В примере демонстрируется использование интерфейса IStrings , объявляющего методы обработки строки:

  • метод GetNSymbols() , подсчитывающий количество символов в строке;
  • метод ConvertOdd() , возвращающий строку, состоящую из символов лежащих на нечетных позициях.

Класс ProcessStrings реализует интерфейс IStrings .

Реализация интерфейса помещается в файле IStrings.java и имеет следующий вид:

Реализация класса описывается в файле ProcessStrings.java и имеет следующий вид

6. Можно ли создать экземпляр (объект) интерфейса?

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

7. Во скольких классах может быть реализованн интерфейс?

Интерфейс может быть реализован в любом количестве классов. Например, в нижеследующем коде два разных класса с именами SomeClass1 , SomeClass2 реализуют один интерфейс SomeInterface .

8. Сколько интерфейсов может реализовать один класс?

Класс может реализовать любое количество интерфейсов. В этом случае имена интерфейсов разделяются запятой. Например, в следующем коде

класс с именем ClassName реализует интерфейсы с именами Interface1 , Interface2 , Interface3 .

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

Методы, объявленные в интерфейсе, должны быть общедоступными, то есть должны иметь тип доступа public .

10. Какой тип доступа по умолчанию имеют методы, объявленные в интерфейсе?

Если не указан тип доступа в объявлении метода, то эти методы имеют тип доступа public . Например, в нижеследующем коде

оба метода method1() и method2() имеют тип доступа public .

11. Как вызвать методы класса с помощью ссылок на интерфейсы?

Последовательность шагов следующая (см. пример с п. 5):

  1. Объявить ссылку на интерфейс
  2. Выделить память для ссылки, указав конструктор класса, реализующий данный интерфейс.
  3. Вызвать методы или переменные, объявленные в интерфейсе.

Например. Пусть задан интерфейс с именем I и класс с именем C . В интерфейсе I объявляется метод

Использование метода method() с учетом интерфейса I может быть следующей:

12. Требования к объявлению переменных в интерфейсах

В интерфейсе можно объявлять переменную. Любая переменная, объявленная в интерфейсе неявно объявляется с модификаторами final и static . Эта переменная должна быть инициализирована. В классе, реализующем интерфейс, нельзя изменить значение переменной.

13. В каких случаях можно применять спецификатор доступа public в объявлении интерфейса?

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

Например. Задан файл с именем IMyInterface.java . В этом файле можно объявить public -интерфейс с таким именем

14. Как добавить объявление интерфейса в Java Eclipse?

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

Чтобы добавить интерфейс в некоторый проект в системе программирования Java Eclipse нужно выполнить следующие шаги.

1. Активировать проект, в который нужно добавить интерфейс (рис. 1).

Java Eclipse Активация проекта

Рис. 1. Активация проекта с именем Project15 в Java Eclipse

2. Вызвать команду создания интерфейса

Java Eclipse Команда добавления интерфейса к проекту

Рис. 2. Команда добавления интерфейса к проекту

Java Eclipse Окно "New Java Interface"

4. После выбора кнопки Finish интерфейс с именем MyInterface будет добавлен к проекту Project15 как показано на рисунке 4.

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

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

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

Содержание

Написание интерфейса схоже с написанием класса. Но класс описывает атрибуты и поведения объекта. И интерфейс содержит поведения, которые класс реализует.

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

Чем похожи класс и интерфейс?

Интерфейс схож с классом следующим образом:

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

Чем отличается класс от интерфейса?

Однако, интерфейс всё же отличается от класса. Отличие интерфейса от класса в Java:

  • Вы не можете создать экземпляр интерфейса.
  • В интерфейсе не содержатся конструкторы.
  • Все методы в интерфейсе абстрактные.
  • Интерфейс не может содержать поля экземпляров. Поля, которые могут появиться в интерфейсе, обязаны быть объявлены и статическими, и final.
  • Интерфейс не расширяется классом, он реализуется классом.
  • Интерфейс может расширить множество интерфейсов.

Объявление интерфейсов

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

Пример 1

Интерфейсы имеют следующие свойства:

  • Интерфейс абстрактный косвенно. Вам не нужно использовать ключевое слово abstract во время объявления интерфейса.
  • Каждый метод в интерфейсе косвенно абстрактным, поэтому ключевое слово abstract не нужно.
  • Методы в интерфейсе косвенно публичны.

Пример 2

Реализация интерфейса

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

Класс использует ключевое слово implements для реализации интерфейса. Ключевое слово implements появляется при объявлении класса в его расширенной части.

Пример

При переопределении методов в интерфейсе, нужно следовать некоторым правилам:

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

При реализации интерфейсов есть некоторые правила:

  • Класс может реализовать более одного интерфейса за раз.
  • Класс может расширить только один класс, но реализовать множество интерфейсов.
  • Интерфейс может расширить другой интерфейс таким же образом, как класс расширяет другой класс.

Расширение интерфейсов

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

Приведённый интерфейс Sports расширен интерфейсами Hockey и Football.

Пример

Интерфейс Hockey имеет четыре метода, но он наследует два из Sports; таким образом, класс, который реализует Hockey, должен реализовать все шесть методов. Подобно этому, класс, который реализует Football, должен определить три метода из Football и два метода из Sports.

Расширение множества интерфейсов

Класс в Java может расширить только один родительский класс. Множественное наследование невозможно. Однако интерфейсы не классы, и интерфейс может расширить более чем один родительский интерфейс.

Ключевое слово extends используется лишь раз, а родительские интерфейсы объявляются через запятую.

Например, если интерфейс Hockey расширил и Sports, и Event, то объявление выглядело бы так:

Интерфейсы тегов

Самое распространённое использование расширения интерфейсов происходит тогда, когда родительский интерфейс не содержит каких-либо методов. Например, интерфейс MouseListener в пакете java.awt.event расширил java.util.EventListener, который определяется так:

Интерфейс без методов в нём называется интерфейсом тегов. Есть две простые дизайнерские цели для интерфейсов тегов:

Создаёт общего родителя – как в случае с интерфейсом EventListener, который расширяется множеством других в Java API, вы можете использовать интерфейс тегов, чтобы создать общего родителя среди группы интерфейсов. Например, когда интерфейс расширяет EventListener, то JVM знает, что этот конкретный интерфейс будет использоваться в сценарии делегирования событий.

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

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

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

Содержание

Некоторые из существующих пакетов в Java:

  • java.lang – связывает фундаментальные классы.
  • java.io – классы для ввода и выводные функции связаны в этом пакете.

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

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

Создание пакета

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

Оператор package должен быть первой строкой в исходном файле. Может быть только один запрос package в каждом исходном файле, и он применяется ко всем типам в этом файле.

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

Чтобы скомпилировать программы на Java с операторами package, то вам нужно использовать опцию –d, как показано ниже.

Затем в указанном месте назначения создается папка с указанным именем пакета, а файлы скомпилированных классов будут помещены в эту папку.

Пример 1

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

В следующем примере пакета содержится интерфейс с названием animals.

Теперь давайте реализуем вышеприведённый интерфейс в этом же пакете animals:

А сейчас скомпилируем java-файлы, как показано ниже:

Теперь пакет/папка с именем animals будет создана в текущей директории, и файлы классов будут помещены в неё.

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

Ключевое слово import

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

Пример 2

Итак, класс под названием Boss добавлен в пакет payroll, который уже содержит Employee. Boss может обратиться к классу Employee без использования префикса payroll, как показано в следующем классе Boss.

Что произойдёт, если класс Employee не будет включен в пакет payroll? Тогда класс Boss должен будет использовать одну из следующих техник для обращения к классу в другом пакете:

  • Можно использовать полноценное имя класса. К примеру:
  • Импорт пакета. В Java пакет может быть импортирован с помощью ключевого слова import и wild card. (*). Например:
  • Сам класс можно импортировать с помощью ключевого слова import. Взглянем:

Примечание: Файл класса может содержать любое количество операторов импорта (import). Операторы импорта (import) должны появляться после оператора пакета (package) и перед объявлением класса.

Структура директории пакетов

Происходят два явления, когда класс помещён в пакет:

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

Есть лёгкий способ работы с вашими файлами в Java:

Поместите исходный код для класса, интерфейса, перечисления или типа аннотации в текстовый файл, имя которого является простым именем типа с расширением .java.

Теперь поместите исходный файл в директорию, имя которой отражает имя пакета, к которому принадлежит класс:

Полноценное имя класса и пути будет выглядеть так:

  • Имя класса – vehicle.Car
  • Путь к файлу – vehicle\Car.java (в Windows)

В общем, компания использует своё обратное доменное имя в Интернете для своих именований пакетов в Java.

Компилятор создаёт во время компиляции другой файл вывода для каждого класса, интерфейса и перечисления, определённых в нём. Обычное имя файла вывода состоит из имени типа и расширения .class.

Теперь скомпилируйте это, используя опцию –d:

Файлы скомпилируются следующим образом:

Вы можете импортировать все классы и интерфейсы, определённые в \com\apple\computers\ вот так:

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

Делая так, становится возможным предоставить доступ к директории классов другим программистам, не раскрывая ваши источники. Вам также нужно распределить файлы классов и источников таким образом, чтобы компилятор и Java Virtual Machine (JVM) могли найти все типы, которые использует ваша программа.

Полный путь к директории классов

\classes называется путь класса и устанавливается с системной переменной CLASSPATH. И компилятор, и JVM создают путь к вашим файлам .class, добавляя имя пакета к пути класса.

Путь класса может включать несколько путей. Множество путей должны быть отделены точкой с запятой (Windows) или двоеточием (Unix). По умолчанию компилятор и JVM ищут текущую директорию и JAR-файл, содержащий классы платформы Java, чтобы эти директории были автоматически включены в путь класса.

Установить системную переменную CLASSPATH

Чтобы отобразить текущую CLASSPATH переменную, используйте следующие команды в Windows и UNIX (Bourne shell):

Графический интерфейс пользователя представляет собой иерархию объектов android.view.View и android.view.ViewGroup . Каждый объект ViewGroup представляет контейнер, который содержит и упорядочивает дочерние объекты View . В частности, к контейнерам относят такие элементы, как RelativeLayout, LinearLayout, GridLayout, ConstraintLayout и ряд других.

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

Иерархия визуальных компонентов

Большинство визуальных элементов, наследующихся от класса View, такие как кнопки, текстовые поля и другие, располагаются в пакете android.widget

При определении визуального у нас есть три стратегии:

Создать элементы управления программно в коде java

Объявить элементы интерфейса в XML

Сочетание обоих способов - базовые элементы разметки определить в XML, а остальные добавлять во время выполнения

Сначала рассмотрим первую стратегию - определение интерейса в коде Java.

Создание интерфейса в коде java

Для работы с визуальными элементами создадим новый проект. В качестве шаблона проекта выберем Empty Activity :

Empty Activity в Android Studio

Пусть он будет называться ViewsApp:

Графическое приложение в Android

И после создания проекта два основных файла, которые будут нас интересовать при создании визуального интерфейса - это класс MainActivity и определение интерфейса для этой activity в файле activity_main.xml .

MainActivity и activity_main.xml в Android Studio

Определим в классе MainActivity простейший интерфейс:

При создании виджетов в коде Java применяется их конструктор, в который передается контекст данного виджета, а точнее объект android.content.Context , в качестве которого выступает текущий класс MainActivity.

Здесь весь интерфейс представлен элементом TextView, которое предназначено для выводa текста. С помощью методов, которые, как правило, начинаются на set , можно установить различные свойства TextView. Например, в данном случае метод setText() устанавливает текст в поле, а setTextSize() задает высоту шрифта.

Для установки элемента в качестве интерфейса приложения в коде Activity вызывается метод setContentView() , в который передается визуальный элемент.

Если мы запустим приложение, то получим следующий визуальный интерфейс:

Интерфейс в коде java в Android Studio

Подобным образом мы можем создавать более сложные интерейсы. Например, TextView, вложенный в ConstraintLayout:

Для каждого контейнера конкретные действия по добавлению и позиционированию в нем элемента могут отличаться. В данном случае контейнеров выступает класс ConstraintLayout, поэтому для определения позиционирования и размеров элемента необходимо создать объект ConstraintLayout.LayoutParams . (Для LinearLayout это соответственно будет LinearLayout.LayoutParams, а для RelativeLayout - RelativeLayout.LayoutParams и т.д.). Этот объект инициализируется двумя параметрами: шириной и высотой. Для указания ширины и высоты можно использовать константу ViewGroup.LayoutParams.WRAP_CONTENT , которая устанавливает размеры элемента, необходимые для размещения а экране его содержимого.

Далее определяется позиционирование. В зависимости от типа контейнера набор устанавливаемых свойств может отличаться. Так, строка кода

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

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

Для установки всех этих значений для конкретного элемента (TextView) в его метод setLayoutParams() передается объект ViewGroup.LayoutParams (или один из его наследников, например, ConstraintLayout.LayoutParams).

Все классы контейнеров, которые наследуются от android.view.ViewGroup (RelativeLayout, LinearLayout, GridLayout, ConstraintLayout и т.д.), имеют метод void addView(android.view.View child) , который позволяет добавить в контейнер другой элемент - обычный виджет типа TextView или другой контейнер. И в данном случае посредством данного метода TextView добавляется в ConstraintLayout:

Опять же отмечу, что для конкретного контейнера конкретные действия могут отличаться, но как правило для всех характерно три этапа:

Создание объекта ViewGroup.LayoutParams и установка его свойств

Передача объекта ViewGroup.LayoutParams в метод setLayoutParams() элемента

Передача элемента для добавления в метод addView() объекта контейнера

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

Читайте также: