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方法將等價于下列形式:
內部類對象的構造器可以入下寫
outerObject.new InnerClass(construction parameters); ActionListener listener= this.new TimePrinter(); 在上述代碼中,在構造TimePrinter對象的外圍類的引用被設置為創建內部類對象中方法中this引用。內部類的聲明的所有的靜態域必須是final。因為我們希望一份靜態域只一個實例,對于每一個外部對象,會分別有一個單獨的
內部類實例。如果這個域不是fianl,它可能不是唯一。
局部內部類
如果內部類在代碼中只使用一次嗎,那么可以將該內部類設計成局部內部類。具體的實現方法就是在該方法中實現該類
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}由于構造器必須和類名一樣,而匿名類沒有名字,故而也就沒有構造器。所以構造器的參數都必須傳遞到超類構造器中。在內部類實現接口的時候,不能有任何構造參數。普通類和匿名內部類的構造區別在于。匿名類后面會有一個;
匿名內部類常用語實現時間監聽器和其他回調。
靜態內部類
如果使用內部類只是想把一個類隱藏于另一個類中,并不需要內部類引用外圍類對象。那么完全可以將該類定義為靜態內部類。
轉載于:https://www.cnblogs.com/NaCl/p/10225411.html
總結
- 上一篇: 7张图讲透Java垃圾回收算法!学妹直呼
- 下一篇: Java多线程02(线程安全、线程同步、