Что такое имплементация в java
Перейти к содержимому

Что такое имплементация в java

  • автор:

Что такое имплементация в java

Механизм наследования очень удобен, но он имеет свои ограничения. В частности мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.

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

Чтобы определить интерфейс, используется ключевое слово interface . Например:

interface Printable

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

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

Чтобы класс применил интерфейс, надо использовать ключевое слово implements :

public class Program < public static void main(String[] args) < Book b1 = new Book("Java. Complete Referense.", "H. Shildt"); b1.print(); >> interface Printable < void print(); >class Book implements Printable < String name; String author; Book(String name, String author)< this.name = name; this.author = author; >public void print() < System.out.printf("%s (%s) \n", name, author); >>

В данном случае класс Book реализует интерфейс Printable. При этом надо учитывать, что если класс применяет интерфейс, то он должен реализовать все методы интерфейса, как в случае выше реализован метод print . Потом в методе main мы можем создать объект класса Book и вызвать его метод print. Если класс не реализует какие-то методы интерфейса, то такой класс должен быть определен как абстрактный, а его неабстрактные классы-наследники затем должны будут реализовать эти методы.

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

Printable pr = new Printable(); pr.print();

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

class Journal implements Printable < private String name; String getName()< return name; >Journal(String name) < this.name = name; >public void print() < System.out.println(name); >>

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

public class Program < public static void main(String[] args) < Printable printable = new Book("Java. Complete Reference", "H. Shildt"); printable.print(); // Java. Complete Reference (H. Shildt) printable = new Journal("Foreign Policy"); printable.print(); // Foreign Policy >> interface Printable < void print(); >class Book implements Printable < String name; String author; Book(String name, String author)< this.name = name; this.author = author; >public void print() < System.out.printf("%s (%s) \n", name, author); >> class Journal implements Printable < private String name; String getName()< return name; >Journal(String name) < this.name = name; >public void print() < System.out.println(name); >>

Интерфейсы в преобразованиях типов

Все сказанное в отношении преобразования типов характерно и для интерфейсов. Например, так как класс Journal реализует интерфейс Printable, то переменная типа Printable может хранить ссылку на объект типа Journal:

Printable p =new Journal("Foreign Affairs"); p.print(); // Интерфейс не имеет метода getName, необходимо явное приведение String name = ((Journal)p).getName(); System.out.println(name);

И если мы хотим обратиться к методам класса Journal, которые определены не в интерфейсе Printable, а в самом классе Journal, то нам надо явным образом выполнить преобразование типов: ((Journal)p).getName();

Методы по умолчанию

Ранее до JDK 8 при реализации интерфейса мы должны были обязательно реализовать все его методы в классе. А сам интерфейс мог содержать только определения методов без конкретной реализации. В JDK 8 была добавлена такая функциональность как методы по умолчанию . И теперь интерфейсы кроме определения методов могут иметь их реализацию по умолчанию, которая используется, если класс, реализующий данный интерфейс, не реализует метод. Например, создадим метод по умолчанию в интерфейсе Printable:

interface Printable < default void print()< System.out.println("Undefined printable"); >>

Метод по умолчанию — это обычный метод без модификаторов, который помечается ключевым словом default . Затем в классе Journal нам необязательно этот метод реализовать, хотя мы можем его и переопределить:

class Journal implements Printable < private String name; String getName()< return name; >Journal(String name) < this.name = name; >>

Статические методы

Начиная с JDK 8 в интерфейсах доступны статические методы — они аналогичны методам класса:

interface Printable < void print(); static void read()< System.out.println("Read printable"); >>

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

public static void main(String[] args)

Приватные методы

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

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

public class Program < public static void main(String[] args) < Calculatable c = new Calculation(); System.out.println(c.sum(1, 2)); System.out.println(c.sum(1, 2, 4)); >> class Calculation implements Calculatable < >interface Calculatable < default int sum(int a, int b)< return sumAll(a, b); >default int sum(int a, int b, int c) < return sumAll(a, b, c); >private int sumAll(int. values) < int result = 0; for(int n : values)< result += n; >return result; > >

Константы в интерфейсах

Кроме методов в интерфейсах могут быть определены статические константы:

interface Stateable

Хотя такие константы также не имеют модификаторов, но по умолчанию они имеют модификатор доступа public static final , и поэтому их значение доступно из любого места программы.

public class Program < public static void main(String[] args) < WaterPipe pipe = new WaterPipe(); pipe.printState(1); >> class WaterPipe implements Stateable < public void printState(int n)< if(n==OPEN) System.out.println("Water is opened"); else if(n==CLOSED) System.out.println("Water is closed"); else System.out.println("State is invalid"); >> interface Stateable

Множественная реализация интерфейсов

Если нам надо применить в классе несколько интерфейсов, то они все перечисляются через запятую после слова implements:

interface Printable < // методы интерфейса >interface Searchable < // методы интерфейса >class Book implements Printable, Searchable < // реализация класса >

Наследование интерфейсов

Интерфейсы, как и классы, могут наследоваться:

interface BookPrintable extends Printable

При применении этого интерфейса класс Book должен будет реализовать как методы интерфейса BookPrintable, так и методы базового интерфейса Printable.

Вложенные интерфейсы

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

class Printer < interface Printable < void print(); >>

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

public class Journal implements Printer.Printable < String name; Journal(String name)< this.name = name; >public void print() < System.out.println(name); >>

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

Printer.Printable p =new Journal("Foreign Affairs"); p.print();

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

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

