---
title: Методы интерфейса
seo:
  title: Методы интерфейса — Java Developer
  description: Тема «Методы интерфейса» для собеседования Java Developer. Что такое StringJoiner? Что такое default-методы интерфейса?
---

[Все темы Java Developer](/java-developer)

## <strong>Что такое</strong> <code>StringJoiner</code><strong>?</strong> [#q-14bee738d69b813e8946d6fe1da12d5c]

<code>StringJoiner</code> — это класс в Java, введенный в Java 8 в пакете
<code>java&#46;util</code>, который используется для построения
последовательности символов в виде строки с разделителями. Он предназначен для
удобной конкатенации строк с заданным разделителем и опциональным префиксом и
суффиксом.

<strong>Основные характеристики и методы</strong> <code>StringJoiner</code>
<strong>&#58;</strong>

{/* prettier-ignore */}
1. <strong>Конструкторы</strong>&#58;

    - <code>StringJoiner&#40;CharSequence delimiter&#41;</code>&#58; Создает <code>StringJoiner</code> с указанным разделителем.

    - <code>StringJoiner&#40;CharSequence delimiter&#44; CharSequence prefix&#44; CharSequence suffix&#41;</code>&#58; Создает <code>StringJoiner</code> с указанным разделителем, префиксом и суффиксом.

1. <strong>Методы</strong>&#58;

    - <code>add&#40;CharSequence csq&#41;</code>&#58; Добавляет строку к последовательности.

    - <code>toString&#40;&#41;</code>&#58; Возвращает текущее состояние последовательности в виде строки.

    - length()&#58; Возвращает длину строки, которую вернёт toString(), включая разделители, префикс и суффикс. Это не число добавленных элементов.

    - <code>setEmptyValue&#40;CharSequence emptyValue&#41;</code>&#58; Устанавливает значение по умолчанию, которое будет возвращено методом <code>toString&#40;&#41;</code>, если последовательность пуста.

1. <strong>Пример использования</strong>&#58;

    ```java
    import java.util.StringJoiner;

    public class Main {
        public static void main(String[] args) {
            StringJoiner joiner = new StringJoiner(", ", "[", "]");
            joiner.add("Apple");
            joiner.add("Orange");
            joiner.add("Banana");

            String result = joiner.toString();
            System.out.println(result);  // Выведет: [Apple, Orange, Banana]
        }
    }
    ```

    В приведенном примере <code>StringJoiner</code> создается с разделителем <code>&#34;&#44; &#34;</code>, префиксом <code>&#91;</code> и суффиксом <code>&#93;</code>. Затем к нему добавляются строки <code>&#34;Apple&#34;</code>, <code>&#34;Orange&#34;</code> и <code>&#34;Banana&#34;</code>, и результат выводится как <code>&#91;Apple&#44; Orange&#44; Banana&#93;</code>.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## Что такое default-методы интерфейса? [#q-14bee738d69b81f0ad6fc975edda5276]

<code>Default</code> методы интерфейса введены в Java 8 и представляют собой
методы, которые могут иметь реализацию по умолчанию в интерфейсе. Ранее
интерфейсы в Java могли содержать только абстрактные методы (методы без тела),
которые требовали реализации в классах, реализующих интерфейс.
<code>Default</code> методы изменяют эту концепцию, позволяя добавлять методы с
реализацией в интерфейсы.

<strong>Основные особенности</strong> <code>default</code>
<strong>методов&#58;</strong>

1. <strong>Синтаксис</strong>&#58; <code>Default</code> методы объявляются с
   ключевым словом <code>default</code> перед сигнатурой метода. Они могут иметь
   тело метода (реализацию).

   Пример&#58;

   ```java
   public interface MyInterface {
       // Абстрактный метод
       void abstractMethod();

       // Default метод с реализацией по умолчанию
       default void defaultMethod() {
           System.out.println("Default implementation of defaultMethod");
       }
   }
   ```

1. <strong>Цель</strong>&#58; <code>Default</code> методы позволяют добавлять
   новые методы в существующие интерфейсы без необходимости изменять код всех
   классов, которые реализуют интерфейс. Это особенно полезно для добавления
   новой функциональности в интерфейсы после их первоначального определения без
   нарушения обратной совместимости.

1. <strong>Пример использования</strong>&#58;

   ```java
   public interface Vehicle {
       void start();

       default void stop() {
           System.out.println("Stopping the vehicle");
       }
   }

   public class Car implements Vehicle {
       @Override
       public void start() {
           System.out.println("Starting the car");
       }
   }

   public class Main {
       public static void main(String[] args) {
           Car car = new Car();
           car.start();  // Выведет: Starting the car
           car.stop();   // Выведет: Stopping the vehicle
       }
   }
   ```

   В приведенном примере <code>Vehicle</code> — это интерфейс с методами <code>start&#40;&#41;</code> (абстрактный) и <code>stop&#40;&#41;</code> (default метод с реализацией). Класс <code>Car</code> реализует интерфейс <code>Vehicle</code>, переопределяя абстрактный метод <code>start&#40;&#41;</code>. Метод <code>stop&#40;&#41;</code> вызывается на объекте типа <code>Car</code>, используя его реализацию default метода из интерфейса <code>Vehicle</code>.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Что такое</strong> <code>static</code> <strong>метод интерфейса?</strong> [#q-14bee738d69b814eb93afff8cc1540c0]

<code>Static</code> метод интерфейса (<code>static method in interfaces</code>)
— это метод, который объявлен с модификатором <code>static</code> внутри
интерфейса в Java. Эта возможность была введена в Java 8 и является частью
расширения функциональности интерфейсов.

<strong>Основные характеристики</strong> <code>static</code>
<strong>методов интерфейса&#58;</strong>

1. <strong>Синтаксис</strong>&#58; Static методы в интерфейсе объявляются как
   статические методы с реализацией по умолчанию. Они не требуют создания
   экземпляра интерфейса для их вызова.

   Пример&#58;

   ```java
   public interface MyInterface {
       // Static метод с реализацией
       static void staticMethod() {
           System.out.println("Static method in interface");
       }
   }
   ```

1. <strong>Цель</strong>&#58; Static методы интерфейса предоставляют способ
   организации вспомогательной функциональности, которая связана с интерфейсом,
   но не зависит от конкретной реализации объектов интерфейса. Они могут быть
   использованы для утилитарных методов, фабричных методов или любых других
   операций, которые не требуют доступа к состоянию экземпляра.

1. <strong>Пример использования</strong>&#58;

   ```java
   public interface Calculator {
       // Абстрактный метод
       int calculate(int a, int b);

       // Static метод в интерфейсе
       static Calculator getInstance() {
           return (a, b) -> a + b;
       }
   }

   public class Main {
       public static void main(String[] args) {
           // Вызов static метода интерфейса
           Calculator calculator = Calculator.getInstance();
           int result = calculator.calculate(5, 3);
           System.out.println("Result: " + result);  // Выведет: 8
       }
   }
   ```

   В приведенном примере <code>Calculator</code> — это интерфейс с абстрактным методом <code>calculate&#40;int a&#44; int b&#41;</code> и статическим методом <code>getInstance&#40;&#41;</code>, который возвращает экземпляр реализации <code>Calculator</code>. Метод <code>getInstance&#40;&#41;</code> используется для создания объекта интерфейса без необходимости его конкретной реализации.

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::

---

## <strong>Как вызывать</strong> <code>static</code> <strong>метод интерфейса?</strong> [#q-14bee738d69b81ce9b97f7f6456cb7c6]

Вызов <code>static</code> метода интерфейса в Java осуществляется напрямую через имя интерфейса, используя точечную нотацию. Это возможно с момента появления <code>static</code> методов в интерфейсах, начиная с Java 8.

<strong>Вот как можно вызвать</strong> <code>static</code>
<strong>метод интерфейса&#58;</strong>

1. <strong>Через имя интерфейса</strong>&#58;

   ```java
   public interface MyInterface {
       static void staticMethod() {
           System.out.println("Static method in MyInterface");
       }
   }

   public class Main {
       public static void main(String[] args) {
           // Вызов static метода через имя интерфейса
           MyInterface.staticMethod();
       }
   }
   ```

1. При вызове из другого класса также указывайте имя интерфейса&#58; MyInterface.staticMethod(). Статические методы интерфейса не наследуются реализующими классами.

   ```java
   public interface MyInterface {
       static void staticMethod() {
           System.out.println("Static method in MyInterface");
       }
   }

   public class AnotherClass {
       public static void main(String[] args) {
           // Вызов static метода интерфейса MyInterface
           MyInterface.staticMethod();
       }
   }
   ```

:::note[Ссылки для изучения]

1. [Функциональные интерфейсы в Java](https://javarush.com/groups/posts/2866-funkcionaljhnihe-interfeysih-v-java)
   :::
