Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.06.2020
Сообщений: 19

Для чего нужны интерфейсы?

24.07.2022, 01:13. Показов 5141. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я посмотрел вокруг и тоже решил позадавать тупые вопросы. Например, я не могу понять, зачем нужны интерфейсы как таковые? Что мешает реализовывать методы без использования интерфейсов? Почему-то большинство людей отвечают на этот вопрос в стиле "ну интерфейс - это такая штука, ей можно делать то-другое", а после вопроса "кто мешает делать то же самое без интерфейса? Вот убираешь "implements"... ии?" замолкают.
Из всего, что я выяснил, у меня получилось два пункта: первое - по интерфейсу можно группировать разные объекты (например, запихнуть в ArrayList), второе - чтобы в большом проекте не провтыкать вещи, которые должен реализовывать определённый класс. Имеют ли мои выводы отношение к жизни и можно ли к ним добавить ещё что-то?
Ну или ткните в умную литературу, только о том, что такое интерфейс и как его делать я и так начитался.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2022, 01:13
Ответы с готовыми решениями:

Для чего нужны параметры метода? Return для хранения данных?
Привет всем! Подскажите пожалуйста, параметры метода нужны для того что бы получать значения с вызывающего класса? И не важно как именуется...

Для чего нужны эти скобки?
Доброго времени суток! Я начинающий в Java и вот совсем недавно занялся Swing. На Швабре прочитал статью о том как создать свой LaF(Look...

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

91
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.08.2022, 15:35
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от korvin_ Посмотреть сообщение
С чего ты взял? Всё прекрасно работает. =)
Ты прав.
А если прикрутить, например, DynamicProxy и избавиться от передачи ссылки на вызываемый метод?
Цитата Сообщение от korvin_ Посмотреть сообщение
static <A> void printArea(ToDoubleFunction<A> area, A figure) {
System.out.println(area.applyAsDouble(fi gure));
}
Просто очень странно выглядит передача ссылки на метод для того, чтобы его сразу вызвать внутри другого метода.

Без функциональных интерфейсов вовсе:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
static void printArea(double x) {
  System.out.println(x);
}
 
    public static void main(String[] args) {
        printArea(new Square(2).area());
        printArea(new Rectangle(2, 3).area());
        printArea(new Circle(1).area());
 
        printArea(new Square(2).area());
        printArea(new Rectangle(2, 3).area());
        printArea(new Circle(1).area());
    }
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
02.08.2022, 16:39
Цитата Сообщение от Arsegg Посмотреть сообщение
Просто очень странно выглядит передача ссылки на метод для того, чтобы его сразу вызвать внутри другого метода.
Ну так не вызывай сразу...

Java
1
2
3
4
5
6
7
    static void <A> printArea(ToDoubleFunction<A> area, A figure) {
        if (LocalDate.now().dayOfWeek() == DayOfWeek.MONDAY) {
            System.out.println("It's a hard day");
        } else {
            System.out.println(area.applyAsDouble(figure));
        }
    }
Добавлено через 57 секунд
Цитата Сообщение от Arsegg Посмотреть сообщение
Просто очень странно выглядит передача ссылки на метод для того, чтобы его сразу вызвать внутри другого метода.
https://stackoverflow.com/ques... th-lambdas

Добавлено через 46 секунд
Цитата Сообщение от Arsegg Посмотреть сообщение
А если прикрутить, например, DynamicProxy и избавиться от передачи ссылки на вызываемый метод?
Прикрути. Но к чему эти сложности? )
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.08.2022, 17:00
korvin_, ленивая инициализация немного мимо кассы. Скорее это паттерн Стратегия. Но какая-то кривая реализация без интерфейсов.

