一、内部類的作用域:
(1)、一個内部類的對象能夠通路建立它的對象的實作,包括私有資料。
(2)、内部類對于同一個包中的其它類來說,内部類能夠被隐藏起來。内部類不管方法的可見性如何,哪怕是public 的其它類都無法使用它。
(3)、内部類對象通過‘外部類名.this.xxx’的形式通路外部類的屬性與方法。
(4)、外部類可以直接使用内部類的對象。
pouter po = new pouter();
pouter.pinner pi = po.new pinner();
pi.Print();
二、java回調機制:
軟體子產品之間總是存在着一定的接口,從調用方式上,可以把他們分為三類:同步調用、回調和異步調用。
同步調用:一種阻塞式調用,調用方要等待對方執行完畢才傳回,它是一種單向調用;
回 調:一種雙向調用模式,也就是說,被調用方在接口被調用時也會調用對方的接口;
異步調用:一種類似消息或事件的機制,不過它的調用方向剛好相反,接口的服務在收到某種訊息或發生某種事件時,會主動通知客戶方(即調用客戶方的接口)。
回調和異步調用的關系非常緊密:使用回調來實作異步消息的注冊,通過異步調用來實作消息的通知。
回調函數:有點像您随身帶的BP機:告訴别人号碼,在它有事情時Call您
回調用于層間協作,回調就是該函數寫在高層,低層通過一個函數指針儲存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。
應用:在Java中,通常就是編寫另外一個類或類庫的人規定一個接口,然後你來實作這個接口,然後把這個接口的一個對象作為參數傳給别人的程式,别人的程式必要時就會通過那個接口來調用你編寫的函數。
eg:
ExecutorService pool = Executors.newFixedThreadPool(2); //線程池
for (int i = 0; i < files.size(); i++) {
final File file = (File) files.get(i);
pool.execute(new Runnable() {
public void run() {
doSomething(); }
});
}
pool.shutdown();
JDK 定義了一個接口 Runnable,我實作了這個接口的方法,然後又把這個接口的引用傳遞給JDK。
1)、定義回調函數接口
public interface CallBack(){
public void execute();
}
2)、定義外部類實作方法
OutClass:
pubic void testOut(CallBack callBack){
...........
callBack.execute(); //(屬于底層調用)
...........
}
public void main(String[] args){
OutClass out = new OutClass();
out.testOut(new CallBack(){
public void execute(){
//我需要實作的東西,(屬于高層實作)
}
});
}
eg:
定義事件接口
public interface Event{
public void interEvent();
}
定義兩個具體事件
public class PrintEvent implements Event{
public PrintEvent(){}
public interEvent(){
System.out.println("發生了列印事件");
}
}
public class QueryEvent implements Event{
public QueryEvent(){}
public interEvent(){
System.out.println("發生了查詢事件");
}
}
定義螢幕
public class EventMonitor{
private Event e;
private boolean somHapp;
public EventMonitor(){
somHapp= true;
}
public setEvent(Event e){
this.e = e
}
public void doWork(){
if(somHapp){
e.interEvent();
}
}
}
測試
public static void main(String[] args) {
QueryEvent qe = new QueryEvent ();
PrintEvent pe = new PrintEvent ();
EventMonitor em = new EventMonitor();
em .setEvent(qe );
em .doWork();
em .setEvent(pe );
em .doWork();
}