日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java嵌套类笔记

發布時間:2024/9/20 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java嵌套类笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義在一個類內部的類,叫作“嵌套類”。嵌套類分為兩種:static的和非static的。后者又有一個專門的名字,叫作“內部類”。所以從概念可以看出,嵌套類跟內部類是所屬關系,后者包含于前者。

同時,嵌套類是其所在類的成員。

  • 內部類可以訪問所在類的所有成員,即使該成員是private的。
  • 而static嵌套類則不得訪問所在類的成員。
  • 同時,嵌套類、static和非static的,都可以被聲明為private、public、protected和default的。

1. 使用嵌套類的原因:

  • 能夠將僅在一個地方使用的類合理地組合。如果一個類可能只對于另外一個類有用,此時將前者組合到后者,可以使得程序包更加簡潔。
  • 增強封裝性。假如由兩個類A和B,B類需要使用A類中的成員,而恰好該成員又是僅類內部可見(private)的,如果將B定義為A的嵌套類,則B可以使用A的任何成員,而且B也可以聲明為外部不可見(private),將B隱藏起來。
  • 能夠使代碼可讀性和維護性更強。嵌套的類代碼相較于頂級類,更靠近它被使用的地方,方便查看。

2. 靜態嵌套類

與靜態方法與靜態字段類似,靜態嵌套類是與其所在類相關的。靜態嵌套類不能直接使用實例變量或者實例字段,而只能通過一個對象引用,可將靜態嵌套類視為跟其他頂級類一樣,只不過是內嵌在其他類里面,方便打包。

想要理解static應用于內部類時的含義,你就必須記住,普通的內部類對象隱含地保存了一個引用,指向創建它的外圍類對象。然而,當內部類是static的時,就不是這樣了。靜態內部類意味著:
1. 要創建嵌套類的對象,并不需要其外圍類的對象。
2. 不能從嵌套類的對象中訪問非靜態的外圍類對象。

(1)事實上,與前相同,靜態內部類也就類似一個類的靜態成員方法,它不需要外部類的對象而直接由外部類創建。
(2)類似一個類的靜態成員方法,它只能訪問外部類的靜態成員,而不能訪問非靜態成員。
(3)靜態內部類中可以定義靜態成員,當然也可以定義非靜態成員。而其它的內部類都不能定義靜態成員。
(4)在類外部生成一個靜態內部類也和在類外部調用靜態方法一樣,直接用外部類名創建,如下例:

//StaticNestedClass為OuterClass的一個嵌套類 OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();

3. 非靜態嵌套類(內部類)

內部類是與其所在類的實例相關的 ,能夠直接使用實例對象的方法和字段,內部類與實例相關,所以內部類不能定義靜態的成員。

如果需要創建內部類對象,首先需要創建該內部類所在的類的對象,如下所示:

//創建內部類所在類的對象 OuterClass outerObject=new OuterClass(); //創建內部類對象 //注意與靜態嵌套類的構造器使用方法的差異 OuterClass.InnerClass innerObject = outerObject.new InnerClass();

局部類:

局部類可以在任何代碼塊(花括號內)中定義,一般應用于方法之中。

局部類可以使用其所在頂級類的類成員,此外,局部類也可以使用局部變量,然而,其所使用的局部類必須有final關鍵詞修飾,即不可變變量。在java SE8中,局部類可以使用本質上不變的局部變量,即該局部變量即便沒有final關鍵詞修飾,但實際上從初始化以后,其值從未改變過。

從java8開始,局部類也可以使用其所在方法的參數。

與內部類相似,局部類不能定義靜態成員,在靜態方法中定義的局部類不能使用實例成員。

在代碼塊中不能定義接口,因為接口本質是靜態的。局部類中也不能定義接口成員,不過局部類中可以定義常量變量(用final修飾,類型為基本數據類型或者字符串,編譯時進行初始化)。

匿名類

匿名類能是代碼更加簡潔,它不需要名稱,可以聲明,實例化一步完成。

匿名類的聲明是一個表達式,如同調用一個構造器,不同的是其后還跟上了一個定義類的代碼塊。

匿名類的定義的表達式包含如下幾個部分:

  • new關鍵詞
  • 一個該匿名類需要實現的接口或者是繼承的父類的名稱
  • 一對圓括號,包含參數,實現一個接口時,參數部分留空
  • 匿名類主體,跟類的主體類似, 可以定義方法

匿名類對于可使用的類型與局部類相同:
- 可使用其所在類的類成員
- 可使用其所在代碼塊的帶final修飾詞的局部變量,或者初始化后不再賦值的局部變量(java8)
- 對于遮蔽的類型,不能直接用名稱引用
同樣匿名類不能聲明靜態的成員或者接口,但是可以聲明常量變量,在匿名類的類主體中,可以聲明實例字段,實例方法,實例初始化代碼塊和局部類。

嵌套類的遮蔽

當我們聲明一個類型時,如果其名稱與當前代碼塊(如一個方法內部)所在的代碼塊(如類內部)內的另一個類型的聲明含有相同的名稱,這種現象就叫遮蔽。需要用到被遮蔽的類型時,我們不能直接引用其名稱,如下例所示:

public class ShadowTest {public int x = 0; //嵌套類class FirstLevel { //以下聲明會遮蔽其所在類的名稱為x的字段public int x = 1; //以下方法的聲明會遮蔽其所在類的名稱為x的字段void methodInFirstLevel(int x) {System.out.println("x = " + x);System.out.println("this.x = " + this.x);System.out.println("ShadowTest.this.x = " + ShadowTest.this.x);//注意this關鍵詞的使用方法}}public static void main(String... args) {ShadowTest st = new ShadowTest();ShadowTest.FirstLevel fl = st.new FirstLevel();fl.methodInFirstLevel(23);} }

上述代碼輸出為:

x = 23 this.x = 1 ShadowTest.this.x = 0

參考:https://www.cnblogs.com/justforcon/p/6031729.html

總結

以上是生活随笔為你收集整理的java嵌套类笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。