《優(yōu)先考慮靜態(tài)成員類而不是非靜態(tài)成員類》次舌。
可能由于我經(jīng)驗(yàn)太少帅涂,這本書的題目總是要看半天。罐孝。
什么是靜態(tài)成員類(static member classes)?
嵌套類(nested class)有四種:
- 靜態(tài)成員類(static member class)
- 非靜態(tài)成員類(nonstatic member class)
- 匿名類(anonymous class)
- 局部類(local class)
除了第一種之外肥缔,其他三種都稱為內(nèi)部類(inner class)莲兢。
嵌套類(nested class)是指被定義在另一個(gè)類的內(nèi)部的類。嵌套類存在的目的應(yīng)該只是為他的外圍類(enclosing class)提供服務(wù)。如果嵌套類將來可能會(huì)用于其他的某個(gè)環(huán)境中改艇,他就應(yīng)該是頂層類(top-level class)收班。
也就是說,嵌套(nested)類 = 內(nèi)部(inner)類 + 靜態(tài)成員類谒兄。
其他重要的
A static member class is a static member of its enclosing class and obeys the same accessibility rules as other static members.
這句話就是說靜態(tài)成員類也可以看成「外圍類」(enclosing class)的一個(gè)普通成員摔桦。舉個(gè)例子:
這樣一個(gè)非靜態(tài)成員類:
public class A {
public class B {
}
}
如果需要B的instance,不能這樣:
A.B ab = new A.B();
編譯器會(huì)提示:not an enclosing class
承疲。
而要這樣:
A a = new A();
A.B ab = a.new B();
或者邻耕,把member class 用static修飾。
非靜態(tài)成員類最常見的用法是定義一個(gè)adapter燕鸽。
這看著挺晦澀的兄世。∶嘣郏看不懂碘饼。意思大概是如果成員類不需要訪問它enclosing class 的實(shí)例的時(shí)候就聲明成static member class吧。
總結(jié)
如果一個(gè)嵌套類需要在單個(gè)方法之外仍然是可見的悲伶,或者他太長了艾恼,不適合方法內(nèi)部,就應(yīng)該使用成員類麸锉。
如果成員類的每個(gè)實(shí)例都需要一個(gè)指向其外圍實(shí)例的引用钠绍,就要把成員類做成非靜態(tài)的;否則就做成靜態(tài)的花沉。假設(shè)這個(gè)嵌套類屬于一個(gè)方法的內(nèi)部柳爽,如果你需要在一個(gè)地方創(chuàng)建實(shí)例,并且已經(jīng)有了一個(gè)預(yù)置的類型可以說明這個(gè)類的特征碱屁,就把他做成匿名類磷脯;否則,就做成局部類娩脾。
總之赵誓,由于缺乏實(shí)際經(jīng)驗(yàn),看不太懂柿赊。