Без интерфейсов можно и так:
Java
1
2
3
4
5
6
7
8
9
10
void printArea(Object o) {
  final var result = o instanceof Square
    ? ((Square) o).area()
    : o instanceof Rectangle
    ? ((Rectangle) o).area()
    : o instanceof Circle
    ? ((Circle) o).area()
    : Double.NaN;
  System.out.println(result);
}
Либо положить в Map'у твои ToDoubleFunction'ы и пробегаться по ключам на instanceof, но все равно это криво и не расширяемо.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
02.08.2022, 20:17
Цитата Сообщение от Arsegg Посмотреть сообщение
Без интерфейсов можно и так:
Только для каждой новой фигуры придётся менять реализацию printArea.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.08.2022, 20:41
korvin_, ваша реализация тоже не лишена данного недостатка - требуется явно передавать ссылку на метод. + Можно передать любой другой метод, вместо area(), что приведет к нарушению контракта метода printArea().
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
02.08.2022, 23:48
Цитата Сообщение от Arsegg Посмотреть сообщение
ваша реализация тоже не лишена данного недостатка - требуется явно передавать ссылку на метод
Я и не писал, что это идеальный/лучший подход.

Цитата Сообщение от Arsegg Посмотреть сообщение
Можно передать любой другой метод, вместо area(),
Ну так это дополнительная гибкость. )

Цитата Сообщение от Arsegg Посмотреть сообщение
что приведет к нарушению контракта метода printArea().
Нет, не приведёт. С тем же успехом произвольная реализация метода area интерфейса Figure может делать что угодно и нарушать любые контракты.
0
Модератор
Эксперт Java
 Аватар для alecss131
2894 / 1400 / 412
Регистрация: 11.08.2017
Сообщений: 4,484
Записей в блоге: 2
03.08.2022, 21:26
Цитата Сообщение от korvin_ Посмотреть сообщение
Например =)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
template <typename T, typename R>
void print_area(R (*area)(T&), T& figure)
{
    std::cout << area(figure) << std::endl;
}
 
namespace square
{
    struct T
    {
        int side;
        T(int side) : side(side) {}
    };
 
    int area(T& square) { return square.side * square.side; }
}
 
namespace rectangle
{
    struct T
    {
        double width;
        double height;
 
        T(double width, double height) : width(width), height(height) {}
    };
    
    double area(T& rect) { return rect.width * rect.height; }
}
 
int main()
{
    square::T s(2);
    rectangle::T r(2, 3);
 
    print_area(&square::area, s);
    print_area(&rectangle::area, r);
    
    return 0;
}
Для чего такие сложности? И вообще странный код для плюсов. Проще сделать так. Только надо помнить/знать, что шаблоны это по сути сахар, которого нету в рантайме. Вот пример кода.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
template<typename T>
void printArea(const T &t) {
    std::cout << t.area() << std::endl;
}
 
class Rect{
    int a;
    int b;
public:
    explicit Rect(int w, int h) : a{w}, b{h} {}
    [[nodiscard]] int area() const { return a * b; }
};
 
class Square{
    int a;
public:
    explicit Square(int w) : a{w} {}
    [[nodiscard]] int area() const { return a * a; }
};
 
class Circle{
    float a;
public:
    explicit Circle(float r) : a{r} {}
    [[nodiscard]] float area() const { return 3.14f * a * a; }
};
 
int main() {
    Rect r{2, 3};
    Square s{2};
    Circle c{2.0f};
    printArea(r);
    printArea(s);
    printArea(c);
    return 0;
}

Вот это
C++
1
2
template<typename T>
void printArea(const T &t)
раскроется в
C++
1
2
3
void printArea(const Rect &t)
void printArea(const Square &t)
void printArea(const Circle &t)
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
04.08.2022, 11:04
Цитата Сообщение от alecss131 Посмотреть сообщение
Для чего такие сложности?
Для того, что мы тут Java обсуждаем. Если прочитать контекст, то всё станет понятней.
0
Модератор
Эксперт Java
 Аватар для alecss131
2894 / 1400 / 412
Регистрация: 11.08.2017
Сообщений: 4,484
Записей в блоге: 2
04.08.2022, 11:09
Цитата Сообщение от korvin_ Посмотреть сообщение
Java обсуждаем
Очевидно
Цитата Сообщение от korvin_ Посмотреть сообщение
всё станет понятней
Неа...
0
0 / 0 / 0
Регистрация: 25.07.2022
Сообщений: 7
11.08.2022, 12:40
Добрый День, я осваиваю объектое программирование и задавал также себе вопрос, для чего нужны интерфейсы.
Подскажите пожалуйста с примером прстым зачем нужны интерфейсы. Вопрос чтобы лучше понять предназначение интерфейсов, а не дискутировать. Спасибо
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38210 / 21143 / 4313
Регистрация: 12.02.2012
Сообщений: 34,757
Записей в блоге: 14
11.08.2022, 13:02
Berliner, вот классический пример на тему "абстрактные классы"

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
abstract class Pet {
  abstract void voice(); // тела нет
}
 
