你好,我寫了個很簡單的代碼,你一看就明白了

創(chuàng)新互聯(lián)是工信部頒發(fā)資質(zhì)IDC服務器商,為用戶提供優(yōu)質(zhì)的托管服務器服務
public class A {
int value = 1001;
public A() {// A的構造函數(shù),執(zhí)行B的exec()方法,里面又帶有對A的getValue()方法調(diào)用,這個就叫做回調(diào)
B b = new B(this);
b.exec();
}
public int getValue() {
return value;
}
public static void main(String[] args) {
new A();//構造函數(shù)里已經(jīng)發(fā)生了回調(diào),所以不需要更多的代碼
}
}
class B {
private A a;
public B(A a) {
this.a = a;
}
public void exec() {
System.out.println(a.getValue());// 這里調(diào)用了a的getValue()方法
}
}
這是一個C++中獲得虛擬機的example,是在JDK 1.1中實現(xiàn)的,現(xiàn)在已經(jīng)跑不通了,經(jīng)供參考,但是里面得到虛擬機原理是一樣的。
它用到了3個方法: Create VM,Attaching VM,Unloading VM.
JNI_CreateJavaVM() 方法用來加載和初始化一個java虛擬機并且返回JNI接口的指針(JNIEnv), 這個線程被看做是主線程。
JNIEnv是在當前線程中是合法的,如果其他的線程去訪問java虛擬機,他必須調(diào)用一下AttachCurrentThread()方法,把自己附屬到VM中才能獲得JNIEnv。一旦調(diào)用成功,native的線程就像一個普通的java線程運行在native的線程中(native中的線程都是Linux線程,由內(nèi)核調(diào)用執(zhí)行)。native線程仍然連接到VM,直到它調(diào)用DetachCurrentThread()來分離。
主線程不能從VM中分離自己,必須調(diào)用DestroyJavaVM()方法去卸載整個VM。
接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類實現(xiàn)的接口的方法。實際上,當接口變量調(diào)用被類實現(xiàn)的接口中的方法時,就是通知相應的對象調(diào)用接口的方法,這一過程稱為對象功能的接口回調(diào)。
示例代碼:
interface People{ //接口
void peopleList();
}
class Student implements People{ //接口實現(xiàn)類
public void peopleList(){ //實現(xiàn)接口方法
System.out.println("I'm a student.");
}
}
class Teacher implements People{ //接口實現(xiàn)類
public void peopleList(){ //實現(xiàn)接口方法
System.out.println("I'm a teacher.");
}
}
public class Example{
public static void main(String args[]){
People a; //聲明接口變量
a=new Student(); //實例化,接口變量中存放對象的引用
a.peopleList(); //接口回調(diào)
a=new Teacher(); //實例化,接口變量中存放對象的引用
a.peopleList(); //接口回調(diào)
}
}
輸出結果:
I’m a student.
I’m a teacher.
程序員A寫了一段程序(程序a),其中預留有回調(diào)函數(shù)接口,并封裝好了該程序。程序員B要讓a調(diào)用自己的程序b中的一個方法,于是,他通過a中的接口回調(diào)自己b中的方法。目的達到。在C/C++中,要用回調(diào)函數(shù),被掉函數(shù)需要告訴調(diào)用者自己的指針地址,但在JAVA中沒有指針,怎么辦?我們可以通過接口(interface)來實現(xiàn)定義回調(diào)函數(shù)。\x0d\x0a假設我是程序員A,以下是我的程序a:\x0d\x0a[java]viewplaincopyprint?\x0d\x0apublicclassCaller\x0d\x0a{\x0d\x0apublicMyCallInterfacemc;\x0d\x0a\x0d\x0apublicvoidsetCallfuc(MyCallInterfacemc)\x0d\x0a{\x0d\x0athis.mc=mc;\x0d\x0a}\x0d\x0a\x0d\x0apublicvoidcall(){\x0d\x0athis.mc.method();\x0d\x0a}\x0d\x0a}\x0d\x0a還需要定義一個接口,以便程序員B根據(jù)我的定義編寫程序實現(xiàn)接口。\x0d\x0a\x0d\x0apublicinterfaceMyCallInterface\x0d\x0a{\x0d\x0apublicvoidmethod();\x0d\x0a\x0d\x0a}\x0d\x0a于是,程序員B只需要實現(xiàn)這個接口就能達到回調(diào)的目的了:\x0d\x0apublicclassBimplementsMyCallInterface\x0d\x0a{\x0d\x0apublicvoidmethod()\x0d\x0a{\x0d\x0aSystem.out.println("回調(diào)");\x0d\x0a}\x0d\x0a\x0d\x0apublicstaticvoidmain(Stringargs[])\x0d\x0a{\x0d\x0aCallercall=newCaller();\x0d\x0acall.setCallfuc(newB());\x0d\x0acall.call();\x0d\x0a}\x0d\x0a}
public?class?Caller??
{??
public?MyCallInterface?mc;??
public?void?setCallfuc(MyCallInterface?mc)??
{??
this.mc=?mc;??
}??
public?void?call(){??
this.mc.method();??
}??
}
接口
public?interface?MyCallInterface??
{??
public?void?method();??
}
測試
public?class?B?implements?MyCallInterface??
{??
public?void?method()??
{??
System.out.println("回調(diào)");??
}??
public?static?void?main(String?args[])??
{??
Caller?call?=?new?Caller();??
call.setCallfuc(new?B());??
call.call();??
}??
}
網(wǎng)頁標題:java的回調(diào)方式代碼 java回調(diào)方法
網(wǎng)址分享:http://chinadenli.net/article16/hipcdg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、小程序開發(fā)、虛擬主機、微信公眾號、Google、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)