머리말
콜백은 콜백을 의미합니다. Windows 프로그래밍에 익숙한 사람들은 "콜백 함수"네 단어에 익숙해야하지만 Java 프로그래머는 그것에 대해 많이 알지 못할 수도 있습니다. "콜백 함수"또는 "콜백 메소드"는 소프트웨어 설계 및 개발에서 매우 중요한 개념입니다. 언어에 관계없이 프로그래머에게는 매우 필요합니다.
최근에 나는 Java를 배우고 콜백 메커니즘 (콜백)과 접촉했습니다. 내가 처음 만났을 때, 나는 매우 혼란 스러웠으며, 온라인에서 검색 한 관련 설명은 마치 콜백을 정의한 것처럼 방금 언급하거나 간단하게 말했습니다. 물론 콜백을 이해 한 후 온라인으로 다양한 설명을 읽으 러 갔는데 아무런 문제가 없었습니다. 그러나 초보자 인 저에게는 점진적인 과정이 부족합니다. 여기서 나는 콜백 메커니즘에 대한 개인적인 이해를 얕은 곳에서 깊게 설명 할 것입니다. 부적절한 것이 있다면, 나는 당신에게 조언을 드리기를 바랍니다!
시작하기 전에 시나리오를 상상해보십시오. 유치원 어린이는 10 세 이내에 추가를 배웠습니다.
1 장. 이야기의 기원
유치원 교사는 블랙 보드에 "1 + 1 ="공식을 썼으며 Xiao Ming은 공란을 채웠습니다.
Xiao Ming은 10 미만의 추가를 배웠기 때문에이 질문을 혼자서 계산할 수 있습니다. 프로세스를 시뮬레이션하는 코드는 다음과 같습니다.
공개 클래스 학생 {private string name = null; 공개 학생 (문자열 이름) {// todo 자동 생성 생성자 stubthis.name = name;} public void setname (this.name = name;} private int calcadd (int a, int b) {return a + b;} public void fillblank (int b) {int b) {int b) b); system.out.println (이름 + "정신 산술 :" + a + " +" + b + "=" + result);}} Xiao Ming이 공란을 채우고있을 때, 그는 clacadd를 직접 계산하고 결과가 2라는 것을 발견하고 결과를 공간에 썼습니다. 테스트 코드는 다음과 같습니다.
공개 클래스 테스트 {public static void main (String [] args) {int a =; int b =; student s = new student ( "Xiao Ming"); S.fillBlank (a, b);}} 작업 결과는 다음과 같습니다.
Xiao Ming의 정신 산술 : 1 + 1 = 2
이 과정은 전적으로 학생 클래스의 인스턴스 객체만으로 수행되며 콜백 메커니즘이 포함되지 않습니다.
2 장. 유치원 교사를위한 문제에 대한 검색
휴식 시간 동안, 유치원 교사는 갑자기 변덕스러워서 Xiao Ming이 그것을 완성하게하기 위해 "168 + 291 ="를 칠판에 썼다.
꽃 문지름! 왜 모든 교사가 Xiao Ming과 어울릴 수 없습니까? 분명히 규칙을 넘어선 다. 현재 Xiao Ming은 위의 것과 같은 정신 산술로 그것을 완성 할 수 없었습니다. 그가 혼란 스러웠을 때, Xiao Hong은 추가 (수익자) 만 계산할 수있는 계산기를 넘겨 주었다! ! ! ! Xiao Ming은 계산기를 사용하는 방법을 알게되었으므로 계산기를 통해 결과를 계산하고 반 은금을 완성했습니다.
계산기의 코드는 다음과 같습니다.
공개 클래스 계산기 {public int add (int a, int b) {return a + b;}} 학생 수업을 수정하고 계산기를 사용하는 메소드를 추가하십시오.
공개 클래스 학생 {private String name = null; 공개 학생 (문자열 이름) {// todo 자동 생성 생성자 stubthis.name = name;} public void setName (this.name = name;}@suppresswarnings ( "Unused") private int calcadd (int a, int b) {reture + b; int int its int ins usecalcunculation (int in int b) 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 =; int b =; student s = new student ( "Xiao Ming"); S.fillBlank (a, b);}} 작업 결과는 다음과 같습니다.
Xiao Ming은 계산기를 사용합니다 : 168 + 291 = 459
콜백 메커니즘은이 프로세스에 관여하지 않았지만 Xiao Ming의 일부 작업이 전달되었으며 계산기의 도움을받을 것입니다.
3. 유치원 교사가 돌아 왔습니다
Xiao Ming이 3 자리의 추가를 완료했다는 것을 알았을 때, 교사는 Xiao Ming이 매우 똑똑하고 가단성있는 재능이라고 생각했습니다. 그래서 그는 블랙 보드에 "26549 + 16487 ="를 썼고, Xiao Ming에게 수업 전에 반 은금을 완성하도록 요청한 다음 사무실로 돌아 왔습니다.
Xiao Ming은 교실 밖에서 재미 있었던 작은 친구를보고 도움을 줄 수 없었지만 슬퍼했습니다. 당신이 놀러 가지 않으면,이 휴식은 망가질 것입니다! ! ! ! Xiaohong이 다시 건네 준 계산기를 살펴보면 Xiao Ming은 계획을 세웠습니다. Xiaohong이 그를 위해 그것을하도록했습니다.
Xiao Ming은 Xiaohong 에게이 질문이 "26549 + 16487 ="이라고 말한 다음 결과를 채우기위한 특정 위치를 지적한 다음 재미를 위해 나갔다.
여기서는 Xiaohong 만 구현하지 않지만 결과를 계산하고 공백을 채울 수있는 슈퍼 계산기 인 첨가 및 Xiaohong을 전체적으로 계산할 수있는이 계산기를 고려합니다. 이 슈퍼 계산기가 통과 해야하는 매개 변수는 두 가지 추가 기능과 공백을 채우는 위치이며, 이러한 내용에 미리 알릴 필요가 있습니다. 즉, Xiao Ming은 그의 방법의 일부를 Xiao Hong에 노출 시키려고합니다. 가장 쉬운 방법은 Xiao Hong에게 그의 참조와 두 가지 추가 사항을 함께 알려주는 것입니다.
따라서, 초 정박기의 추가 방법에는 2 개의 피연산자와 Xiao Ming 자체에 대한 참조가 포함되어야하며, 코드는 다음과 같습니다.
Public Class SuperCalculator {public void add (int a, int b, student xiaoming) {int result = a + b; xiaoming.fillblank (a, b, result);}} Xiao Ming은 더 이상 정신 산술 또는 계산기가 필요하지 않으므로 Xiaohong에게 도움을 요청하는 방법 만 있으면됩니다. 코드는 다음과 같습니다.
공개 클래스 학생 {private String name = null; public student (문자열 이름) {// todo 자동 생성 생성자 stubthis.name = name;} public void setName (string name) {this.name = name;} public void callhelp (int a, int b) {new supercalculat 결과) {System.out.println (이름 + "Xiaohong 계산 추구 :" + a + " +" + b + "=" + result);}} 테스트 코드는 다음과 같습니다.
공개 클래스 테스트 {public static void main (String [] args) {int a =; int b =; student s = new student ( "Xiao Ming"); s.callhelp (a, b);}} 실행 결과는 다음과 같습니다.
Xiao Ming은 Xiaohong에게 도움을 요청했습니다. 26549 + 16487 = 43036
실행 프로세스는 다음과 같습니다. Xiao Ming은 자신의 CallHelp 메소드를 통해 Xiaohong (New SuperCalculator ())의 추가 방법을 호출하고 호출 할 때 자신의 참조를 참조합니다.
(이것은) 매개 변수로 전달하십시오. Xiaohong이 계산기를 사용하여 결과를 얻은 후, 그는 Xiao Ming의 FillBlank 방법을 다시 전화하고 결과를 블랙 보드의 공간으로 채웠습니다.
조명과 조명! 이 시점에서 콜백 기능은 공식적으로 데뷔했습니다. Xiao Ming의 FillBlank 메소드는 종종 콜백 기능입니다.
이런 식으로, Xiao Ming은 추가가 완료 될 때까지 더 이상 기다릴 필요가 없으며 친구들과 즐거운 시간을 보내기 전에 블랙 보드에 채워질 필요가 없음을 분명히 알 수 있습니다. 빈 공사는 슈퍼 계산기 인 Xiaohong에 의해 수행됩니다. 콜백의 장점은 반영되기 시작했습니다.
4 장. 문에있는 시어머니
유치원 입구에 회색 머리카락을 가진 노부인이 있습니다. 그녀는 바람과 비에 관계없이 매일 거의 만료되는 정크 푸드를 판매하는 거리 마구간을 세웠습니다. 나는 나이가 많기 때문에 내 마음은 약간 혼란스러워서 종종 내가 얼마나 많은 돈을 벌었는지 알 수 없습니다. 어느 날, 그녀는 실수로 Xiao Ming이 Xiaohong의 도움으로 유치원 교사와 어떻게 재치와 용기를 냈는지에 대해 자랑했습니다. 그래서 시어머니는 작은 레드 카드 슈퍼 계산기가 그녀의 작은 도우미가되기로 결정하고 Weilong Spicy 스트립 팩을 보상으로 제공하기로 결정했습니다. Xiaohong은 유혹에 저항 할 수 없었고 동의했다.
이전 장의 코드를 되돌아 보면 Little Red Card Super Calculator의 추가 방법에 필요한 매개 변수는 두 개의 정수 변수와 학생 객체이지만 노인은 학생이 아니라 작은 공급 업체이므로 여기서 수정해야합니다. 이 경우, 우리가 상속과 다형성을 생각하는 것은 당연합니다. 우리가 학생 Xiao Ming과 노인 공급 업체에게 부모 수업에서 물려 받도록 요청하면, 우리는 부모 수업에 대한 참조를 Little Red Card Super Calculator에게 전달하면됩니다.
그러나 실제로 사용하면 Java의 단일 상속을 고려하고 다른 사람들에게 너무 많은 것을 드러내고 싶지 않기 때문에 인터페이스에서 상속하는 방법을 사용하여 내부 클래스와 협력합니다.
다시 말해, Xiaohong은 미래의 수업 시간에 어린이들에게 계산 서비스를 계속 제공하기를 희망하며, 동시에 노부인에게 회계 서비스를 제공하고 미래에 다른 사람들의 사업을 확장하기도합니다. 그래서 그녀는 모든 고객들에게 통합 처리 방법, 즉 피연산자, 필요한 오페라 및 계산을 완료 한 후 수행하는 방법에 동의했습니다. Xiaohong 은이 통합 메소드를 인터페이스로 만들고 모든 사람에게 제공 한 코드는 다음과 같습니다.
공개 인터페이스 dojob {public void fillblank (int a, int b, int result);} Xiao Ming이 공란을 채우도록 도와 주었기 때문에 Xiaohong은 원래 의도를 유지하고 모든 사업을 FillBlank로 취급했습니다.
동시에 Xiaohong은 계산기를 수정하여 동시에 Dojob 인터페이스를 구현하는 다른 사람들을 다룰 수 있도록 계산기를 수정했습니다. 코드는 다음과 같습니다.
Public Class SuperCalculator {public void add (int a, int b, dojob customer) {int result = a + b; customer.fillBlank (a, b, result);}} Xiao Ming과 노인 이이 인터페이스를 구현하는 한이 인터페이스를 얻은 후 Xiaohong에게 통합 모델에서 결과를 처리하는 방법을 알려주고 앞에서 언급 한 내부 클래스를 사용하는 것과 같습니다. 코드는 다음과 같습니다.
Xiao Ming 's :
공개 클래스 학생 {private string name = null; 공개 학생 (문자열 이름) {// todo 자동 생성 생성자 stubthis.name = name;} public void setName (String name) {this.name = name;} 공개 클래스 Dohomework Implements dojob {@overridepublic void fillblank (int b, int b, int gudate) {// a auto-generated stubsystem.out.println (이름 + "Xiaohong 계산 추구 :" + a + " +" + b + "=" + result);}} public void callhelp (int a, int b) {new supercalculator (). Add (a, b, new dohomework ());}}. 노인 :
공개 클래스 판매자 {private string name = null; public seller (문자열 이름) {// todo 자동 생성 생성자 stubthis.name = name;} public void setName (String name) {this.name = name;} public class doohomework implements dojob {@overridepublic void fillblank (int b, int b, int b, int b, int b, int b, int b, int b) stubsystem.out.println (name + "xiaohong xiaohong을 찾기 위해 계정을 정산하기위한 도움을 구하는 것 :" + a + " +" + b + "=" + result + "meta");}} public void callhelp (int a, int b) {new supercalculator (). add (a, b, new dohomework ());}}. 테스트 절차는 다음과 같습니다.
공개 클래스 테스트 {public static void main (string [] args) {int a =; int b =; int c =; int d =; student s = new Student ( "Xiao Ming"); 판매자 s = 새로운 판매자 ( "할머니"); S.CallHelp (a, b); s.callhelp (c, d);}}}}}}}} 작업 결과는 다음과 같습니다.
Xiao Ming은 Xiaohong에게 도움을 요청했습니다 : 56 + 31 = 87
노부인은 Xiaohong에게 계정을 해결하기 위해 도움을 요청합니다 : 26497 + 11256 = 37753 Yuan
마지막 단어
Xiaohong 은이 문제를 이미 경력으로 취급했다는 것을 분명히 알 수 있으며, 그녀가 인터페이스 Dojob을 준 이름을 보면서 알게 될 것입니다.
어떤 사람들은 왜 노부인이 마구간을 설치하여 왜 그렇게 많은 돈을 벌 수 있습니까? 초점에 문제가 있습니까? ! 우리가 여기서 말하는 것은 콜백 메커니즘입니다! !
내가 아는 것은 Xiaohong의 사업이 나중에 계속 확장되었다는 것입니다. 그리고 유치원을 졸업하기 전에 마침내 그녀는 그녀가 벌어 들인 돈으로 첫 번째 집을 샀습니다.