Java的内部类
內(nèi)部類的概念
內(nèi)部類是定義在另一個(gè)類中的類。內(nèi)部類的作用:
- 內(nèi)部類方法可以訪問(wèn)該類定義所在的作用域中的數(shù)據(jù),包括私有的數(shù)據(jù),
- 內(nèi)部類可以對(duì)同一個(gè)包中的其他類隱藏起來(lái)
- 當(dāng)想要定義一個(gè)回調(diào)函數(shù)且不想編寫大量的代碼時(shí),使用匿名內(nèi)部類比較便捷。
使用內(nèi)部類訪問(wèn)對(duì)象的狀態(tài)
public class TalkClock{private int interval;private boolean beep;public TalkingClock(int interval,boolean beep){...}public void start();public class TimePrinter implements ActionListener//一個(gè)內(nèi)部類{...} }在上述代碼中,TimePrinter是位于TalkingClock類的內(nèi)部類。但不意味著每個(gè)TalkingClock都有一個(gè)TimerPrinter實(shí)例域。TimerPrinter是有TalkingClock類的方法構(gòu)造。下面是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的實(shí)例域中并沒有beep這個(gè)變量。它引用的是外部類的TaikingClock對(duì)象的域。也就是說(shuō),內(nèi)部類既可以訪問(wèn)自身的數(shù)據(jù)域,也可以訪問(wèn)創(chuàng)建他的外圍類對(duì)象的數(shù)據(jù)域。
內(nèi)部類的對(duì)象總有一個(gè)隱式引用,它指向了創(chuàng)建它的外部類對(duì)象。這個(gè)引用在內(nèi)部類的定義中是不可見的。這里講這個(gè)隱式引用成為outer。那么actionPerformed方法將等價(jià)于下列形式:
內(nèi)部類對(duì)象的構(gòu)造器可以入下寫
outerObject.new InnerClass(construction parameters); ActionListener listener= this.new TimePrinter(); 在上述代碼中,在構(gòu)造TimePrinter對(duì)象的外圍類的引用被設(shè)置為創(chuàng)建內(nèi)部類對(duì)象中方法中this引用。內(nèi)部類的聲明的所有的靜態(tài)域必須是final。因?yàn)槲覀兿M环蒽o態(tài)域只一個(gè)實(shí)例,對(duì)于每一個(gè)外部對(duì)象,會(huì)分別有一個(gè)單獨(dú)的
內(nèi)部類實(shí)例。如果這個(gè)域不是fianl,它可能不是唯一。
局部?jī)?nèi)部類
如果內(nèi)部類在代碼中只使用一次嗎,那么可以將該內(nèi)部類設(shè)計(jì)成局部?jī)?nèi)部類。具體的實(shí)現(xiàn)方法就是在該方法中實(shí)現(xiàn)該類
public void start(){class TimePrinter actionPerfoemed(ActionEvent Event){if(beep)...}局部類不能使用private,public等修飾符來(lái)進(jìn)行聲明,他的作用怕域被限定在聲明這個(gè)局部類的塊中。
匿名內(nèi)部類
匿名內(nèi)部類是局部?jī)?nèi)部類的更深一層次。如果只創(chuàng)建這個(gè)類的一個(gè)對(duì)象,那么這個(gè)類就不用命名。 public void start(int interval,boolean beep){ActionListener listener = new ActionListener(){System.out.println("...");if(beep){....}};}上述代碼中,含義為創(chuàng)建一個(gè)實(shí)現(xiàn)了ActionListener接口的類的新對(duì)象,需要實(shí)現(xiàn)的方法actionPerformed定義在括號(hào){}內(nèi)。通常的語(yǔ)法格式為
new SuperTyper(construction paramters){inner class method and data}由于構(gòu)造器必須和類名一樣,而匿名類沒有名字,故而也就沒有構(gòu)造器。所以構(gòu)造器的參數(shù)都必須傳遞到超類構(gòu)造器中。在內(nèi)部類實(shí)現(xiàn)接口的時(shí)候,不能有任何構(gòu)造參數(shù)。普通類和匿名內(nèi)部類的構(gòu)造區(qū)別在于。匿名類后面會(huì)有一個(gè);
匿名內(nèi)部類常用語(yǔ)實(shí)現(xiàn)時(shí)間監(jiān)聽器和其他回調(diào)。
靜態(tài)內(nèi)部類
如果使用內(nèi)部類只是想把一個(gè)類隱藏于另一個(gè)類中,并不需要內(nèi)部類引用外圍類對(duì)象。那么完全可以將該類定義為靜態(tài)內(nèi)部類。
轉(zhuǎn)載于:https://www.cnblogs.com/NaCl/p/10225411.html
總結(jié)
- 上一篇: 7张图讲透Java垃圾回收算法!学妹直呼
- 下一篇: phpstrom安装bootstrap3