日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Java中内部类

發布時間:2025/7/14 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java中内部类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

1.四種內部類:成員內部類、局部內部類、匿名內部類和靜態內部類。

2.成員內部類

2.1成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。

2.2成員內部類隱藏現象

不過要注意的是,當成員內部類擁有和外部類同名的成員變量或者方法時,會發生隱藏現象,即默認情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:

1

2

外部類.this.成員變量

外部類.this.成員方法

  雖然成員內部類可以無條件地訪問外部類的成員,而外部類想訪問成員內部類的成員卻不是這么隨心所欲了。在外部類中如果要訪問成員內部類的成員,必須先創建一個成員內部類的對象,再通過指向這個對象的引用來訪問:

2.3內部類可以擁有private訪問權限、protected訪問權限、public訪問權限及包訪問權限。

2.4為什么成員內部類可以無條件訪問外部類的成員?

編譯器會默認為成員內部類添加了一個指向外部類對象的引用,雖然我們在定義的內部類的構造器是無參構造器,編譯器還是會默認添加一個參數,該參數的類型為指向外部類對象的一個引用,所以成員內部類中的Outter this&0 指針便指向了外部類對象,因此可以在成員內部類中隨意訪問外部類的成員。從這里也間接說明了成員內部類是依賴于外部類的,如果沒有創建外部類的對象,則無 法對Outter this&0引用進行初始化賦值,也就無法創建成員內部類的對象了。

3.局部內部類

3.1局部內部類是定義在一個方法或者一個作用域里面的類,它和成員內部類的區別在于局部內部類的訪問僅限于方法內或者該作用域內。

3.2注意,局部內部類就像是方法里面的一個局部變量一樣,是不能有public、protected、private以及static修飾符的。

4.匿名內部類

匿名內部類是唯一一種沒有構造器的類。正因為其沒有構造器,所以匿名內部類的使用范圍非常有限,大部分匿名內部類用于接口回調。匿名內部類在編譯的時候由 系統自動起名為Outter$1.class。一般來說,匿名內部類用于繼承其他類或是實現接口,并不需要增加額外的方法,只是對繼承方法的實現或是重寫。

4.1.為什么局部內部類和匿名內部類只能訪問局部final變量?

public class Test {public static void main(String[] args) {}public void test(final int b) {final int a = 10;new Thread(){public void run() {System.out.println(a);System.out.println(b);};}.start();} }

上段代碼中,如果把變量a和b前面的任一個final去掉,這段代碼都編譯不過。我們先考慮這樣一個問題:

  當test方法執行完畢之后,變量a的生命周期就結束了,而此時Thread對象的生命周期很可能還沒有結束,那么在Thread的run方法中繼續訪問變量a就變成不可能了,但是又要實現這樣的效果,怎么辦呢?Java采用了 復制? 的手段來解決這個問題。

也就說如果局部變量的值在編譯期間就可以確定,則直接在匿名內部里面創建一個拷貝。如果局部變量的值無法在編譯期間確定,則通過構造器傳參的方式來對拷貝進行初始化賦值。

  從上面可以看出,在run方法中訪問的變量a根本就不是test方法中的局部變量a。這樣一來就解決了前面所說的 生命周期不一致的問題。但是新的問題又來了,既然在run方法中訪問的變量a和test方法中的變量a不是同一個變量,當在run方法中改變變量a的值的 話,會出現什么情況?

  對,會造成數據不一致性,這樣就達不到原本的意圖和要求。為了解決這個問題,java編譯器就限定必須將變量a限制為final變量,不允許對變量a進行更改(對于引用類型的變量,是不允許指向新的對象),這樣數據不一致性的問題就得以解決了。

  到這里,想必大家應該清楚為何 方法中的局部變量和形參都必須用final進行限定了。

?

?

5.靜態內部類

  靜態內部類也是定義在另一個類里面的類,只不過在類的前面多了一個關鍵字static。 靜態內部類是不需要依賴于外部類的,這點和類的靜態成員屬性有點類似,并且它不能使用外部類的非static成員變量或者方法,這點很好理解,因為在沒有 外部類的對象的情況下,可以創建靜態內部類的對象,如果允許訪問外部類的非static成員就會產生矛盾,因為外部類的非static成員必須依附于具體 的對象。

?

?

?

?

?

轉載于:https://my.oschina.net/u/1037605/blog/748017

總結

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

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