內部類是定義在另外一個類中的類。內部類的做用:java
public class TalkClock{ private int interval; private boolean beep; public TalkingClock(int interval,boolean beep){...} public void start(); public class TimePrinter implements ActionListener //一個內部類 { ... } }
在上述代碼中,TimePrinter是位於TalkingClock類的內部類。但不意味着每一個TalkingClock都有一個TimerPrinter實例域。TimerPrinter是有TalkingClock類的方法構造。下面是TimerPrinter的具體代碼函數
pubic class TimePrinter implements ActionLlistener{ public void actionPerformed(ActionEvent event){ System.out.println("At eht tone,the timer is"+new Data()); if(beep) Tookit.getDefaultTookit().beep(); } }
在上面的代碼中,TimePrinter的實例域中並無beep這個變量。它引用的是外部類的TaikingClock對象的域。也就是說,內部類既能夠訪問自身的數據域,也能夠訪問建立他的外圍類對象的數據域。
內部類的對象總有一個隱式引用,它指向了建立它的外部類對象。這個引用在內部類的定義中是不可見的。這裏講這個隱式引用成爲outer。那麼actionPerformed方法將等價於下列形式:this
public void actionPerformed(ActionEvent event){ System.out.println("At eht tone,the time is"+new Data()); if(out.beep) Toolkit.getDefaultTookit().beep(); }
內部類對象的構造器能夠入下寫設計
outerObject.new InnerClass(construction parameters); ActionListener listener= this.new TimePrinter();
在上述代碼中,在構造TimePrinter對象的外圍類的引用被設置爲建立內部類對象中方法中this引用。
內部類的聲明的全部的靜態域必須是final。由於咱們但願一份靜態域只一個實例,對於每個外部對象,會分別有一個單獨的
內部類實例。若是這個域不是fianl,它可能不是惟一。code
若是內部類在代碼中只使用一次嗎,那麼能夠將該內部類設計成局部內部類。具體的實現方法就是在該方法中實現該類orm
public void start(){ class TimePrinter actionPerfoemed(ActionEvent Event){ if(beep) ... }
局部類不能使用private,public等修飾符來進行聲明,他的做用怕域被限定在聲明這個局部類的塊中。對象
匿名內部類是局部內部類的更深一層次。若是隻建立這個類的一個對象,那麼這個類就不用命名。
public void start(int interval,boolean beep){ ActionListener listener = new ActionListener(){ System.out.println("..."); if(beep){ .... } }; }
上述代碼中,含義爲建立一個實現了ActionListener接口的類的新對象,須要實現的方法actionPerformed定義在括號{}內。一般的語法格式爲接口
new SuperTyper(construction paramters){ inner class method and data }
因爲構造器必須和類名同樣,而匿名類沒有名字,故而也就沒有構造器。因此構造器的參數都必須傳遞到超類構造器中。在內部類實現接口的時候,不能有任何構造參數。普通類和匿名內部類的構造區別在於。匿名類後面會有一個;
匿名內部類經常使用語實現時間監聽器和其餘回調。作用域
若是使用內部類只是想把一個類隱藏於另外一個類中,並不須要內部類引用外圍類對象。那麼徹底能夠將該類定義爲靜態內部類。get