Предисловие
Недавно я выучил Java и вступил в контакт с механизмом обратного вызова (обратный вызов). Когда я впервые встретился, я чувствовал себя довольно смущенным, и соответствующие объяснения, которые я искал в Интернете, либо просто упомянули, либо сказали просто, как будто я определил обратный вызов. Конечно, после того, как я понял обратный вызов, я пошел прочитать различные объяснения онлайн, и проблем не было. Однако для меня, кто является новичком, мне не хватает постепенного процесса.
Обратный вызов-это двухсторонний режим вызова. Что это значит? То есть призванная сторона также позвонит другой стороне, когда она будет вызвана , которая называется обратным вызовом. «Если ты позвонишь мне, я перезвоню».
Не понимают? Неважно, сначала взгляните на этот классический способ использования обратных вызовов:
Интерфейс класса A реализует INA - Фон 1
Класс A содержит ссылку B класса B - фон 2
Класс B имеет метод с параметром INA Test (INA A) - Фон 3
Объект A A вызовет метод B к себе, тест (а) - этот шаг эквивалентен вам, позвоните мне
Затем B может вызвать метод INA в методе испытания - этот шаг эквивалентен я вам вызову
Прежде чем начать, представьте себе сценарий: дети детского сада только что выучили дополнение в течение 10.
Ниже я опишу свое личное понимание механизма обратного вызова в порядке от мелкого до глубокого. Если есть неуместность, я надеюсь, что дам вам совет!
Глава 1. Происхождение истории
Учитель детского сада написал формулу «1 + 1 =» на доске, а Сяо Мин заполнит пробелы.
Поскольку я выучил добавление менее 10, Сяо Мин может полностью рассчитать этот вопрос. Код для моделирования процесса выглядит следующим образом:
открытый класс студент {частная строка имени = null; Public Student (String name) {// TODO Автогенерированный конструктор Stub This.name = name; } public void setName (string name) {this.name = name; } private int calcadd (int a, int b) {return a + b; } public void fillBlank (int a, int b) {int result = calcadd (a, b); System.out.println (name + "Mental Arithmetic:" + a + " +" + b + "=" + result); }} Когда Сяо Мин заполнял пробелы , он непосредственно рассчитал CLACADD и обнаружил, что результат был 2, и написал результат в пространстве. Тестовый код заключается в следующем:
открытый тест класса {public static void main (string [] args) {int a = 1; int b = 1; Студент S = новый студент ("Xiao Ming"); s.fillblank (a, b); }} Результаты работы следующие:
Ментальная арифметика Сяо Мин: 1 + 1 = 2
Этот процесс осуществляется полностью одним объектом Encement только для учащихся класса и не включает механизм обратного вызова.
Глава 2. Поиск проблем для учителей детского сада
Во время перерыва у учителя детского сада внезапно появился прихоть и написал «168 + 291 =» на доске, чтобы Сяо Мин завершил его, а затем вернулся в офис.
Цветочный руб! Почему все учителя не могут ладить с Сяо Мин? Это, очевидно, за пределами правил, хорошо? В настоящее время Сяо Мин, очевидно, не смог завершить его умственной арифметикой, как указанная выше. Когда он был смущен, Сяо Хонг в классе передал калькулятор, который мог только рассчитать добавление (спекуляция)! ! ! ! Сяо Мин узнал, как использовать калькулятор, поэтому он рассчитал результаты через калькулятор и завершил заполнение вдзлатых.
Код для калькулятора:
открытый класс калькулятор {public int add (int a, int b) {return a + b; }} Измените класс ученика и добавьте метод для использования калькулятора:
открытый класс студент {частная строка имени = null; Public Student (String name) {// TODO Автогенерированный конструктор Stub This.name = name; } public void setName (string name) {this.name = name; } @Suppresswarnings ("неиспользованный") private int calcadd (int a, int b) {return a + b; } private int useCalculator (int a, int b) {return new Calculator (). Add (a, b); } public void fillblank (int a, int b) {int result = useCalculator (a, b); System.out.println (name + "Использовать калькулятор:" + a + " +" + b + "=" + result); }} Тестовый код заключается в следующем:
открытый тест класса {public static void main (string [] args) {int a = 168; int b = 291; Студент S = новый студент ("Xiao Ming"); s.fillblank (a, b); }} Результаты работы следующие:
Xiao Ming использует калькулятор: 168 + 291 = 459
Механизм обратного вызовов не был вовлечен в этот процесс, но некоторые работы Сяо Мин были перенесены и будут помогать калькулятор.
3. Учитель детского сада вернулся
Когда я обнаружил, что Сяо Мин завершил добавление 3 цифр, учитель думал, что Сяо Мин был очень умным и талантливым. Таким образом, он написал «26549 + 16487 =» на доске, попросив Сяо Мин заполнить заполнение в бланке перед классом, а затем вернулся в офис.
Сяо Мин посмотрел на маленького друга, который развлекался за пределами класса и не мог не чувствовать себя грустным. Если вы не пойдете на игру, этот перерыв будет разрушен! ! ! ! Глядя на калькулятор, который Сяохон снова передал его, Сяо Мин разработал план: пусть Сяхонд сделает это для него.
Сяо Мин сказал Сяхонгу, что вопрос был «26549 + 16487 =», затем указал на конкретное место для заполнения результатов, а затем повеселился.
Здесь мы не реализуем только Xiaohong, но рассматриваем этот калькулятор, который может рассчитать только добавление и Xiaohong в целом, супер калькулятор, который может рассчитать результаты и заполнять пробелы. Параметры, которые должен пройти этот супер калькулятор, - это два дополнения и положение для заполнения пробелов, и это содержимое необходимо заранее проинформировать, то есть Сяо Мин хочет познакомить часть своих методов Сяо Хонгу. Самый простой способ - рассказать Сяо Хонгу его ссылку и два дополнения вместе.
Следовательно, метод добавления суперкалькулятора должен содержать два операнда и ссылку на сам Сяо Минг, код заключается в следующем:
Общедоступный класс SuperCalculator {public void Add (int a, int b, студент Xiaoming) {int result = a + b; xiaoming.fillblank (a, b, результат); }} Сяо Мин больше не нуждается в умственной арифметике или калькуляторе, поэтому ему нужно только иметь метод, чтобы попросить Сяхонга о помощи. Код заключается в следующем:
открытый класс студент {частная строка имени = null; Public Student (String name) {// TODO Автогенерированный конструктор Stub This.name = name; } public void setName (string name) {this.name = name; } public void callhelp (int a, int b) {new supercalculator (). add (a, b, this); } public void fillblank (int a, int b, int result) {System.out.println (имя + "поиск расчета Xiaohong:" + a + " +" + b + "=" + result); }} Тестовый код заключается в следующем:
открытый тест класса {public static void main (string [] args) {int a = 26549; int b = 16487; Студент S = новый студент ("Xiao Ming"); s.callhelp (a, b); }} Результат работы:
Сяо Мин попросил о помощи Сяхонга для расчета: 26549 + 16487 = 43036
Процесс выполнения: Xiao Ming вызывает метод добавления Xiao Hong (new SuperCalculator()) через свой собственный метод Callhelp и передает свою собственную ссылку (это) в качестве параметра при вызове. После того, как Xiao Hong использует калькулятор для получения результата, он вызывает обратно метод Fillblank Xiao Ming и заполняет результат в пространстве на доске.
Огни и огни! На этом этапе функция обратного вызова официально дебютировала. Метод Fillblank Сяо Мин - это то, что мы часто обращаем к функции.
Таким образом, можно ясно видеть, что Сяо Мин больше не нужно ждать, пока добавление не будет завершено, и результат будет заполнен на доске, прежде чем он сможет повеселиться со своими друзьями. Работа заполнения в удвоении выполняется Xiaohong, супер-калькулятором. Преимущества обратных вызовов начали отражаться.
ГЛАВА 4. ТЕРЕМА У ДВЕРИ
Есть старушка с седыми волосами у входа в детский сад. Она установила там уличную киоску, продавая нездоровую пищу, которая почти истек каждый день, независимо от ветра и дождя. Поскольку я стар, мой разум немного смущен, и я часто не могу понять, сколько денег я заработал. Однажды она случайно услышала, как Сяо Мин хвастается о том, как она боролась с остроумием и мужеством с учителем детского сада с помощью Сяхонга. Итак, моя свекровь решила найти супер-калькулятор с маленькой красной карточкой как ее маленький помощник и предоставить пачку пряных полос Weilong в качестве награды. Сяхонг не мог устоять перед искушением и согласился.
Оглядываясь назад на код в предыдущей главе, мы обнаружили, что параметры, требуемые методом Add Little Red Card Super Calculator, представляют собой две целочисленные переменные и объект для студентов , но старушка не ученица, а маленький поставщик, поэтому она должна вносить изменения здесь. В этом случае для нас естественно думать о наследовании и полиморфизме. Если мы попросим студента Сяо Мин и поставщика старушки унаследовать от родительского класса, то нам нужно только передать ссылку на родительский класс на маленький супер -калькулятор красной карты.
Однако, в реальном использовании, учитывая единственное наследство Java и не желая слишком много выставлять себя другим, мы используем метод наследования от границы раздела для сотрудничества с внутренними классами.
Другими словами, Xiaohong надеется продолжить предоставлять услуги по расчетам детям в классе в будущем и в то же время предоставлять бухгалтерские услуги старушке и даже расширять бизнес других людей в будущем. Таким образом, она согласилась со всеми клиентами методом объединенной обработки, то есть операндов, которые ей нужны, и как это сделать после завершения расчета. Xiaohong превратил этот унифицированный метод в интерфейс и предоставлен всем, код выглядит следующим образом:
публичный интерфейс Dojob {public void fillblank (int a, int b, int result); }Поскольку вдохновение пришло от того, чтобы помочь Сяо Мин заполнить пробелы, Сяхонг сохранила свое первоначальное намерение и рассматривала все свое дело как Fillblank .
В то же время Xiaohong модифицировал свой калькулятор, чтобы он мог обрабатывать разных людей, которые реализуют интерфейс Dojob одновременно. Код заключается в следующем:
Supercalculator public Class {public void add (int a, int b, dojob customer) {int result = a + b; customer.fillblank (a, b, результат); }} После того, как Сяо Мин и старушка получили этот интерфейс, пока они реализовали этот интерфейс, он эквивалентен тем, чтобы сказать Сяхонгу, чтобы справиться с результатами в унифицированной модели и использования внутренних классов, как упоминалось ранее. Код заключается в следующем:
Сяо Мин:
открытый класс студент {частная строка имени = null; Public Student (String name) {// TODO Автогенерированный конструктор Stub This.name = name; } public void setName (string name) {this.name = name; } открытый класс DoHomework реализует Dojob {@Override public void fillblank (int a, int b, int result) {// todo автоматически сгенерированный метод система. }} public void callhelp (int a, int b) {new supercalculator (). add (a, b, new dohomework ()); }} Старушка:
Public Class Seller {Private String name = null; Public Seller (String name) {// TODO Автогенерированный конструктор stub this.name = name; } public void setName (string name) {this.name = name; } открытый класс DoHomework реализует Dojob {@Override public void fillblank (int a, int b, int result) {// todo автоматически сгенерированный метод система. New Supercalculator (). Add (A, B, New Dohomework ()); Процедура тестирования заключается в следующем:
открытый тест класса {public static void main (string [] args) {int a = 56; int b = 31; int c = 26497; int d = 11256; Студент S1 = новый студент ("Xiao Ming"); Продавец S2 = новый продавец ("бабушка"); s1.callhelp (a, b); s2.callhelp (c, d); }} Результаты работы следующие:
Сяо Мин попросил помочь Сяхонгу рассчитать: 56 + 31 = 87
Старушка просит помощь Сяохонгу для урегулирования счетов: 26497 + 11256 = 37753 Юань
Суммировать
Ясно видно, что Сяохонг уже рассматривал этот вопрос как карьеру, и вы узнаете об этом, посмотрев на имя, которое она дала интерфейсу Dojob .
Некоторые люди могут спросить, почему старушка может заработать столько денег, установив киоск? Есть ли проблемы с вашей целью? ! Здесь мы говорим, так это механизм обратного вызова! !
Все, что я знаю, это то, что бизнес Сяхонга продолжал расширяться позже, и до окончания детского сада она наконец купила свой первый дом в своей жизни с деньгами, которые она заработала.
Выше представляет собой интересное и подробное объяснение механизма обратного вызовов (обратный вызов) в Java. Я надеюсь, что всем будет полезно изучать Java. Спасибо за поддержку Wulin.com.