重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
是不是有同學跟我一樣學了知識,不使用,一段時間就忘了? 今天說說java的匿名內部類這個東西,今天就因為這個東西被程序媛欺負了,我心里難受啊。
匿名內部類的官方說法特別不容易理解,是從"有沒有名字"給它命名,而不是功能命名,導致很多人學了都不知道怎么用,考試厲害實操菜,今天就說說匿名內部類的經典實操案例。廢話到此結束!
一、簡單案例(錯誤案例)首先,先看一個簡單的使用案例,假設:程序媛有一個寫好的類叫做HerClass
//程序媛的類
public class HerClass {public void onChange(String content){//順序: 3
}
}
我的類要去實例化她的類,并且調用她的方法
//我的類
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
public void onChange(String content) {//順序:2
super.onChange(content);
}
};
//順序:1
herClass.onChange("傳輸的數據");
}
}
代碼跑起來的順序如代碼中的注釋,順序1-2-3。 很多網上的寫法都是這么干的,確實沒啥毛病,但是這么寫有什么意義呢? 不具備實際使用意義,不會有這種需求。
二、匿名內部類的正確使用方法(正解案例)我以安卓中的Handle為例子,學習Android的同學一定知道Android切到UI線程的Handle.
public class Demo {public static void main(String args[]) {//順序:1(子線程)
Message message=new Message();
message.what=999;
handler.sendMessage(message);
}
android.os.Handler handler=new Handler(Looper.getMainLooper()){@Override
public void handleMessage(@NonNull Message msg) {//順序:2(主線程)
int data=msg.what;//得到數據999
super.handleMessage(msg);
}
};
}
main方法中通過handler.sendMessage()把消息發送到Handler類中,Handler類進行一系列的處理(也就是轉到UI線程),之后調用handleMessage()方法,此時調到的方法就是我們匿名內部類里面的方法,而且是轉了線程的。
三、回到我和程序媛的故事看了Android的Handle案例,我們把之前的錯誤案例改一版,改成有意義的案例。
假如:我讓程序媛幫我算一算這個星期我花了多少錢,她可能要算五分鐘,或者十分鐘,這個過程不需要我等待,算好后她主動告訴我。
//我的類
public class MyClass {public static void main(String args[]) {HerClass herClass=new HerClass(){@Override
public void onChange(String content) {Log.d("fxHou","順序:3 我得到他計算的結果");
//順序:3
super.onChange(content);
}
};
Log.d("fxHou","順序:1 我告訴程序媛,幫我算一算");
//順序:1 我告訴程序媛,幫我算一算
herClass.option("我這個星期的花錢記錄");
}
}
她的類//程序媛的類
public class HerClass {public void onChange(String content){Log.d("fxHou","順序:4 她自己存檔一份");
//順序:4
}
public void option(Object data){Log.d("fxHou","順序:2 程序媛開始幫我計算");
//順序:2
// TODO: 2023/1/11 程序媛開始幫我計算,計算可以使五分鐘,十分鐘,或者更久。
//計算好之后把結果通知回去
onChange("計算結果");
}
}
數據打印結果
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 順序:1 我告訴程序媛,幫我算一算
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 順序:2 程序媛開始幫我計算
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 順序:3 我得到他計算的結果
2023-01-11 19:19:56.370 11608-11608 fxHou com.example.cavasdemo D 順序:4 她自己存檔一份
梳理一下這份代碼,發現,它形成了一種觀察者模式,好好整理完全可以封裝出一套觀察者工具(后期出)。
四、拓展(用匿名內部類觀察底層API數據)有時候我們需要拿底層API某個方法里面的數據,發現API沒有提供獲取的方法,而且我們只有只讀權限,這時候匿名內部類就能派上用場,只要這個方法是public void就行。
//假設:這是某個我們只有只讀權限的API
public class someoneApi {public void onChange(String canInfo){//假設:這里有一大堆邏輯,但是沒有提供方法讓我們獲取canInfo
}
}
觀察數據的類
public class MyClass {public static void main(String args[]) {someoneApi herClass=new someoneApi(){@Override
public void onChange(String canInfo) {//輕松得到canInfo
super.onChange(canInfo);
}
};
}
}
同理,這種辦法也可以用在兩個開發人員之間的代碼通信,有時候我們想要獲取祖傳代碼的參數數據,但是又不想動祖傳代碼,一樣可以這么做。
完。。。。。。。蛋
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