今天重新學(xué)習(xí)了接口和內(nèi)部類的部分知識(shí);下面是所有的內(nèi)容:
第九章:接口
在第八章多態(tài)中,通過把子類對(duì)象的基類引用作為參數(shù)傳入方法中時(shí),用該對(duì)象調(diào)用方法時(shí),調(diào)用的是已經(jīng)被子類重載過的方法。所以在這種情況下,基類的方法具體實(shí)現(xiàn)沒有意義了。所以干脆生成一個(gè)機(jī)制:抽象;
抽象是對(duì)基類的方法設(shè)置的;抽象只只實(shí)現(xiàn)方法、參數(shù)、返回值而實(shí)現(xiàn)沒有方法主體;所以這個(gè)類具體的實(shí)現(xiàn)都在子類中實(shí)現(xiàn);抽象類指的是存有抽象方法的類,這種類不能創(chuàng)建對(duì)象;
如果一個(gè)類中所有的方法都是抽象方法,則把這種類型叫做接口(interface);接口內(nèi)部的對(duì)象都是private、static、final類型的變量,所以在接口中保存常量是很好的策略;
接口中的方法的默認(rèn)權(quán)限為public,接口則由用戶自己申明;用接口申明類用關(guān)鍵字implement,而類之間的繼承和接口之間的繼承都可以用extends;
實(shí)現(xiàn)接口判斷的只有內(nèi)部方法的實(shí)現(xiàn);若一個(gè)類和接口沒有實(shí)現(xiàn)關(guān)系,但是他內(nèi)部的方法頭部和接口內(nèi)部的方法頭部一致,則盡管他們之間沒有關(guān)系,這個(gè)類還是可以通過這個(gè)接口進(jìn)行工作;這個(gè)叫接口的解耦;
多重繼承則是用extends實(shí)現(xiàn)多個(gè)接口;不過這種情況下必須實(shí)現(xiàn)每一個(gè)接口中的方法,不然該類就是抽象類,不能創(chuàng)建對(duì)象;
接口嵌套時(shí),要正確設(shè)置接口的訪問權(quán)限,因?yàn)榻涌诤蛢?nèi)部類的權(quán)限是一樣的,它的權(quán)限已經(jīng)規(guī)定了他的工作范圍,超出了范圍則不能正確訪問;
接口的工廠我還是搞不懂;
第十章:內(nèi)部類
內(nèi)部類指的是在類的內(nèi)部定義一個(gè)類;
這和前面的組合類很相似;內(nèi)部類可以訪問外部類的所有數(shù)據(jù),還可以在子類中的方法調(diào)用父類的變量和代碼;因?yàn)樵趧?chuàng)建時(shí),它就已經(jīng)存儲(chǔ)了一個(gè)外部類的引用;而那個(gè)組合雖然也可以調(diào)用所有數(shù)據(jù),但是不能把外部類的代碼嵌入內(nèi)部類中;
上面說到內(nèi)部類中有一個(gè)外部類的引用,這個(gè)引用用(外部類名。this)來訪問,而他自身的引用則直接用this即可訪問;
關(guān)于內(nèi)部類在外部的創(chuàng)建:不是static類型的內(nèi)部類,在外部時(shí)用外部類的對(duì)象來申明;(parcel.destination ?de = parcel.new destination ( ?););若是static類型的內(nèi)部類,則可以直接當(dāng)外部類來創(chuàng)建;不過static內(nèi)部類則不能訪問外部類的非static方法,這也是一種取舍;
匿名內(nèi)部類:在外部類中直接定義的類,插在new innerClassName (){ };之間的大括號(hào)中;在這個(gè)大括號(hào)中添加類的實(shí)現(xiàn);由于是內(nèi)部類,則不能修改默認(rèn)的構(gòu)造函數(shù);
從語法上來講,這個(gè)匿名類是innerClassName類的子類;運(yùn)用了一個(gè)向上轉(zhuǎn)型;在有匿名內(nèi)部類實(shí)現(xiàn)的情況下,一般會(huì)創(chuàng)建一個(gè)方法,這個(gè)方法返回匿名類的父類,直接在返回語句中添加上定義實(shí)現(xiàn);
當(dāng)一個(gè)匿名類中的數(shù)據(jù)需要初始化時(shí),第一是對(duì)創(chuàng)建的方法中傳入的參數(shù)改成fina類型,這樣則可以在內(nèi)部類中使用這個(gè)變量;第二是直接在基類的構(gòu)造器中添加參數(shù),這時(shí)需要在innerClassName后的括號(hào)中添加這個(gè)變量;但是還是用第一種方法更好;
為什么要使用內(nèi)部類?主要原因是需要讓一個(gè)類繼承多個(gè)類。因?yàn)閖ava中一個(gè)類只能繼承單一類,其他的類如果要使用接口,則子類需要實(shí)現(xiàn)很多方法而且會(huì)有名稱相同的困擾;用內(nèi)部引用類實(shí)現(xiàn)外部的接口時(shí),用外部類的函數(shù)返回一個(gè)內(nèi)部類父類的引用時(shí),相當(dāng)于是像父類對(duì)象付給一個(gè)基類引用一樣,可以更好的實(shí)現(xiàn)多態(tài)的功能;而且內(nèi)部類之間是互相獨(dú)立的;
注:創(chuàng)建內(nèi)部類后,該內(nèi)部類和外部類兩個(gè)類在堆使用不同的內(nèi)存空間,他們之間完全靠引用進(jìn)行互相訪問數(shù)據(jù);所以內(nèi)部類是一個(gè)單獨(dú)的個(gè)體;
可以用多個(gè)內(nèi)部類繼承一個(gè)接口來實(shí)現(xiàn)類似但不同的功能,這相當(dāng)于一個(gè)接口的多功能實(shí)現(xiàn),用接口的話要申明很多的子類,在這里則只要定義多個(gè)類似的內(nèi)部類;方便管理;
還有很多沒懂的,估計(jì)要后面復(fù)習(xí)的時(shí)候才可以明白吧;