Java的內部類

內部類的概念

內部類是定義在另外一個類中的類。內部類的做用: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

相關文章
相關標籤/搜索