2016.7.21
嵌套類Nested Class
多數(shù)情況下把nested class分為兩種
Static Nested Class(靜態(tài)嵌套類):就是用static修飾的成員嵌套類
Inner Class(內(nèi)部類):靜態(tài)嵌套類之外所有的嵌套類的總稱,也就是沒有用static定義的nested classes
而Inner class又可以分為三種
inner member class
沒有用static 修飾的成員內(nèi)部類
local inner class
定義在方法里面的內(nèi)部類,方法可以是static的也可以是非static的,也可以是構(gòu)造器方法。
anonymous inner class
匿名內(nèi)部類,定義在方法里面匿名類躲因,方法可以是static的也可以是非static的
訪問規(guī)則
Static Nested Class(靜態(tài)嵌套類)
用Static修飾的Nested Classes衡未,只能訪問外部類的static變量乐尊。
對于public 的 static Nested Classes 可以用 new 外部類.內(nèi)部類()的方式直接創(chuàng)建悬秉。而
用默認(default)的static Nested Classes 可以在同一包名下,用 new 外部類.內(nèi)部類()的方式創(chuàng)建南缓。其實和外部類的方式差不多。靜態(tài)成員類可以使用訪問控制符荧呐,可以使用static修飾汉形,可以是abstract抽象類
Inner Class訪問規(guī)則
inner member classes(內(nèi)部成員類) 可以訪問外部類的所有實例屬性,靜態(tài)屬性倍阐。因為內(nèi)部成員類持有一個外部對象的引用概疆,內(nèi)部類的實例可以對外部類的實例屬性進行修改。如果是public的 inner member classes峰搪,可以通過 外部類實例.new 內(nèi)部類()的方式進行創(chuàng)建岔冀,當調(diào)用內(nèi)部類的構(gòu)造器的時候,會把當前創(chuàng)建的內(nèi)部類對象實例中持有的外部對象引用賦值為當前創(chuàng)建內(nèi)部類的外部類實例概耻。內(nèi)部成員類可以是使用訪問控制符使套,可以定義為final,也可以是抽象類鞠柄。
local inner classes(局部類)
局部類 定義在類方法里面侦高。這個方法既可以是靜態(tài)方法,也可以是實例方法春锋,也可以是構(gòu)造器方法或者靜態(tài)初始化語句塊矫膨。
局部類可以定義在一個static上下文里面 和 非static上下文里面。局部類不能有訪問控制符(private,public,protected修飾)期奔,可以是抽象的,也可以定義為final
定義在static上下文(static 字段初始化侧馅,static初始化塊,static方法)里面的local inner classes 可以訪問類的靜態(tài)屬性呐萌,如果定義在靜態(tài)方法里面的局部類馁痴,還可以使用方法里面定義的final變量。在static上下文定義的局部類肺孤,沒有指向父類實例變量的引用罗晕,因為static方法不屬于類的實例济欢,屬于類本身。而且局部類不能在外部進行創(chuàng)建小渊,只能在方法調(diào)用的時候進行創(chuàng)建法褥。
anonymous inner classes (匿名類)
也是定義在方法里面,匿名類和局部類訪問規(guī)則一樣酬屉,只不過內(nèi)部類顯式的定義了一個類半等,然后通過new的方式創(chuàng)建這個局部類實例,而匿名類直接new一個類實例呐萨,沒有定義這個類杀饵。匿名類最常見的方式就是回調(diào)模式的使用,通過默認實現(xiàn)一個接口創(chuàng)建一個匿名類然后谬擦,然后new這個匿名類的實例切距。