class Cat extends Pet {
  @Override
  void voice() { System.out.println("Мяу-мяу!!!");}
}
 
class Dog extends Pet {
  @Override
  void voice() { System.out.println("Гав-гав!!!");}
}
class Bird extends Pet {
  @Override
  void voice() { System.out.println("Чик-чирик!!!");}
}
 
public class Main
{
  public static void main(String [] args) {
     Pet [ ] singer = new Pet[3]; // массив ссылок на Pet
     singer[0] = new Cat();
     singer[1] = new Dog();
     singer[2] = new Bird();
     for (int i=0; i<3; i++)
     {     System.out.println(singer[i]);
           singer[i].voice();
     }       
  }
}
А вот то же - но с интерфейсами:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
interface IPet
{
    public void voice();
}
 
class Cat implements IPet
{
    public void voice() { System.out.println("Мяу-мяу!!!");}
}
 
class Dog implements IPet
{
    public void voice() { System.out.println("Гав-гав!!!");}
}
 
class Bird implements IPet
{
    public void voice() { System.out.println("Чик-чирик!!!");}
}
 
public class Main
{
   public static void main(String[] args) {
 
     IPet [ ] singer = new IPet[3]; // массив ссылок на Pet
     singer[0] = new Cat();
     singer[1] = new Dog();
     singer[2] = new Bird();
     for (int i=0; i<3; i++)
     {
           System.out.println(singer[i]);
           singer[i].voice();
     }       
        
  }
}
Казалось бы, "так на так"... Но в Java нет множественного наследования. А вот интерфейсов можно у класса реализовать несколько.
0
0 / 0 / 0
Регистрация: 25.07.2022
Сообщений: 7
11.08.2022, 16:47
спасибо за пример. Буду разбираться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2022, 16:47

Для чего нужны custom Tags ?
Для чего вы используете custom Tags? Приведите конкретные примеры.

Struts для чего они нужны?
Привет всем! Сразу прошу не бить ногами, если кому-то вопрос показался идиотским. Но дело в том, что уже некоторое время пытаюсь...

Зачем нужны интерфейсы?
Начинаю изучать JAVA , есть такое понятие как интерфейс, вот, умею пользоваться, но не понимаю зачем они нужны. Зачем нужны интерфейсы?

Что такое Ant и Struts, и для чего нужны?
Доброго времени суток! Во многих IDE очень много упоминается про Ant и Struts. Хотелось бы узнать по подробнее от профессионалов, что...

Коллекции List/ArrayList: чем отличаются и для чего нужны?
ОБЪЯСНИТЕ ЧТО ТАКОЕ LIST И ARRAYLIST,ЧЕМ ОНИ ОТЛИЧАЮТСЯ И ДЛЯ ЧЕГО НУЖНЫ ВОТ ЕЩЕ ДВА ЗАДАНИЯ,Я ЧТО-ТО ПОПЫТАЛСЯ СДЕЛАТЬ,НО ПОКА ЧТО НЕ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
92
Ответ Создать тему
Новые блоги и статьи
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
Вот представьте что вам дали бессмертие.
kumehtar 24.07.2026
Вот представьте что вам дали бессмертие, ничего более не меняя. Вообще ничего, только бессмертие в нынешнем виде. Рады были бы? Что бы вы тут делали всё это время? Никакой пенсии. Никакого нового. . .
сукцессия 41
anaschu 24.07.2026
Численная верификация бифуркации в агентной модели лесной сукцессии: от одного параметра к ансамблю Автор: пользователь @Shumilov_AS | Раздел: Прикладная математика / Численные методы Кратко. . .
сукцессия 40. Ансамблевая кластерная параметризаци, часть 1.
anaschu 24.07.2026
Пр# Сопровождение научной статьи ИИ-ассистентом: подготовка публикации и калибровка агентно-ориентированной модели сукцессии микоризных систем **Полевые заметки о двухнедельной совместной работе**. . .
Теория всего 12. ВГК на планете в стратегической игре "терра"
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru