Java基礎(chǔ)第3章_第1頁
Java基礎(chǔ)第3章_第2頁
Java基礎(chǔ)第3章_第3頁
Java基礎(chǔ)第3章_第4頁
Java基礎(chǔ)第3章_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第三章第三章 面向?qū)ο螅ㄉ希┟嫦驅(qū)ο螅ㄉ希┟嫦驅(qū)ο蟮母拍蠲嫦驅(qū)ο蟮母拍顦?gòu)造方法構(gòu)造方法this和和static類與對象類與對象內(nèi)部類內(nèi)部類思考:可以定義什么?思考:可以定義什么? 目錄3.13.1面向?qū)ο蟮母拍?.23.2類與對象3.33.3構(gòu)造方法3.43.4this關(guān)鍵字3.53.5垃圾回收3.63.6static關(guān)鍵字3.73.7內(nèi)部類3.83.8Java的幫助文檔3.1 面向?qū)ο蟮母拍蠲嫦驅(qū)ο蟮母拍?面向?qū)ο笫且环N符合人類思維習(xí)慣的編程思想。現(xiàn)實生活中存在各種形態(tài)不同的事物,這些事物之間存在著各種各樣的聯(lián)系。在程序中使用對象來映射現(xiàn)實中的事物,使用對象的關(guān)系來描述事物之間的聯(lián)系,這種思

2、想就是面向?qū)ο蟆?面向過程就是分析解決問題所需要的步驟,面向?qū)ο髣t是把解決的問題按照一定規(guī)則劃分為多個獨立的對象,然后通過調(diào)用對象的方法來解決問題。 面向?qū)ο蟮奶攸c主要可以概括為封裝性、繼承性和多態(tài)性。3.2 類與對象類與對象 面向?qū)ο蟮木幊趟枷肓D在程序中對事物的描述與該事物在現(xiàn)實中的形態(tài)保持一致。為了做到這一點,面向?qū)ο蟮乃枷胫刑岢鰞蓚€概念,即類和對象。 類是對某一類事物的抽象描述,而對象用于表示現(xiàn)實中該類事物的個體。類和對象的關(guān)系如同玩具和玩具模型的關(guān)系??梢詫⑼婢吣P涂醋魇且粋€類,將一個個玩具看作對象,從玩具模型和玩具之間的關(guān)系便可以看出類與對象之間的關(guān)系。類用于描述多個對象的共同特征

3、,它是對象的模板。對象用于描述現(xiàn)實中的個體,它是類的實例,并且一個類可以對應(yīng)多個對象3.2 類與對象類與對象 3.2.1 類的定義類的定義 在面向?qū)ο蟮乃枷胫凶詈诵木褪菍ο?,為了在程序中?chuàng)建對象,首先需要定義一個類。類是對象的抽象,它用于描述一組對象的共同特征和行為 類中可以定義成員變量和成員方法,其中成員變量用于描述對象的特征,也被稱作屬性,成員方法用于描述對象的行為,可簡稱為方法3.2 類與對象類與對象 3.2.1 類的定義類的定義 定義一個Person類 Person是類名,age是成員變量,speak()是成員方法。在成員方法speak()中可以直接訪問成員變量age。 3.2.2 對

4、象的創(chuàng)建與使用對象的創(chuàng)建與使用 應(yīng)用程序想要完成具體的功能,僅有類是遠遠不夠的,還需要根據(jù)類創(chuàng)建實例對象。 在Java程序中可以使用new關(guān)鍵字來創(chuàng)建對象,具體格式如下: 例如,創(chuàng)建一個Person對象,具體示例如下:3.2 類與對象類與對象3.2 類與對象類與對象 3.2.2 對象的創(chuàng)建與使用對象的創(chuàng)建與使用 “new Person()”用于創(chuàng)建Person類的一個實例對象,“Person p”則是聲明了一個Person類型的變量p。中間的等號用于將Person對象在內(nèi)存中的地址賦值給變量p,這樣變量p便持有了對象的引用,變量p和對象之間的引用關(guān)系如下圖所示。3.2 類與對象類與對象 3.2

5、.2 對象的創(chuàng)建與使用對象的創(chuàng)建與使用 在創(chuàng)建Person對象后,可以通過對象的引用來訪問對象所有的成員,具體格式如下: 看一個例子,具體如下:3.2 類與對象類與對象 3.2.2 對象的創(chuàng)建與使用對象的創(chuàng)建與使用 在例程3-2中,通過“p1.age=18”將p1對象的age屬性賦值為18,沒有對p2對象的age屬性進行賦值,但p2對象的age屬性也是有值的,其值為0。這是因為在針對不同類型的成員變量,Java虛擬機會賦予不同的初始值3.2 類與對象類與對象 3.2.2 對象的創(chuàng)建與使用對象的創(chuàng)建與使用 當(dāng)對象被實例化后,在程序中可以通過對象的引用變量來訪問該對象的成員。當(dāng)沒有任何變量引用這個

6、對象時,它將成為垃圾對象,不能再被使用。 情況1:變量超出作用域變?yōu)槔鴮ο?.2 類與對象類與對象 3.2.2 對象的創(chuàng)建與使用對象的創(chuàng)建與使用 情況2:變量的值變?yōu)閚ull 運行結(jié)果在例程3-3中,創(chuàng)建了一個Person類的實例對象,并兩次調(diào)用了該對象的say()方法。第一次調(diào)用say()方法時可以正常打印,但在第10行代碼中將變量p2的值置為null,當(dāng)再次調(diào)用say()方法時拋出了空指針異常。在Java中,null是一種特殊的常量,當(dāng)一個變量的值為null時,則表示該變量不指向任何一個對象。在例程中,當(dāng)把變量p2置為null時,被p2所引用的Person對象就會失去引用,成為垃圾對象3

7、.2 類與對象類與對象 3.2.3 類的設(shè)計類的設(shè)計 假設(shè)要在程序中描述一個學(xué)校所有學(xué)生的信息,可以先設(shè)計一個學(xué)生類(Student),在這個類中定義兩個屬性name、age分別表示學(xué)生的姓名和年齡,定義一個方法introduce()表示學(xué)生做自我介紹。根據(jù)上面的描述設(shè)計出來的Student類如例程3-4所示3.2 類與對象類與對象 3.2.4 類的封裝類的封裝 先來看一個例子,具體如下: 運行結(jié)果在例程3-5的第5行代碼中,將年齡賦值為一個負數(shù)-30,這在程序中不會有任何問題,但在現(xiàn)實生活中明顯是不合理的。為了解決年齡不能為負數(shù)的問題,在設(shè)計一個類時,應(yīng)該對成員變量的訪問作出一些限定,不允許

8、外界隨意訪問。這就需要實現(xiàn)類的封裝。3.2 類與對象類與對象 3.2.4 類的封裝類的封裝 所謂類的封裝是指在定義一個類時,將類中的屬性私有化,即使用private關(guān)鍵字來修飾,私有屬性只能在它所在類中被訪問,為了能讓外界訪問私有屬性,需要提供一些使用public修飾的公有方法,其中包括用于獲取屬性值的getXxx方法和設(shè)置屬性值的setXxx方法3.2 類與對象類與對象 3.2.4 類的封裝類的封裝l 使用private關(guān)鍵字將屬性name和age聲明為私有l(wèi) getName()方法用于獲取name屬性的值,setName()方法用于設(shè)置name屬性的值l getAge()和setAge()

9、方法用于獲取和設(shè)置age屬性的值。在setAge()方法中對參數(shù)stuAge的值進行檢查,3.3 構(gòu)造方法構(gòu)造方法 3.3.1 構(gòu)造方法的定義構(gòu)造方法的定義 在一個類中定義的方法如果同時滿足以下三個條件,該方法稱為構(gòu)造方法,具體如下:p 方法名和類名相同p 方法名的前面沒有返回值類型的聲明p 方法中不能使用return語句返回一個值3.3 構(gòu)造方法構(gòu)造方法 3.3.1 構(gòu)造方法的定義構(gòu)造方法的定義在例程3-7的Person類中定義了一個無參的構(gòu)造方法Person()。從運行結(jié)果可以看出,Person類中無參的構(gòu)造方法被調(diào)用了。這是因為第9行代碼在實例化Person對象時會自動調(diào)用類的構(gòu)造方法,

10、“new Person()”語句的作用除了會實例化Person對象,還會調(diào)用構(gòu)造方法Person()3.3 構(gòu)造方法構(gòu)造方法 3.3.1 構(gòu)造方法的定義構(gòu)造方法的定義 在一個類中除了定義無參的構(gòu)造方法,還可以定義有參的構(gòu)造方法,通過有參的構(gòu)造方法就可以實現(xiàn)對屬性的賦值例程3-8的Person類中定義了有參的構(gòu)造方法Person(int a)。第13行代碼中的“new Person(20)”會在實例化對象的同時調(diào)用有參的構(gòu)造方法,并傳入了參數(shù)20。在構(gòu)造方法Person(int a)中將20賦值給對象的age屬性。通過運行結(jié)果可以看出,Person對象在調(diào)用speak()方法時,其age屬性已經(jīng)

11、被賦值為20。3.3 構(gòu)造方法構(gòu)造方法 3.3.2 構(gòu)造方法的重載構(gòu)造方法的重載 與普通方法一樣,構(gòu)造方法也可以重載,在一個類中可以定義多個構(gòu)造方法,只要每個構(gòu)造方法的參數(shù)類型或參數(shù)個數(shù)不同即可例程3-9的Person類中定義了兩個構(gòu)造方法,它們構(gòu)成了重載。在創(chuàng)建p1對象和p2對象時,根據(jù)傳入?yún)?shù)的不同,分別調(diào)用不同的構(gòu)造方法。從程序的運行結(jié)果可以看出,兩個構(gòu)造方法對屬性賦值的情況是不一樣的,其中一個參數(shù)的構(gòu)造方法只針對name屬性進行賦值,這時age屬性的值為默認值0。腳下留心腳下留心 在Java中的每個類都至少有一個構(gòu)造方法,如果在一個類中沒有定義構(gòu)造方法,系統(tǒng)會自動為這個類創(chuàng)建一個默認的

12、構(gòu)造方法,這個默認的構(gòu)造方法沒有參數(shù),在其方法體中沒有任何代碼,即什么也不做。 下面程序中Person類的兩種寫法效果是完全一樣的。腳下留心腳下留心 如果為該類定義了構(gòu)造方法,系統(tǒng)就不再提供默認的構(gòu)造方法了 運行結(jié)果從圖3-12可以看出程序在編譯時報錯,其原因是調(diào)用new Person()創(chuàng)建Person類的實例對象時,需要調(diào)用無參的構(gòu)造方法,而我們并沒有定義無參的構(gòu)造方法,只是定義了一個有參的構(gòu)造方法,系統(tǒng)將不再自動生成無參的構(gòu)造方法3.4 this關(guān)鍵字關(guān)鍵字 1、通過this關(guān)鍵字可以明確地去訪問一個類的成員變量,解決與局部變量名稱沖突問題,具體示例如下: 在上面的代碼中,構(gòu)造方法的參數(shù)

13、被定義為age,它是一個局部變量,在類中還定義了一個成員變量,名稱也是age。在構(gòu)造方法中如果使用“age”,則是訪問局部變量,但如果使用“this.age”則是訪問成員變量。3.4 this關(guān)鍵字關(guān)鍵字 2、通過this關(guān)鍵字調(diào)用成員方法,具體示例代碼如下: 在上面的speak()方法中,使用this關(guān)鍵字調(diào)用openMouth()方法。注意,此處的this關(guān)鍵字可以省略不寫,也就是說上面的第6行代碼寫成“this.openMouth()”和“openMouth()”,效果是完全一樣的3.4 this關(guān)鍵字關(guān)鍵字 3、構(gòu)造方法是在實例化對象時被Java虛擬機自動調(diào)用的,在程序中不能像調(diào)用其它

14、方法一樣去調(diào)用構(gòu)造方法,但可以在一個構(gòu)造方法中使用“this(參數(shù)1,參數(shù)2)”的形式來調(diào)用其它的構(gòu)造方法通過this關(guān)鍵字調(diào)用成員方法3.4 this關(guān)鍵字關(guān)鍵字注意:注意:1、只能在構(gòu)造方法中使用this調(diào)用其它的構(gòu)造方法2、在構(gòu)造方法中,使用this調(diào)用構(gòu)造方法的語句必須位于第一行,且只能出現(xiàn)一次,下面的寫法是非法的。3、不能在一個類的兩個構(gòu)造方法中使用this互相調(diào)用3.5 垃圾回收垃圾回收 當(dāng)一個對象成為垃圾后仍會占用內(nèi)存空間,時間一長,就會導(dǎo)致內(nèi)存空間的不足。針對這種情況,Java中引入了垃圾回收機制 Java虛擬機就會啟動垃圾回收器將這些垃圾對象從內(nèi)存中釋放,從而使程序獲得更多可

