21天學(xué)通Java電子教案_第12章__內(nèi)部類.ppt_第1頁
21天學(xué)通Java電子教案_第12章__內(nèi)部類.ppt_第2頁
21天學(xué)通Java電子教案_第12章__內(nèi)部類.ppt_第3頁
21天學(xué)通Java電子教案_第12章__內(nèi)部類.ppt_第4頁
21天學(xué)通Java電子教案_第12章__內(nèi)部類.ppt_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第12章 內(nèi)部類,以前看到過這樣一條新聞,說在一個雞蛋中發(fā)現(xiàn)里面有一個小雞蛋,這個小雞蛋同樣有蛋清和蛋黃,當(dāng)時感覺很奇怪的。后來學(xué)習(xí)Java后,發(fā)現(xiàn)在Java中竟然也有這種奇怪的事,那就是內(nèi)部類。內(nèi)部類就好像剛提到的雞蛋中的小雞蛋一樣,包含在另一個類中的。通過本章的學(xué)習(xí),會發(fā)現(xiàn)內(nèi)部類還有好多和該小雞蛋相似的地方。讀者通過本章的學(xué)習(xí),應(yīng)該完成如下幾個目標(biāo)。 了解什么是非靜態(tài)內(nèi)部類和如何進(jìn)行非靜態(tài)內(nèi)部類和外部類之間的訪問。 了解什么是局部內(nèi)部類和如何進(jìn)行局部內(nèi)部類和外部類之間的訪問。 了解什么是靜態(tài)內(nèi)部類和如何進(jìn)行靜態(tài)內(nèi)部類和外部類之間的訪問。 了解什么是匿名內(nèi)部類和如何進(jìn)行匿名內(nèi)部類和外部類之間

2、的訪問。,12.1 非靜態(tài)內(nèi)部類,當(dāng)一個類作為另一個類的非靜態(tài)成員,則這個類就是一個非靜態(tài)內(nèi)部類。在本節(jié)中就來學(xué)習(xí)如何創(chuàng)建和使用非靜態(tài)內(nèi)部類,同時也來講解如何在內(nèi)部類中訪問外部類和在外部類中如何訪問內(nèi)部類。,12.1.1 創(chuàng)建非靜態(tài)內(nèi)部類,創(chuàng)建非靜態(tài)內(nèi)部類是很容易的,只需要定義一個類讓該類作為其他類的非靜態(tài)成員。該非靜態(tài)內(nèi)部類和成員變量或者成員方法沒有區(qū)別,同樣可以在非靜態(tài)內(nèi)部類前面加可以修飾成員的修飾符。 創(chuàng)建非靜態(tài)內(nèi)部類的基本語法如下所示。 class Wai class Nei /內(nèi)部類成員 /外部類成員 ,12.1.2 在外部類中訪問內(nèi)部類,在內(nèi)部類的程序中,是經(jīng)常會進(jìn)行外部類和內(nèi)部類

3、之間訪問的。在外部類中訪問內(nèi)部類是很容易的,只要把內(nèi)部類看成一個類,然后創(chuàng)建該類的對象,使用對象來調(diào)用內(nèi)部類中的成員就可以了。 【范例】示例代碼是一個在外部類中訪問內(nèi)部類的程序。 01class Wai 02 03class Nei/創(chuàng)建非靜態(tài)內(nèi)部類 04 05int i=5;/內(nèi)部類成員 06 07public void myVoid()/外部類成員 08 09Nei n=new Nei();/創(chuàng)建一個內(nèi)部類對象 10int ii=n.i;/訪問內(nèi)部類成員 11System.out.println(內(nèi)部類的變量值為:+ii); 12 13 14public class NeiBuLei2 1

4、5 16public static void main(String args) 17 18Wai w=new Wai(); 19w.myVoid(); 20 21,從程序的第16行主方法講起,在main方法中,首先創(chuàng)建一個外部類對象,然后訪問外部類的成員方法。在外部類的成員方法中,創(chuàng)建了一個內(nèi)部類對象,然后使用內(nèi)部類對象調(diào)用內(nèi)部類的成員變量,從而得到結(jié)果。編譯該程序?qū)a(chǎn)生三個class文件,分別是主類、外部類和內(nèi)部類。內(nèi)部類產(chǎn)生的class文件的名稱為Wai$Nei.class,在該名稱中可以區(qū)分該內(nèi)部類到底是哪一個類的內(nèi)部類。,12.1.3 在外部類外訪問內(nèi)部類,不但可以在外部類中訪問內(nèi)部

5、類,還可以在外部類外訪問內(nèi)部類。讀者肯定會覺得非常難的,要想訪問類成員中的成員怎么訪問呢。其實在Java中,是很容易做到的。在外部類外訪問內(nèi)部類的基本語法如下所示。 Wai.Nei wn=new Wai().new Nei(); 使用該方法就能夠創(chuàng)建一個內(nèi)部類對象,使用該內(nèi)部類對象就可以訪問內(nèi)部類的成員。該方法是不容易理解的,該方法也是可以分為兩條語句的。 Wai w=new Wai(); Wai.Nei wn=w.new Nei(); 這樣就很容易理解了。首先是創(chuàng)建一個外部類的對象,然后讓該外部類對象調(diào)用創(chuàng)建一個內(nèi)部類對象。,一個在外部類外訪問內(nèi)部類的程序,01class Wai 02 03

6、class Nei/創(chuàng)建非靜態(tài)內(nèi)部類 04 05int i=5;/內(nèi)部類成員 06int ii=6; 07 08 09public class NeiBuLei3 10 11public static void main(String args) 12 13Wai.Nei wn1=new Wai().new Nei(); 14Wai w=new Wai(); 15Wai.Nei wn2=w.new Nei(); 16System.out.println(內(nèi)部類中的變量i的值為:+wn1.i); 17System.out.println(內(nèi)部類中的變量ii的值為:+wn2.ii);圖12-3 在

7、外部類外訪問內(nèi)部類 18 19,在示例代碼中使用了兩種方法來從外部類外訪問內(nèi)部類。在外部類外訪問內(nèi)部類時,是不能夠直接創(chuàng)建內(nèi)部類對象的,因為內(nèi)部類只是外部類的一個成員。所以要想創(chuàng)建內(nèi)部類對象,首先要創(chuàng)建外部類對象,然后以外部類對象為標(biāo)識來創(chuàng)建內(nèi)部類對象。,12.1.4 在內(nèi)部類中訪問外部類,在內(nèi)部類中訪問外部類,就像所有的同一個類中成員互相訪問一樣,這樣是沒有限制的,包括將成員聲明為private私有的。 【范例】示例代碼是一個在內(nèi)部類中訪問外部類的程序。 示例代碼 01class Wai 02 03int i=8;/外部類成員變量 04class Nei/創(chuàng)建非靜態(tài)內(nèi)部類 05 06publ

8、ic void myVoid()/內(nèi)部類成員變量 07 08System.out.println(外部類中的成員變量值為:+i); 09 10 11 12public class NeiBuLei5 13 14public static void main(String args) 15 16Wai w=new Wai();/創(chuàng)建外部類對象 17Wai.Nei wn2=w.new Nei();/創(chuàng)建內(nèi)部類對象 18wn2.myVoid();/調(diào)用內(nèi)部類中成員 19 20,在示例代碼中,在內(nèi)部類中定義了一個myVoid來訪問外部類中的成員變量i??梢钥吹綇膬?nèi)部類中訪問外部類是非常容易的,不需要添

9、加任何內(nèi)容,就像成員方法間調(diào)用一樣。 有些讀者學(xué)習(xí)完示例代碼后,會有疑問,如果外部類中也有一個成員變量i怎么辦呢?讀者可以進(jìn)行實驗,從結(jié)果中可以看到得到的是內(nèi)部類成員變量的值。下面通過示例代碼解決這個問題。,一個在內(nèi)部類和外部類中具有同名稱變量訪問的程序,01class Wai 02 03int i=8;/外部類成員變量 04class Nei/創(chuàng)建非靜態(tài)內(nèi)部類 05 06int i=9; 07Wai ww=new Wai(); 08public void myVoid()/內(nèi)部類成員變量 09 10System.out.println(內(nèi)部類中的成員變量值為:+i); 11System.ou

10、t.println(外部類中的成員變量值為:+ww.i); 12 13 14 15public class NeiBuLei6 16 17public static void main(String args) 18 19Wai w=new Wai();/創(chuàng)建外部類對象 20Wai.Nei wn2=w.new Nei();/創(chuàng)建內(nèi)部類對象 21wn2.myVoid();/調(diào)用內(nèi)部類中成員 22 23,在本程序中的第3行定義了一個外部類的成員變量,第6行定義了一個內(nèi)部類的成員變量,這兩個成員變量的名稱是相同的。而在內(nèi)部直接訪問時,將訪問的是內(nèi)部類的成員變量。要想訪問外部類成員變量,就需要首先創(chuàng)建

11、一個外部類對象,然后使用該對象調(diào)用外部類成員變量。,12.2 局部內(nèi)部類,在上一節(jié)中介紹了非靜態(tài)成員內(nèi)部類,以及如何對非靜態(tài)成員內(nèi)部類進(jìn)行操作。在本節(jié)中就來學(xué)習(xí)局部內(nèi)部類的知識,通過非靜態(tài)成員內(nèi)部類的學(xué)習(xí),是很容易來學(xué)習(xí)局部內(nèi)部類的。從名稱就可以看出局部內(nèi)部類是作為一個類的局部變量來定義的。,12.2.1 創(chuàng)建局部內(nèi)部類,局部內(nèi)部類的作用范圍是和局部變量的作用范圍相同的,只在局部中起作用,所以對局部內(nèi)部類進(jìn)行訪問時,只能在該局部內(nèi)部類的作用范圍內(nèi)。 【范例】示例代碼是一個創(chuàng)建和訪問局部內(nèi)部類的程序。 示例代碼 01class Wai 02 03public void myVoid() 04 0

12、5class Nei/定義一個局部內(nèi)部類 06 07int i=5;/局部內(nèi)部類的成員變量 08 09Nei n=new Nei(); 10System.out.println(局部內(nèi)部類的成員變量為:+n.i); 11 12 13public class NeiBuLei8 14 15public static void main(String args) 16 17Wai w=new Wai();/創(chuàng)建外部類對象 18w.myVoid();/調(diào)用內(nèi)部類中成員 19 20,在本程序中定義了一個局部內(nèi)部類,并進(jìn)行了對該局部內(nèi)部類的訪問。對該內(nèi)部類進(jìn)行訪問必須在該內(nèi)部類所在的方法中通過創(chuàng)建內(nèi)部類

13、對象來進(jìn)行訪問。這是因為這里的內(nèi)部類是作為局部成員的形式出現(xiàn)的,只能在它所在的方法中進(jìn)行調(diào)用。,12.2.2 在局部內(nèi)部類中訪問外部類成員變量,在局部內(nèi)部類中訪問外部類成員變量是很容易實現(xiàn)的,并不需要進(jìn)行過多操作。在局部內(nèi)部類中可以直接調(diào)用外部類的成員變量。 【范例】示例代碼是一個在局部內(nèi)部類中訪問外部類成員變量的程序。 示例代碼 01class Wai 02 03int i=9;/定義一個外部類的成員變量 04public void myVoid() 05 06class Nei/定義一個局部內(nèi)部類 07 08public void myNeiVoid() 09 10System.out.p

