Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/40: Рейтинг темы: голосов - 40, средняя оценка - 4.73
4 / 4 / 7
Регистрация: 12.12.2014
Сообщений: 123
1

Не могу найти нормальное объяснение, что такое замыкание(closure) в java.

28.06.2017, 07:34. Показов 7175. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу найти нормальное объяснение, что такое замыкание(closure) в java. Можете привести пример? Я так понял, это когда мы можем обратиться к какой нибудь переменной за пределами функции, в которой мы находимся
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.06.2017, 07:34
Ответы с готовыми решениями:

Что такое замыкание?)
Ребят всем привет)Обьясните пожалучйста простым нормальным языком что такое замыкание и для чего...

Что такое транзитивное замыкание?
Можете привести парочку простых примеров, а то не очень понял что это такое и как применяется.

Что такое логические операции (желательно объяснение на примере)
Оператор Значение & И | ИЛИ ^ Исключающее ИЛИ && Укороченное И || Укороченное ИЛИ ! НЕ...

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

2
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
28.06.2017, 08:38 2
https://habrahabr.ru/company/piter/blog/281026/
0
164 / 170 / 139
Регистрация: 28.11.2016
Сообщений: 301
29.06.2017, 11:25 3
Лучший ответ Сообщение было отмечено wondermilk как решение

Решение

Кликните здесь для просмотра всего текста
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
public class MyClass {
    private String extString = "String from External Class";
 
    private class Closure {
 
        public String showInt() {
            return ("String from CLosuer");
        }
 
        public String showExt() {
            return (MyClass.this.extString);
        }
 
    }
 
    public Closure getClosure() {
        return new Closure();
    }
 
    // Метод создает экземпляр внутреннего класса Closure чтобы тот вытащил для него переменную класса
    // extString которая и так доступна
    // СMyClass >> extString >> method >> Closure.showExt() >> extString  круг замкнулся
 
    public void demoClosure() {
        System.out.println("Direct show   string demo:" + extString);
        System.out.println("Callback via Closure demo:" + getClosure().showExt());
 
    }
 
 
    // Метод открывает вызывает анонимный класс на базе интерфейса IClosure чтобы тот
    // вытащил для него переменную класса extString которая и так доступна
    // СMyClass >> extString >> method >> new IClosure.getVar >> extString  круг замкнулся
    public void demoClosure2() {
        System.out.println("Direct show   string demo:" + extString);
        System.out.println("Callback via Closure demo:" + getClosure2().getVar());
 
    }
 
    public ICLosure getClosure2() {
        return (new ICLosure() {
            @Override
            public String getVar() {
                return MyClass.this.extString;
            }
        });
    }
 
 
    public void demoClosure3() {
 
        // Метод открывает внутренний класс чтобы тот вытащил для него переменную класса
        // extString которая находится в классе  класс >> extString >> метод >> ICLousure >> extString >> метод
 
        String s = (new ICLosure() {
            @Override
            public String getVar() {
                return MyClass.this.extString;
            }
        }).getVar();
        System.out.println("Direct show   string demo:" + extString);
        System.out.println("Callback via Closure demo:" + s);
 
 
        // Метод открывает внутренний класс чтобы тот вытащил для него переменную
        // ext2 которая находится в самом методе  круг замкнулся
        String ext2 = "Ext2 String in Method";
        String s2 = (new ICLosure() {
            @Override
            public String getVar() {
                return ext2;
            }
        }).getVar();
 
        System.out.println("Direct show   string demo:" + ext2);
        System.out.println("Callback via Closure demo:" + s);
 
 
        // Метод открывает внутренний класс прямо внутри println чтобы тот вытащил для него переменную
        // ext4 которая находится в самом методе круг замкнулся  метод ext4 >> IClosure(){} >> ext4 >> метод
        String ext4 = "Ext4 String in Method";
        System.out.println("Direct show   string demo:" + ext4);
        System.out.println("Callback via Closure demo:" + new ICLosure() {
            @Override
            public String getVar() {
                return ext4;
            }
        }.getVar());
 
    }
 
 
    public static void main(String[] args) {
        MyClass mc = new MyClass();
        mc.demoClosure();
        mc.demoClosure2();
        mc.demoClosure3();
 
    }
}

Смотрите код. Closure (замыкание) это когда внутренний класс или анонимный класс созданный на базе интерфейса
лезет на тот же уровень из которого создан и пытается получить доступ к переменным на этом уровне.
Образно говоря мы сидим на полу, рядом лежит книга, мы ее открываем и фоткаем. Смотрим на фото.
Потом делаем в полу дыру, из дыры в полу вылезает рука с мобилой, фотографирует эту же книгу, затем
заливает все скажем синим цветом и пересылает фото нам.
Мы смотрим на оригинальное фото и залитое синим цветом. Синее фото результат работы замыкания.
Замыкание это создание экземпляра класса, который потом возвращает нам те же переменные.
CallBack функция это функция которая возвращает нам экземпляр внутреннего класса, который мы и сами
могли создать.
Особая жесть, когда мы вызываем callback метод, который создает экземпляр внутреннго класса, который (внутренний класс) в свою очередь берет поле внешнего класса (того в котором мы сидим) и возвращает нам это поле.
То есть можно было просто вызвать поле var и посмотреть.
Но можно вот так callbackk() >> new InnerClass(){} >> new InnerClass().getField()
Замыкание как раз такого типа вещь.
Мы создаем экземпляр внутреннего класса и он, этот экземпляр лезет к переменным в данном методе или выше в классе, включая кстати private использует их и возвращает их нам.
В коде есть комментарии, в который расписано где и как получается замыкание.
1
29.06.2017, 11:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2017, 11:25
Помогаю со студенческими работами здесь

Нормальное человеческое объяснение Литералам
Ребят,кто может объяснить просто и понятно что такое литералы?У меня так и не сложилась понятное...

Оператор =. Не могу найти объяснение ситуации
вот этот код работает безошибочно и выдаёт всегда верные результаты qDebug() << "oX...

Жесткий диск Seagate Momentus 5400.3, короткое замыкание по линии 5 вольт, не могу найти причину
Добрый вечер господа, спасибо за внимание, буду благодарен подсказке. 3 5-вольтовых контакта...

Что такое |= в java?
Уважаемые киберфорумцы, встретил такой код:// ставим флаг, чтобы уведомление пропало после нажатия...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru