轉載自: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();
靜態內部類的作用:只是為了降低包的深度,方便類的使用,靜態內部類適用于包含類當中,但又不依賴與外在的類,不用使用外在類的非靜態屬性和方法,只是為了方便管理類結構而定義。在創建靜態內部類的時候,不需要外部類對象的引用。非靜態內部類有一個很大的優點:可以自由使用外部類的所有變量和方法
根據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.從字面上看,一個被稱為靜態嵌套類,一個被稱為內部類。從字面的角度解釋是這樣的:什么是嵌套?嵌套就是我跟你沒關系,自己可以完全獨立存在,但是我就想借你的殼用一下,來隱藏一下我自己。什么是內部?內部就是我是你的一部分,我了解你,我知道你的全部,沒有你就沒有我。(所以內部類對象是以外部類對象存在為前提的)官方解釋:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html靜態內部類就是個獨立的類。之所以要弄這么個東西,只是起到一個注釋的效果,而且這個注釋可靜態檢查。比如有A,B兩個類,B有點特殊,雖然可以獨立存在,但只被A使用。這時候怎么辦?如果把B并入A里,復雜度提高,搞得A違反單一職責。如果B獨立,又可能被其他類(比如同一個包下的C)依賴,不符合設計的本意。所以不如將其變成A.B,等于添加個注釋,告訴其他類別使用B了,它只跟A玩。非靜態的才是真正的內部類,對其外部類有個引用。總結:一 . 靜態內部類可以有靜態變量和方法,而非靜態內部類則不能有靜態成員和靜態方法。 二 . 靜態內部類的非靜態變量和方法可以訪問外部類的靜態變量,而不可訪問外部類的非靜態變量;
三 . 非靜態內部類的非靜態成員可以訪問外部類的非靜態變量和方法。
新聞熱點
疑難解答