14、rintln(外部類的成員變量值為:+i);/訪問外部類的成員變量 11 12 13Nei n=new Nei();/創(chuàng)建內(nèi)部類對象 14n.myNeiVoid();/調(diào)用內(nèi)部類中的成員方法 15 16 17public class NeiBuLei9 18 19public static void main(String args) 20 21Wai w=new Wai();/創(chuàng)建外部類對象 22w.myVoid();/調(diào)用內(nèi)部類中成員 23 24,在示例代碼中定義了一個局部內(nèi)部類,在該局部內(nèi)部類中定義了一個方法來訪問外部類的成員變量。從運行結(jié)果中可以看出在內(nèi)部類中可以成功訪問外部類的成員變

15、量。在該程序中同樣需要注意的是,對內(nèi)部類進(jìn)行訪問需要和內(nèi)部類在同一方法中。,12.2.3 在局部內(nèi)部類中訪問外部類的局部變量,和訪問外部類的成員變量不同,在局部內(nèi)部類中訪問外部類中和局部內(nèi)部類在同一局部的局部變量是不能夠直接訪問的。 【范例】示例代碼是一個錯誤的訪問外部類局部變量的程序。 示例代碼 01class Wai 02 03public void myVoid() 04 05int i=9;/定義一個外部類的局部變量 06class Nei/定義一個局部內(nèi)部類 07 08public void myNeiVoid() 09 10System.out.println(外部類的局部變量值為

16、:+i);/訪問外部類的成員變量 11 12 13Nei n=new Nei();/創(chuàng)建內(nèi)部類對象 14n.myNeiVoid();/調(diào)用內(nèi)部類中的成員方法 15 16 17public class NeiBuLei10 18 19public static void main(String args) 20 21Wai w=new Wai();/創(chuàng)建外部類對象 22w.myVoid();/調(diào)用內(nèi)部類中成員 23 24,運行該程序是會發(fā)生錯誤的,錯誤信息為“從內(nèi)部類中訪問局部變量i;需要被聲明為最終類型”。在局部內(nèi)部類中訪問外部類的局部變量是不能夠訪問普通的局部變量的,必須將該局部變量聲明為f

17、inal。,12.2.4 靜態(tài)方法中的局部內(nèi)部類,局部內(nèi)部類定義在非靜態(tài)方法和靜態(tài)方法中是不同的,在前面的兩小節(jié)中都是將局部內(nèi)部類定義在非靜態(tài)方法中,在本節(jié)中就來學(xué)習(xí)靜態(tài)方法中定義局部內(nèi)部類的情況。在靜態(tài)方法中定義的局部內(nèi)部類要想訪問外部類中的成員,該程序必須是靜態(tài)成員。靜態(tài)成員和非靜態(tài)成員之間的訪問是不變的。 注意:在靜態(tài)方法中定義的局部內(nèi)部類要想訪問外部類中的成員,該程序必須是靜態(tài)成員。靜態(tài)成員和非靜態(tài)成員之間的訪問是不變的。,一個錯誤的訪問成員的程序,01class Wai 02 03int i=3; 04public static void myVoid() 05 06class Ne

18、i/定義一個局部內(nèi)部類 07 08public void myNeiVoid() 09 10System.out.println(外部類的局部變量值為:+i);/訪問外部類的成/員變量 11 12 13Nei n=new Nei();/創(chuàng)建內(nèi)部類對象 14n.myNeiVoid();/調(diào)用內(nèi)部類中的成員方法 15 16 17public class NeiBuLei12 18 19public static void main(String args) 20 21Wai w=new Wai();/創(chuàng)建外部類對象 22w.myVoid();/調(diào)用內(nèi)部類中成員 23 24,運行該程序是會發(fā)生錯誤的

19、,錯誤信息為“無法從靜態(tài)上下文中引用非靜態(tài)變量i”。該程序主要錯誤原因是第三行定義的外部類變量是一個非靜態(tài)成員變量。而本程序中定義的局部變量是定義在靜態(tài)的方法中,所以是不能夠正常訪問的。如果想正常訪問,就需要將程序修改成示例代碼12-13的形式。,12.3 靜態(tài)內(nèi)部類,在第一節(jié)中已經(jīng)講解了非靜態(tài)內(nèi)部類,在本節(jié)中就來講解什么是靜態(tài)內(nèi)部類。靜態(tài)內(nèi)部類就是在外部類中扮演一個靜態(tài)成員的角色。在本節(jié)中就來學(xué)習(xí)如何創(chuàng)建靜態(tài)內(nèi)部類和關(guān)于靜態(tài)內(nèi)部類訪問的問題。,12.3.1 創(chuàng)建靜態(tài)內(nèi)部類,創(chuàng)建靜態(tài)內(nèi)部類的形式和創(chuàng)建非靜態(tài)內(nèi)部類的形式很相似的,只是需要將該內(nèi)部類使用static修飾成靜態(tài)的形式。使用stati

