1)首先弛针,用內(nèi)部類是因?yàn)閮?nèi)部類與所在外部類有一定的關(guān)系,往往只有該外部類調(diào)用此內(nèi)部類李皇。所以沒有必要專門用一個Java文件存放這個類削茁。
2)靜態(tài)都是用來修飾類的內(nèi)部成員的。比如靜態(tài)方法掉房,靜態(tài)成員變量茧跋,靜態(tài)常量。它唯一的作用就是隨著類的加載(而不是隨著對象的產(chǎn)生)而產(chǎn)生圃阳,以致可以用類名+靜態(tài)成員名直接獲得厌衔。這樣靜態(tài)內(nèi)部類就可以理解了,因?yàn)檫@個類沒有必要單獨(dú)存放一個文件捍岳,它一般來說只被所在外部類使用富寿。并且它可以直接被用 外部類名+內(nèi)部類名 獲得。以下舉例說明怎么使用:
Student類有個叫School的內(nèi)部類(非靜態(tài))
Student stu = new Student();
stu.School sch = new stu.School();
sch就是School的一個對象锣夹。
假如School是內(nèi)部靜態(tài)類:
Student.School sch = new Student.School();
3)靜態(tài)內(nèi)部類也叫嵌套類页徐,用這個名字給他定義是更加形象的。意思是說內(nèi)部類和外部類的關(guān)系只是層次嵌套關(guān)系银萍,所以只是在創(chuàng)建類文件的時候類文件名是如下形式:outer$inner.java变勇,在使用方面完全和兩個普通類一樣。
和非靜態(tài)內(nèi)部類相比贴唇,區(qū)別就在于靜態(tài)內(nèi)部類沒有了指向外部的引用搀绣。這實(shí)際上和C++中的嵌套類很相像了,Java內(nèi)部類與C++嵌套類最大的不同就在于是否有指向外部的引用這一點(diǎn)上戳气,當(dāng)然從設(shè)計(jì)的角度以及以它一些細(xì)節(jié)來講還有區(qū)別链患。
4)一般內(nèi)部類在我看來才是真正的內(nèi)部類,他們不僅有著嵌套關(guān)系瓶您,更重要的是內(nèi)部類可以獲得外部類的引用從而實(shí)現(xiàn)回調(diào)麻捻。而且通過創(chuàng)建內(nèi)部類還可已讓java實(shí)現(xiàn)真正的多繼承8偃浴(interface名叫接口,顧名思義贸毕,他就是實(shí)現(xiàn)接口的郑叠,讓一個類繼承多個接口實(shí)現(xiàn)多繼承是不合適的)
在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員,一般的非靜態(tài)內(nèi)部類明棍,可以隨意的訪問外部類中的成員變量與成員方法乡革。即使這些成員方法被修飾為private(私有的成員變量或者方法),其非靜態(tài)內(nèi)部類都可以隨意的訪問击蹲。則是非靜態(tài)內(nèi)部類的特權(quán)署拟。不能夠從靜態(tài)內(nèi)部類的對象中訪問外部類的非靜態(tài)成員(包括成員變量與成員方法)。
如果不需要內(nèi)部類對象與其外圍類對象之間有聯(lián)系,那么可以將內(nèi)部類聲明為static.通常稱為嵌套類歌豺。
當(dāng)內(nèi)部類是static時,意味著:
[1]要創(chuàng)建嵌套類的對象,并不需要其外圍類的對象
[2]不能從嵌套類的對象中訪問非靜態(tài)的外圍類對象
嵌套類與普通的內(nèi)部類還有一個區(qū)別:
普通內(nèi)部類的字段的字段與方法,只能放在類的外部層次上,所以普通的內(nèi)部類不能有static數(shù)據(jù)和static字段,也不能包含嵌套類.但是在嵌套類里可以包含所有這些東西推穷。