內(nèi)部類作用:
1.實(shí)現(xiàn)數(shù)據(jù)的隱藏拣播,實(shí)現(xiàn)了封裝途茫,類可以定義為private或者protected, 外部不能訪問(wèn)。
2.如果兩個(gè)類之間的耦合性特別強(qiáng)的圆,可以使用內(nèi)部類鼓拧,增強(qiáng)類之間的使用關(guān)系
3.內(nèi)部類可以使用外部類的成員變量和成員方法等所有元素,包括私有的
4.內(nèi)部類創(chuàng)建方法 ObjectA A = new ObjectA(); ObjectB B = A.new ObjectB();
5. 內(nèi)部類實(shí)現(xiàn)了代碼的簡(jiǎn)潔性
6.可以實(shí)現(xiàn)多重繼承略板,彌補(bǔ)了JAVA語(yǔ)言多繼承缺點(diǎn)毁枯,這個(gè)特點(diǎn)非常重要,個(gè)人認(rèn)為它是內(nèi)部類存在的最大理由之一叮称。正是由于他的存在使得Java的繼承機(jī)制更加完善种玛。大家都知道Java只能繼承一個(gè)類,它的多重繼承在我們沒(méi)有學(xué)習(xí)內(nèi)部類之前是用接口來(lái)實(shí)現(xiàn)的瓤檐。但使用接口有時(shí)候有很多不方便的地方赂韵。比如我們實(shí)現(xiàn)一個(gè)接口就必須實(shí)現(xiàn)它里面的所有方法。而有了內(nèi)部類就不一樣了挠蛉。它可以使我們的類繼承多個(gè)具體類或抽象類祭示。大家看下面的例子。
7?避免修改接口而實(shí)現(xiàn)同一個(gè)類中兩種同名方法的調(diào)用谴古。
8.內(nèi)部類是延時(shí)加載的质涛,只有內(nèi)部類被調(diào)用時(shí)候才會(huì)加載稠歉;
靜態(tài)內(nèi)部類與內(nèi)部類區(qū)別:
1. 靜態(tài)內(nèi)部類不持有外部類的引用,不能訪問(wèn)外部類的元素
2.創(chuàng)建方法不同 ObjectB B = new ObjectA.ObjectB();
3.另外因?yàn)殪o態(tài)嵌套類是依附于外部類而非外部類對(duì)象的汇陆,所以不同的外部類對(duì)象共享一個(gè)靜態(tài)嵌套類怒炸,這一點(diǎn)與內(nèi)部類不同,可以用來(lái)包裝方法毡代,實(shí)現(xiàn)工廠模式阅羹。
4.生成一個(gè)靜態(tài)內(nèi)部類不需要外部類成員:這是靜態(tài)內(nèi)部類和成員內(nèi)部類的區(qū)別。靜態(tài)內(nèi)部類的對(duì)象可以直接生成:Outer.Inner in = new Outer.Inner();而不需要通過(guò)生成外部類對(duì)象來(lái)生成教寂。這樣實(shí)際上使靜態(tài)內(nèi)部類成為了一個(gè)頂級(jí)類(正常情況下捏鱼,你不能在接口內(nèi)部放置任何代碼,但嵌套類可以作為接口的一部分酪耕,因?yàn)樗莝tatic 的导梆。只是將嵌套類置于接口的命名空間內(nèi),這并不違反接口的規(guī)則)
public interface Outer {public static final class inner{ ? ? ? ?void dosth() {System.out.println("I'm a inner class in interface");}}}
5.靜態(tài)內(nèi)部類因妇,也是延時(shí)加載的只有靜態(tài)方法被調(diào)用時(shí)候才會(huì)加載此類问潭;