public class Program < public static void main(String[] args) < Printable printable = createPrintable("Foreign Affairs",false); printable.print(); read(new Book("Java for impatients", "Cay Horstmann")); read(new Journal("Java Dayly News")); >static void read(Printable p) < p.print(); >static Printable createPrintable(String name, boolean option) < if(option) return new Book(name, "Undefined"); else return new Journal(name); >> interface Printable < void print(); >class Book implements Printable < String name; String author; Book(String name, String author)< this.name = name; this.author = author; >public void print() < System.out.printf("%s (%s) \n", name, author); >> class Journal implements Printable < private String name; String getName()< return name; >Journal(String name) < this.name = name; >public void print() < System.out.println(name); >>

Метод read() в качестве параметра принимает объект интерфейса Printable, поэтому в этот метод мы можем передать как объект Book, так и объект Journal.

Метод createPrintable() возвращает объект Printable, поэтому также мы можем возвратить как объект Book, так и Journal.

Foreign Affairs Java for impatients (Cay Horstmann) Java Dayly News

Что такое имплементация в java

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь

Язык интерфейса

«Программистами не рождаются» © 2024 JavaRush

Скачивайте наши приложения

«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Что такое интерфейсы

Java-университет

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

ArrayList list = new ArrayList<>();

Мы написали поведение программы в 100500 строк кода, где использовался этот список строк, и для оптимизации работы использовали методы специфичные для класса ArrayList . Например ensureCapacity(). Пока строки добавляются в конец списка, у нас всё прекрасно и быстро работает. Но вот у нас возникла потребность переориентировать нашу программу на немного другой вид работ, где строки добавляются преимущественно в начало списка. Для такого характера нагрузки гораздо больше подходит LinkedList . Но если мы захотим перевести свою программу из 100500 строк кода на рельсы LinkedList , то нам понадобится отыскать и убрать использование специфичных для ArrayList методов, возможно местами сильно меняя логику отдельных участков программы. Если бы мы использовали только те методы, которые имеются и в ArrayList , и в LinkedList , то нам бы этого делать не пришлось. Мы бы могли всего лишь изменить одну строчку кода — объявление списка:

LinkedList list = new LinkedList<>();

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

AbstractList list = new ArrayList<>();

И смогли бы быстро переключить реализацию вот так:

AbstractList list = new LinkedList<>();

Но в этом случае, классы, которые мы можем использовать в нашей программе, ограничены только потомками класса AbstractList , даже если если есть более подходящие под задачу классы, не являющиеся потомками AbstractList , но имеющие те же методы с тем же поведением. Как быть? Именно поэтому были изобретены интерфейсы. Интерфейс — это такое соглашение о наборе методов и их поведении, которое могут обязаться соблюдать совершенно не связанные классы, позволяя ссылаться на любой из них с помощью единой ссылки. Например так:

List list; list = new ArrayList<>(); list = new LinkedList<>(); list = new AnotherListClass<>();
  • Интерфейс это контракт (соглашение) о поведении.
  • Множество классов, даже не связанных отношением наследования, могут объявить, что они обязуются соблюдать этот контракт (имплементация интерфейса).
  • Вынесение описания поведения в отдельный интерфейс очень удобно, так как увеличивает гибкость кода, позволяя переключать реализацию (класс имплементирующий интерфейс) интерфейса, на классы не связанные отношением наследования.

Введение в интерфейсы Java

Java — очень сложно, так говорят… Правда ли это?

7 фактов про Java

Java разработчик: как стать за месяц?

Операторы в Java: Понимание, применение и перегрузка

Нужен ли Spring новичку Java? Что почитать?

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

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

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

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

Java Start: Ваш Билет в Мир Программирования Java!

�� Что вы получите с Java Start:

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

�� Для кого этот курс:

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

�� Почему выбирают Java Start:

  • Прохождение курса в 2-4 недели.
  • Онлайн формат.
  • Разработчик курса: Сергей Немчинский!

Объявление и использование интерфейсов в Java

Для объявления интерфейса в Java используется ключевое слово «interface», за которым следует имя интерфейса. Затем в фигурных скобках перечисляются абстрактные методы, которые должны быть реализованы в классах, использующих данный интерфейс. Например:

```java public interface MyInterface < void myMethod1(); void myMethod2(); >```

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

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

Имплементация интерфейсов в Java

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

Для имплементации интерфейса в классе используется ключевое слово «implements», за которым указывается имя интерфейса. Затем в фигурных скобках следует реализация каждого метода, объявленного в интерфейсе. Например:

```java public interface MyInterface < void myMethod(); >public class MyClass implements MyInterface < @Override public void myMethod() < // Реализация метода myMethod >> ```

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

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

Интерфейсы и наследование в Java

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

Интерфейсы и наследование в Java

Похожие материалы

Java — очень сложно, так говорят… Правда ли это?

7 фактов про Java

Java разработчик: как стать за месяц?

Операторы в Java: Понимание, применение и перегрузка

Нужен ли Spring новичку Java? Что почитать?

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

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

Могу ли я создать объект интерфейса?

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

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

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

Могут ли интерфейсы содержать реализацию методов?

До Java 8 интерфейсы могли содержать только абстрактные методы. Начиная с Java 8, интерфейсы могут содержать методы с реализацией, называемые «default» методами.

Что такое функциональный интерфейс?

Функциональный интерфейс — это интерфейс, который содержит только один абстрактный метод. Они часто используются в лямбда-выражениях.

Могут ли интерфейсы содержать переменные?

Да, интерфейсы могут содержать переменные, но они автоматически становятся public, static и final.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *