introduce
Java中的嵌套類(Nested Class)分為兩種:靜態(tài)內(nèi)部類(也叫靜態(tài)嵌套類务嫡,Static Nested Class)和內(nèi)部類(Inner Class)。內(nèi)部類我們介紹過很多了准谚,現(xiàn)在來看看靜態(tài)內(nèi)部類去扣。
什么是靜態(tài)內(nèi)部類呢?是內(nèi)部類唆铐,并且是靜態(tài)(static修飾)的即為靜態(tài)內(nèi)部類奔滑。只有在是靜態(tài)內(nèi)部類的情況下才能把static修復(fù)符放在類前,其他任何時(shí)候static都是不能修飾類的王浴。
靜態(tài)內(nèi)部類的形式很好理解,但是為什么需要靜態(tài)內(nèi)部類呢叼耙?那是因?yàn)殪o態(tài)內(nèi)部類有兩個(gè)優(yōu)點(diǎn):加強(qiáng)了類的封裝性和提高了代碼的可讀性筛婉,我們通過一段代碼來解釋這兩個(gè)優(yōu)點(diǎn)癞松,如下所示:
public class Person{
//姓名
private String name;
//家庭
private Home home;
//構(gòu)造函數(shù)設(shè)置屬性值
public Person(String _name){
name = _name;
}
/* home、name的getter/setter方法省略 */
public static class Home{
//家庭地址
private String address;
//家庭電話
private String tel;
public Home(String _address,String _tel){
address = _address;
tel = _tel;
}
/* address硕勿、tel的getter/setter方法省略 */
}
}
優(yōu)點(diǎn)一:封裝性的提高
其中Person類中定義了一個(gè)靜態(tài)內(nèi)部類Home枫甲,它表示的意思是“人的家庭信息”,由于Home類封裝了家庭信息粱栖,不用在Person類中再定義homeAddre脏毯、homeTel等屬性,這就使封裝性提高了食店。
優(yōu)點(diǎn)二: 可讀性提高
同時(shí)我們僅僅通過代碼就可以分析出Person和Home之間的強(qiáng)關(guān)聯(lián)關(guān)系乎折,也就是說語義增強(qiáng)了顾患,可讀性提高了自娩。
所
以在使用時(shí)就會(huì)非常清楚它要表達(dá)的含義:
public static void main(String[] args) {
//定義張三這個(gè)人
Person p = new Person("張三");
//設(shè)置張三的家庭信息
p.setHome(new Person.Home("上海","021"));
}
定義張三這個(gè)人,然后通過Person.Home類設(shè)置張三的家庭信息捶箱,這是不是就和我們真實(shí)世界的情形相同了?先登記人的主要信息丁屎,然后登記人員的分類信息〕看ǎ可能你又要問了,這和我們一般定義的類有什么區(qū)別呢共虑?又有什么吸引人的地方呢?如下所示:
提高封裝性妈拌。從代碼位置上來講,靜態(tài)內(nèi)部類放置在外部類內(nèi)尘分,其代碼層意義就是:靜態(tài)內(nèi)部類是外部類的子行為或子屬性猜惋,兩者直接保持著一定的關(guān)系培愁,比如在我們的例子中,看到Home類就知道它是Person的Home信息定续。
提高代碼的可讀性。相關(guān)聯(lián)的代碼放在一起私股,可讀性當(dāng)然提高了。
形似內(nèi)部庇茫,神似外部。靜態(tài)內(nèi)部類雖然存在于外部類內(nèi)旦签,而且編譯后的類文件名也包含外部類(格式是:外部類+$+內(nèi)部類),但是它可以脫離外部類存在宁炫,也就是說我們?nèi)匀豢梢酝ㄟ^new Home()聲明一個(gè)Home對象,只是需要導(dǎo)入“Person.Home”而已羔巢。
解釋了這么多,讀者可能會(huì)覺得外部類和靜態(tài)內(nèi)部類之間是組合關(guān)系(Composition)了竿秆,這是錯(cuò)誤的,外部類和靜態(tài)內(nèi)部類之間有強(qiáng)關(guān)聯(lián)關(guān)系幽钢,這僅僅表現(xiàn)在“字面”上,而深層次的抽象意義則依賴于類的設(shè)計(jì)匪燕。
那靜態(tài)內(nèi)部類與普通內(nèi)部類有什么區(qū)別呢蕾羊?問得好,區(qū)別如下:
(1)靜態(tài)內(nèi)部類不持有外部類的引用
在普通內(nèi)部類中书闸,我們可以直接訪問外部類的屬性利凑、方法,即使是private類型也可以訪問截碴,這是因?yàn)閮?nèi)部類持有一個(gè)外部類的引用日丹,可以自由訪問蚯嫌。而靜態(tài)內(nèi)部類,則只可以訪問外部類的靜態(tài)方法和靜態(tài)屬性(如果是private權(quán)限也能訪問择示,這是由其代碼位置所決定的),其他則不能訪問汪诉。
(2)靜態(tài)內(nèi)部類不依賴外部類
普通內(nèi)部類與外部類之間是相互依賴的關(guān)系谈秫,內(nèi)部類實(shí)例不能脫離外部類實(shí)例,也就是說它們會(huì)同生同死该编,一起聲明硕淑,一起被垃圾回收器回收。而靜態(tài)內(nèi)部類是可以獨(dú)立存在的于樟,即使外部類消亡了拇囊,靜態(tài)內(nèi)部類還是可以存在的。
(3)普通內(nèi)部類不能聲明static的方法和變量
普通內(nèi)部類不能聲明static的方法和變量奢米,注意這里說的是變量,常量(也就是final static修飾的屬性)還是可以的鬓长,而靜態(tài)內(nèi)部類形似外部類,沒有任何限制英上。
這篇文章清晰的分析了啤覆,靜態(tài)內(nèi)部類的兩大優(yōu)點(diǎn)(提高封裝性和可讀性),我們可以在碼代碼的過程中相恃,注意使用靜態(tài)內(nèi)部類笨觅,會(huì)給自己的代碼提高不少!原文地址