java匿名內部類詳解
【宣告】此文轉載自:http://blog.csdn.net/zhandoushi1982/article/details/8778487
——感謝分享,尊重作者,交流無限!
記得JAVA中抽象類是不能建立例項的,但是在程式碼中總會看見new 抽象類名的用法。如果不太清楚這個原因,需要了解匿名抽象類這個概念。
匿名類是不能有名稱的類,所以沒辦法引用它們。必須在建立時,作為new語句的一部分來宣告它們。Java中內部匿名類用的最多的地方也許就是在Frame中加入Listener了吧。如下:
- import java.awt.*;
-
import java.awt.event.*;
- publicclass QFrame extends Frame {
- public QFrame() {
- this.setTitle(\"my application\");
- addWindowListener(new WindowAdapter() {
- publicvoid windowClosing(WindowEvent e) {
- dispose();
-
System.exit(0
- }
- });
- this.setBounds(10,10,200,200);
- }
- }
上面的new語句,建立一個 WindowAdapter物件 ,後面一個 {} 表示這個括號中的操作作用於這個預設的物件。開啟 WindowAdapter 的程式碼可以發現,它是一個抽象類。它是對 WindowListener 介面的一個實現。
(1)怎樣判斷一個匿名類的存在?
先看段虛擬碼
abstract class Father(){
....
}
public class Test{
Father f1 = new Father(){ .... }; //這裡就是有個匿名內部類
}
一般來說,new 一個物件時小括號後應該是分號,也就是new出物件該語句就結束了。但是出現匿名內部類就不一樣,小括號後跟的是大括號,大括號中是該new 出物件的具體的實現方法。因為我們知道,一個抽象類是不能直接new 的,必須先有實現類了我們才能new出它的實現類。上面的虛擬碼就是表示new 的是Father的實現類,這個實現類是個匿名內部類。其實拆分上面的匿名內部類可為:
class SonOne extends Father{
...//這裡的程式碼和上面匿名內部類,大括號中的程式碼是一樣的
}
public class Test{
Father f1 = new SonOne() ;
}
(2)匿名內部類的注意事項
A,匿名內部類不能有構造方法。
B,匿名內部類不能定義任何靜態成員、方法和類。
C,匿名內部類不能是public,protected,private,static。
D,只能建立匿名內部類的一個例項。
E,一個匿名內部類一定是在new的後面,用其隱含實現一個介面或實現一個類。
F,因匿名內部類為區域性內部類,所以區域性內部類的所有限制都對其生效。
G,匿名類和內部類中的中的this:有時候,我們會用到一些內部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。這時如果我們要使用外部類的方法和變數的話,則應該加上外部類的類名。
(3)匿名內部類例項,在安卓中,典型的也是各種Listener,比如按鍵的監聽
- Button button_stop = (Button) findViewById(R.id.button2);
- button_stop.setOnClickListener(new Button.OnClickListener(){
- publicvoid onClick(View v){
- stopService(new Intent("org.allin.android.facedetcting2"));
- }
- });