15、用的內(nèi)存空間 除了等待Java虛擬機進行自動垃圾回收,也可以通過調(diào)用System.gc()方法來通知Java虛擬機立即進行垃圾回收。當(dāng)一個對象在內(nèi)存中被釋放時,它的finalize()方法會被自動調(diào)用3.5 垃圾回收垃圾回收在例程3-13的Person類中定義了一個finalize()方法,該方法的返回值必須為void,并且要使用public來修飾。在main()方法中創(chuàng)建了兩個對象p1和p2,然后將兩個變量置為null,這意味著新創(chuàng)建的兩個對象成為垃圾了,緊接著通過“System.gc()”語句通知虛擬機進行垃圾回收。從運行結(jié)果可以看出,虛擬機針對兩個垃圾對象進行了回收,并在回收之前分別調(diào)用

16、兩個對象的finalize()方法。3.6 static關(guān)鍵字關(guān)鍵字 3.6.1 靜態(tài)變量靜態(tài)變量 在一個Java類中,可以使用static關(guān)鍵字來修飾成員變量,該變量被稱作靜態(tài)變量 靜態(tài)變量被所有實例共享,可以使用“類名.變量名”的形式來訪問 static關(guān)鍵字只能用于修飾成員變量,不能用于修飾局部變量,否則編譯會報錯,下面的代碼是非法的。3.6 static關(guān)鍵字關(guān)鍵字 3.6.1 靜態(tài)變量靜態(tài)變量例程3-14的Student類中定義了一個靜態(tài)變量schoolName,用于表示學(xué)生所在的學(xué)校,它被所有的實例所共享。由于schoolName是靜態(tài)變量,因此可以直接使用Student.scho

17、olName的方式進行調(diào)用,也可以通過Student的實例對象進行調(diào)用,如stu2.schoolName。在第8行代碼將變量schoolName賦值為“黃淮學(xué)院”,通過運行結(jié)果可以看出學(xué)生對象stu1和stu2的schoolName屬性均為“黃淮學(xué)院”?!包S淮學(xué)院”;3.6 static關(guān)鍵字關(guān)鍵字 3.6.2 靜態(tài)方法靜態(tài)方法 被static關(guān)鍵字修飾的方法稱為靜態(tài)方法 同靜態(tài)變量一樣,靜態(tài)方法可以使用“類名.方法名”的方式來訪問,也可以通過類的實例對象來訪問。 在一個靜態(tài)方法中只能訪問用static修飾的成員,原因在于沒有被static修飾的成員需要先創(chuàng)建對象才能訪問,而靜態(tài)方法在被調(diào)用時

18、可以不創(chuàng)建任何對象。3.6 static關(guān)鍵字關(guān)鍵字 3.6.2 靜態(tài)方法靜態(tài)方法例程3-15的Person類中定義了靜態(tài)方法sayHello(),在第8行代碼處通過“Person.sayHello()”的形式調(diào)用了靜態(tài)方法,由此可見靜態(tài)方法不需要創(chuàng)建對象就可以調(diào)用。3.6 static關(guān)鍵字關(guān)鍵字 3.6.3 靜態(tài)代碼塊靜態(tài)代碼塊 在Java類中,使用一對大括號包圍起來的若干行代碼被稱為一個代碼塊,用static關(guān)鍵字修飾的代碼塊稱為靜態(tài)代碼塊 當(dāng)類被加載時,靜態(tài)代碼塊會執(zhí)行,由于類只加載一次,因此靜態(tài)代碼塊只執(zhí)行一次 在程序中,通常使用靜態(tài)代碼塊來對類的成員變量進行初始化3.6 stati

19、c關(guān)鍵字關(guān)鍵字 3.6.3 靜態(tài)代碼塊靜態(tài)代碼塊從圖3-19所示的運行結(jié)果可以看出,程序中的兩段靜態(tài)代碼塊都執(zhí)行了。在命令行窗口輸入“java Example14”后,虛擬機首先會加載類Example14,在加載類的同時就會執(zhí)行該類的靜態(tài)代碼塊,緊接著會調(diào)用main()方法。在該方法中創(chuàng)建了兩個Person對象,但在兩次實例化對象的過程中,靜態(tài)代碼塊只執(zhí)行一次,這就說明類在第一次使用時才會被加載,并且只會加載一次3.6 static關(guān)鍵字關(guān)鍵字 3.6.4 單例模式單例模式 設(shè)計模式就是針對這些問題和需求,在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問題的思考方式 單例模式

20、是Java中的一種設(shè)計模式,它是指在設(shè)計一個類時,需要保證在整個程序運行期間針對該類只存在一個實例對象 看一個實現(xiàn)了單例模式的類3.6 static關(guān)鍵字關(guān)鍵字 3.6.4 單例模式單例模式 類的構(gòu)造方法使用private修飾,聲明為私有,這樣就不能在類的外部使用new關(guān)鍵字來創(chuàng)建實例對象了。 在類的內(nèi)部創(chuàng)建一個該類的實例對象,并使用靜態(tài)變量INSTANCE引用該對象,由于變量應(yīng)該禁止外界直接訪問,因此使用private修飾,聲明為私有成員 為了讓類的外部能夠獲得類的實例對象,需要定義一個靜態(tài)方法getInstance(),用于返回該類實例INSTANCE。由于方法是靜態(tài)的,外界可以通過“類名

21、.方法名”的方式來訪問3.7 內(nèi)部類內(nèi)部類 3.7.1 成員內(nèi)部類成員內(nèi)部類 在一個類中除了可以定義成員變量、成員方法,還可以定義類,這樣的類被稱作成員內(nèi)部類。 在成員內(nèi)部類中可以訪問外部類的所有成員例程3-20中,Outer類是一個外部類,在該類中定義了一個內(nèi)部類Inner和一個test()方法,其中,Inner類有一個show()方法,在show()方法中訪問外部類的成員變量num,test()方法中創(chuàng)建了內(nèi)部類Inner的實例對象,并通過該對象調(diào)用show()方法,將num值進行打印。從運行結(jié)果可以看出,內(nèi)部類可以在外部類中被使用,并能訪問外部類的成員3.7 內(nèi)部類內(nèi)部類 3.7.1 成

22、員內(nèi)部類成員內(nèi)部類 如果想通過外部類去訪問內(nèi)部類,則需要通過外部類對象去創(chuàng)建內(nèi)部類對象,創(chuàng)建內(nèi)部類對象的具體語法格式如下: 針對例程3-20中定義的Outer類寫一個測試程序 運行結(jié)果同例程3-20一樣,如圖3-21所示。3.7 內(nèi)部類內(nèi)部類 3.7.2 靜態(tài)內(nèi)部類靜態(tài)內(nèi)部類 可以使用static關(guān)鍵字來修飾一個成員內(nèi)部類,該內(nèi)部類被稱作靜態(tài)內(nèi)部類,它可以在不創(chuàng)建外部類對象的情況下被實例化。創(chuàng)建靜態(tài)內(nèi)部類對象的具體語法格式如下:3.7 內(nèi)部類內(nèi)部類 3.7.3 方法內(nèi)部類方法內(nèi)部類 方法內(nèi)部類是指在成員方法中定義的類,它只能在當(dāng)前方法中被使用。例程3-23中,在Outer類的test()方法中定義了一個內(nèi)部類Inner。由于Inner是方法內(nèi)部類,因此程序只能在方法中創(chuàng)建該類的實例對象并調(diào)用show()方法。從運行結(jié)果可以看出,方法內(nèi)部類也可以訪問外部類的成員變量num。3.8 Java的幫助文檔的幫助文檔 3.8.1 Java的文檔注釋的文檔注釋 文檔注釋用于是嵌入到程序當(dāng)中的幫助信息,用于說明如何使用當(dāng)前程序,它以“/*”開頭,以“*/”標(biāo)志結(jié)束 Java中提供了javadoc命令,它可以將這些幫助信息提取出來,自動生成HTML格式的幫助文檔,從而實現(xiàn)程序的文檔化author

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論