轉(zhuǎn)載自:https://www.zhihu.com/question/28197253
示例代碼如下:
static class Outer { class Inner {} static class StaticInner {}}Outer outer = new Outer();Outer.Inner inner = outer.new Inner();Outer.StaticInner inner0 = new Outer.StaticInner();
靜態(tài)內(nèi)部類的作用:只是為了降低包的深度,方便類的使用,靜態(tài)內(nèi)部類適用于包含類當(dāng)中,但又不依賴與外在的類,不用使用外在類的非靜態(tài)屬性和方法,只是為了方便管理類結(jié)構(gòu)而定義。在創(chuàng)建靜態(tài)內(nèi)部類的時(shí)候,不需要外部類對(duì)象的引用。非靜態(tài)內(nèi)部類有一個(gè)很大的優(yōu)點(diǎn):可以自由使用外部類的所有變量和方法
根據(jù)Oracle官方的說法:Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.從字面上看,一個(gè)被稱為靜態(tài)嵌套類,一個(gè)被稱為內(nèi)部類。從字面的角度解釋是這樣的:什么是嵌套?嵌套就是我跟你沒關(guān)系,自己可以完全獨(dú)立存在,但是我就想借你的殼用一下,來隱藏一下我自己。什么是內(nèi)部??jī)?nèi)部就是我是你的一部分,我了解你,我知道你的全部,沒有你就沒有我。(所以內(nèi)部類對(duì)象是以外部類對(duì)象存在為前提的)官方解釋:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html靜態(tài)內(nèi)部類就是個(gè)獨(dú)立的類。之所以要弄這么個(gè)東西,只是起到一個(gè)注釋的效果,而且這個(gè)注釋可靜態(tài)檢查。比如有A,B兩個(gè)類,B有點(diǎn)特殊,雖然可以獨(dú)立存在,但只被A使用。這時(shí)候怎么辦?如果把B并入A里,復(fù)雜度提高,搞得A違反單一職責(zé)。如果B獨(dú)立,又可能被其他類(比如同一個(gè)包下的C)依賴,不符合設(shè)計(jì)的本意。所以不如將其變成A.B,等于添加個(gè)注釋,告訴其他類別使用B了,它只跟A玩。非靜態(tài)的才是真正的內(nèi)部類,對(duì)其外部類有個(gè)引用。總結(jié):一 . 靜態(tài)內(nèi)部類可以有靜態(tài)變量和方法,而非靜態(tài)內(nèi)部類則不能有靜態(tài)成員和靜態(tài)方法。 二 . 靜態(tài)內(nèi)部類的非靜態(tài)變量和方法可以訪問外部類的靜態(tài)變量,而不可訪問外部類的非靜態(tài)變量;
三 . 非靜態(tài)內(nèi)部類的非靜態(tài)成員可以訪問外部類的非靜態(tài)變量和方法。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注