20、c修飾類,這在正常類中是不可能的。定義靜態(tài)內(nèi)部類的語法如下所示。 class Wai static class Nei /內(nèi)部類成員 /外部類成員 ,12.3.2 在外部類中訪問靜態(tài)內(nèi)部類,在外部類中訪問靜態(tài)內(nèi)部類和在外部類中訪問非靜態(tài)內(nèi)部類一樣的,只需要從成員間訪問的角度就可以考慮到這一點。 【范例】示例代碼是一個在外部類中訪問靜態(tài)內(nèi)部類的程序。 示例代碼 01class Wai 02 03static class Nei/創(chuàng)建靜態(tài)內(nèi)部類 04 05int i=5;/內(nèi)部類成員 06 07public void myVoid()/外部類成員 08 09Nei n=new Nei();/創(chuàng)建一

21、個內(nèi)部類對象 10int ii=n.i;/訪問內(nèi)部類成員 11System.out.println(靜態(tài)內(nèi)部類的變量值為:+ii); 12 13 14public class NeiBuLei15 15 16public static void main(String args) 17 18Wai w=new Wai(); 19w.myVoid(); 20 21,12.3.3 在外部類外訪問靜態(tài)內(nèi)部類,通過上一小節(jié)的學(xué)習(xí),知道在外部類中訪問靜態(tài)內(nèi)部類和訪問非靜態(tài)內(nèi)部類是相同的,但是在外部類中訪問靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類就不再相同。因為靜態(tài)內(nèi)部類是外部類的靜態(tài)成員,靜態(tài)成員是不需要外部類對象而存

22、在的,所以在外部類外,對靜態(tài)內(nèi)部類進(jìn)行訪問時是不需要創(chuàng)建外部類對象的。 注意:因為靜態(tài)內(nèi)部類是外部類的靜態(tài)成員,靜態(tài)成員是不需要外部類對象而存在的,所以在外部類外,對靜態(tài)內(nèi)部類進(jìn)行訪問時是不需要創(chuàng)建外部類對象的。,12.4 匿名內(nèi)部類,在所有的內(nèi)部類中最難的就應(yīng)該是匿名內(nèi)部類。匿名內(nèi)部類從名字上看就知道是沒有類名的類。在本節(jié)中就來介紹如何創(chuàng)建匿名內(nèi)部類和如何進(jìn)行關(guān)于匿名內(nèi)部類的訪問問題。,12.4.1 創(chuàng)建匿名內(nèi)部類,在創(chuàng)建匿名內(nèi)部類中將使用到繼承父類或者實現(xiàn)接口的知識,匿名內(nèi)部類是沒有名字的,所以在創(chuàng)建匿名內(nèi)部類時同時創(chuàng)建匿名內(nèi)部類的對象。創(chuàng)建匿名內(nèi)部類的語法格式如下所示。 new NeiFather() /匿名內(nèi)部類 ; 在創(chuàng)建匿名內(nèi)部類的語法中,NeiFather是匿名內(nèi)部類繼承的父類的類名,使用new同時創(chuàng)建了匿名內(nèi)部類的對象。在匿名內(nèi)部類中可以重寫父類中的方法,也可以定義自己的方法。,12.4.2 匿名內(nèi)部類的初始化,匿名內(nèi)部類是沒有名稱的,所以匿名內(nèi)部類也是不可能具有構(gòu)造器的,這就出現(xiàn)一個問題。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論