版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第6章 類與對象在日常生活中,在蓋房子之前要首先設(shè)計(jì)一個(gè)建筑圖紙,然后根據(jù)圖紙來蓋房子。所謂類,好比在日常生活中描述一個(gè)物品的信息,如房子的建筑圖紙。而對象就好比實(shí)實(shí)在在的房子。本章將要介紹類的定義、類的成員變量的定義和方法的定義、方法的參數(shù)等知識。通過本章的學(xué)習(xí),讀者應(yīng)該能夠完成如下幾個(gè)目標(biāo)。了解什么是面向?qū)ο?。熟悉Java中的類并能夠進(jìn)行類的操作。掌握J(rèn)ava程序中的方法的創(chuàng)建和使用。6.1 什么是面向?qū)ο笏^面向?qū)ο螅侵妇帉懗绦虻臅r(shí)候要圍繞著一個(gè)對象的功能進(jìn)行編寫的。本節(jié)將要介紹面向?qū)ο蟮奶攸c(diǎn)以及與面向過程編程的區(qū)別。6.1.1 面向?qū)ο缶幊痰奶攸c(diǎn)面向?qū)ο缶幊痰目s寫是OOP,全稱為Ob
2、ject Oriented Programming。在進(jìn)行面向?qū)ο蟮木幊虝r(shí),方法和成員變量都寫在具體的對象里,并對其成員變量和方法有很好的隱藏性。對象之間的訪問都是通過其接口進(jìn)行的。下面列舉面向?qū)ο缶幊痰奶攸c(diǎn),分為如下幾種。首先要說的是繼承。所謂繼承,是發(fā)生在類與類之間的,是子類共享父類成員變量和方法的一種模式。通過擴(kuò)展子類的方法可以使子類有比父類更加強(qiáng)大的功能。說明:繼承是面向?qū)ο缶幊痰奶攸c(diǎn),同樣也是Java的特點(diǎn),這里和其他語言有很大不同。示例代碼01/bike類描述的是一個(gè)自行車02class bike03040506/ racing_cycle類描述的是一個(gè)公路賽車,繼承自bike07
3、class racing_cycle extends bike0809 提示:繼承是發(fā)生在類與類之間的。繼承可以是單繼承,也可以多層繼承。多態(tài)是指對象在運(yùn)行期和編譯期具有兩種狀態(tài),多態(tài)的使用使代碼具有了更多的靈活性和重用性。抽象是指在定義類的時(shí)候,確定了該類的一些行為和動(dòng)作。比如自行車可以移動(dòng),但怎么移動(dòng)不進(jìn)行說明。這種提前定義一些動(dòng)作和行為的類為抽象的。封裝是指對一件物品的描述信息是這個(gè)物品所特有的,是不能讓外界看到的一些成員變量和方法。在Java里成員變量和方法就被封裝在類里,需要通過一些特有的方法訪問它們。6.1.2 面向?qū)ο缶幊膛c面向過程編程的區(qū)別面向過程是指在遇到問題的時(shí)候,怎么去解
4、決這個(gè)問題,而分析問題的步驟,就是解決這個(gè)問題的方法,是通過方法一步一步來完成的。面向?qū)ο笫侵冈谟龅絾栴}的時(shí)候,把問題分解成各自獨(dú)立功能的類,而這個(gè)類是完成各自問題的。總結(jié)如下所述。面向過程和面向?qū)ο笞蠲黠@的區(qū)別就是,面向?qū)ο笫前凑找瓿傻墓δ軄韺?shí)現(xiàn)的,而面向過程是按照解決這個(gè)問題的步驟來實(shí)現(xiàn)的。面向?qū)ο笫前凑粘绦蛑械墓δ苓M(jìn)行劃分的。面向過程是按照問題的解決思路來劃分的,是一步一步來解決問題的。面向過程更看重的是完成問題的過程。面向?qū)ο蟾粗氐氖枪δ?,通過各種功能模塊的組合來完成問題。6.2 什么是類所謂類是一種抽象的東西,描述的是一個(gè)物品的完整信息。比如房子和圖紙的關(guān)系。在Java里,圖紙就
5、是類,定義了房子的各種信息,而房子是類的實(shí)體。6.2.1 類的定義和對象的創(chuàng)建定義一個(gè)類表示定義了一個(gè)功能模塊。下面先介紹如何定義一個(gè)類,以及如何創(chuàng)建這個(gè)類的實(shí)例,即對象。類是通過關(guān)鍵字class來定義的,在class關(guān)鍵字后面加上類的名稱,這樣就創(chuàng)建了一個(gè)類。在類里面可以定義類的成員變量和方法。類的語法代碼如下所示。class 類的名稱/類的成員變量/類的方法創(chuàng)建類的實(shí)例是通過new關(guān)鍵字來定義的,后面加上定義類時(shí)為類起的名稱,需要注意的是在類名后還需要一個(gè)括號。創(chuàng)建類的實(shí)例的代碼如下所示。new 類的名稱();6.2.2 如何使用現(xiàn)有類在定義一些類的時(shí)候,如何使用它們呢?這里需要分為多種情
6、況。定義的類可以在一個(gè)包下面,也可以不在一個(gè)包下面,這在使用時(shí)是不同的。類又分為已有類和自定義類,它們之間的使用也是有區(qū)別的。下面就通過范例來講解在不同情況下如何使用類?!痉独吭谕夸浵率褂妙悺J紫仁嵌x一個(gè)bike類,在該類中不存在任何成員變量和方法,這里只是演示如何在同一目錄下使用類。示例代碼01/bike.java02class bike0304接下來定義一個(gè)使用bike類的類。01/testBike.java02/在testBike類里使用了bike類03class testBike0405bike b = new bike();066.2.3 類設(shè)計(jì)的技巧設(shè)計(jì)一個(gè)類要明確這個(gè)所要完
7、成的功能,類里的成員變量和方法是描述類的功能的。如果定義了和這個(gè)類不相關(guān)的成員變量和方法將不是一個(gè)良好的設(shè)計(jì)?!痉独渴纠a是一個(gè)不太好的類設(shè)計(jì)。示例代碼01public class bike0203/這個(gè)成員變量描述的是自行車的顏色.04String color = 黃色;0506/這個(gè)成員變量描述的是公路賽車的顏色,所以在這里不太合適07String racing_color = 綠色;08在本程序中定義了一個(gè)表示自行車顏色的color成員變量,又定義了一個(gè)表示賽車顏色的racing_color成員變量;而該程序是定義的一個(gè)bike自行車類,所以定義表示賽車顏色的racing_color
8、成員變量是不太好的選擇。 【范例6-8】示例代碼6-8是一個(gè)良好的類設(shè)計(jì)。示例代碼6-801public class bike0203/這個(gè)成員變量描述的是自行車的顏色04String color = 黃色;0501public class racing0203/這個(gè)成員變量描述的是公路賽車的顏色04String racing_color = 綠色;05【代碼解析】在該范例中,定義了兩個(gè)類。其中bike類中只定義了一個(gè)表示自行車顏色的color成員變量。同樣在racing類中只定義了一個(gè)表示賽車顏色的racing_color成員變量。這種設(shè)計(jì)相對上一個(gè)范例中的設(shè)計(jì)要好得多,這樣使類和成員變量相
9、對應(yīng),也使別人更容易讀懂代碼。6.3 成員變量所謂成員變量就是這個(gè)類里定義的一些私有的變量.,這些變量是屬于這個(gè)類的。就好比日常生活中的自行車的大小,即這個(gè)車子是26還是28的,這個(gè)尺寸就是自行車的成員變量,是描述這個(gè)自行車的。下面開始介紹成員變量。6.3.1 成員變量的創(chuàng)建成員變量描述的是這個(gè)類的一些屬性或狀態(tài)的,下面通過代碼來演示怎么定義成員變量。語法為:變量的類型 變量的名稱。【范例】創(chuàng)建成員變量的一般形式。示例代碼01/bike類描述的是一個(gè)自行車02public class bike0304/這個(gè)成員變量描述的是自行車的顏色.05String color;0607/這個(gè)成員變量描述的
10、是自行車的大小,即尺寸.08String size;09在該程序中,定義了一個(gè)叫做bike的類,在該類中定義了兩個(gè)成員變量,一個(gè)是表示自行車顏色的color成員變量,一個(gè)是表示自行車型號的size成員變量。 下面看一個(gè)創(chuàng)建成員變量的完整形式。 代碼講解通過new關(guān)鍵字來創(chuàng)建這個(gè)bike類的對象,用bike類的對象引用b來給其成員變量賦值。因?yàn)槌蓡T變量是在這個(gè)類實(shí)例化后才能訪問到的。成員變量賦完值后,調(diào)用println語句來打印并顯示結(jié)果。 6.3.2 成員變量的初始化通過new關(guān)鍵字來創(chuàng)建一個(gè)對象后,會有一個(gè)系統(tǒng)默認(rèn)的初始值。所以說不管有沒有在創(chuàng)建成員變量的時(shí)候給變量一個(gè)值,系統(tǒng)都會有一個(gè)默認(rèn)
11、的值。成員變量和對象的引用在申明的時(shí)候不對其賦初值,那么系統(tǒng)都會賦一個(gè)初值,具體的信息如表所示。6.4 局部變量局部變量和成員變量很相似都是描述信息的。局部變量和成員變量的不同點(diǎn)就是局部變量是在方法體里創(chuàng)建的,在方法體外是訪問不到這個(gè)變量的。6.4.1 局部變量的創(chuàng)建和初始化局部變量描述的是方法體的一些屬性或狀態(tài)的,下面通過代碼來演示怎么定義局部變量。創(chuàng)建局部變量的基本語法為:變量的類型 變量的名稱。【范例】演示局部變量的例子。示例代碼01/test類描述的是基本類型的初始化02public class test40304/程序的運(yùn)行函數(shù)即主入口函數(shù)05public static void m
12、ain(String args)0607/基本類型的局部變量08int size = 123;09boolean b = true;10/打印并顯示局部變量11System.out.println(size);12System.out.println(b);1314 6.4.2 局部變量和成員變量的區(qū)別局部變量描述的是這個(gè)方法體內(nèi)的屬性的,而成員變量描述的是這個(gè)對象里的屬性的,它們之間的區(qū)別,即訪問區(qū)別如下:成員變量可以被public、protected、default、private、static、final修飾符修飾。局部變量可以被final修飾符修飾,但不能修飾為public、prote
13、cted、default、private、static。成員變量是在堆里進(jìn)行創(chuàng)建的,而局部變量是在棧里進(jìn)行創(chuàng)建的。成員變量是系統(tǒng)默認(rèn)值。局部變量沒有系統(tǒng)默認(rèn)值,必須手動(dòng)賦值。6.5 方法每個(gè)人都有走、吃和睡等動(dòng)作。在Java中,所謂方法就好比日常生活中的一個(gè)動(dòng)作,是完成一系列操作的。在Java中也是如此,方法收到對象的信息,進(jìn)行處理的操作。6.5.1 方法的創(chuàng)建和參數(shù)方法的參數(shù)是提供外界在執(zhí)行方法的時(shí)候提供給方法的特殊描述信息的,好比日常生活中的,用力砸東西,用大力砸東西。而這個(gè)用大力就是提供給這個(gè)進(jìn)行特殊描述的。創(chuàng)建方法的語法為:方法修飾符 方法的返回類型 方法名稱(方法參數(shù))方法體方法的定
14、義如下所示。public void add(int i, int n)System.out.println(i+n);代碼說明: 方法名稱為add,有兩個(gè)參數(shù)都是int類型的。 方法體是打印i+n的值,并顯示出來。方法的修飾符為public類型的,修飾符可有可無。 方法的返回類型有很多種,主要分為如下幾類。方法返回值為void類型時(shí)為無返回值。方法返回值還可以為任意的類型,如String、Boolean、int。如果定義了方法的返回類型就必須在方法體內(nèi)用return把返回值進(jìn)行返回。方法的返回值可以為null,但必須是對象類型?;绢愋筒荒芊祷豱ull。在返回值為基本類型的時(shí)候,只要能夠自動(dòng)轉(zhuǎn)
15、換就可返回。方法的參數(shù)也有多種形式,下面是對方法參數(shù)的討論。方法的參數(shù)可以為基本數(shù)據(jù)類型,也可以為對象引用類型。每個(gè)參數(shù)都有完整的聲明該變量的形式。方法的參數(shù)可以有一個(gè),也可有多個(gè)。Java程序的入口main就為一個(gè)方法,參數(shù)為String args,它是個(gè)特殊的方法。6.5.2 方法參數(shù)的傳遞參數(shù)的傳遞是傳遞的值還是引用呢。下面通過例子來分別說明,請仔細(xì)考慮?!痉独慨?dāng)傳遞類型為基本類型時(shí),傳遞的是該類型的值。01/test類描述的是基本類型的傳遞02public class test0304/方法add是把傳入的參數(shù)進(jìn)行+1,并顯示其結(jié)果05public void add(int i)06
16、07i = i + 1;08System.out.println(i);091011/程序的運(yùn)行方法,即主入口方法12public static void main(String args)1314/基本類型的局部變量15int size = 44;1617/創(chuàng)建bike類的對象實(shí)例,即bike類的對象引用b18test t = new test();1920/打印原來的值21System.out.println(size);22/運(yùn)行時(shí)的值23t.add(size);24/打印運(yùn)行后的值25System.out.println(size);2627在參數(shù)為基本類型進(jìn)行傳遞的時(shí)候,是傳遞的這個(gè)
17、值的備份,即第二份。不論在方法中怎么改變這個(gè)備份,都不是操作原來的數(shù)據(jù),所以原來的值是不會改變的。 當(dāng)傳遞的參數(shù)為對象引用類型時(shí),也是利用的傳值的方式進(jìn)行的。 01/test類描述的是方法的傳遞02public class test0304public static void main(String args)0506/創(chuàng)建一個(gè)對象類型07String s = new String(Hello );0809/打印其值10System.out.println(before : + s);1112/通過方法去改變其值13changeString(s);1415/打印方法改變的值和原值16Syste
18、m.out.println(changeString : + s);17System.out.println(after : + s);1820public static void changeString(String str)2122str = new String(hi); 23str = str + china!;2425當(dāng)把對象引用s傳遞到一個(gè)方法后,這個(gè)方法可以改變這個(gè)對象的屬性,并能返回相應(yīng)的改變。但這個(gè)對象引用指向的這個(gè)字符串s是永遠(yuǎn)不會改變的。這里傳遞對象引用后,又通過這個(gè)引用去創(chuàng)建了一個(gè)新的String類型的字符串,這兩個(gè)字符串在內(nèi)存中當(dāng)然不是同一個(gè)了。 6.6 對象引用的
19、使用所謂對象引用就是該引用名稱指向內(nèi)存中的一個(gè)對象,通過調(diào)用該引用即可完成對該對象的操作。本節(jié)將要討論一些操作對象引用中將出現(xiàn)的一些常見問題。如不存在的對象、空引用、對象間的比較等問題,下面分別來說明。6.6.1 調(diào)用不存在的對象或成員變量如果調(diào)用的對象或成員變量沒有創(chuàng)建,那么在編譯的時(shí)候編譯器將出現(xiàn)錯(cuò)誤。下面用代碼演示這個(gè)錯(cuò)誤,并演示如何修正。【范例】代碼演示訪問不存在的成員變量。示例代碼01/test類描述的是測試訪問不存在的成員變量02public class test0304/main方法為程序的入口函數(shù)05public static void main(String args)060
20、7/創(chuàng)建test類的對象實(shí)例08test t = new test();09/t.a訪問的是一個(gè)不存在的成員變量,將提示不可識別的字段。10System.out.println(t.a);1112 運(yùn)行將會發(fā)生如下異常。Exception in thread main java.lang.Error: Unresolved compilation problem: t.a cannot be resolved or is not a fieldat test.main(test.java:7)【代碼解析】對象引用t要訪問的是a這個(gè)成員變量,而a沒有聲明,在編譯的時(shí)候?qū)⑻崾惧e(cuò)誤信息。在錯(cuò)誤提示里
21、,已經(jīng)提示為main方法里的第7行,只需查看這里就能找到錯(cuò)誤的所在。修改上述代碼使程序運(yùn)行通過。 01/test類描述的是測試訪問不存在的成員變量02public class test0304/a為test類的成員變量05String a;0607/main方法為程序的入口方法08public static void main(String args)0910/創(chuàng)建test類的對象實(shí)例11test t = new test();12/t.a訪問的是一個(gè)不存在的成員變量,將提示不可識別的字段13System.out.println(t.a);1415根據(jù)上例中的錯(cuò)誤提示在test類聲明了一個(gè)名稱
22、為a的成員變量。因?yàn)镾tring類型的a沒有進(jìn)行賦值,所以打印出來為null。 6.6.2 調(diào)用對象為null值的引用任何操作的對象的值為null的時(shí)候都將出現(xiàn)空指針錯(cuò)誤,即“NullPointException“錯(cuò)誤,因?yàn)槌蓡T變量和方法是屬于對象的,即屬于用new關(guān)鍵字創(chuàng)建出來的對象的。下面用代碼來演示這個(gè)錯(cuò)誤,并演示如何進(jìn)行修正。01/ArrayList類所需要的02import java.util.ArrayList;0304/test類測試訪問null值的對象05public class test0607/聲明一個(gè)成員變量a并進(jìn)行初值08public String a = test類的
23、成員變量;10/Java程序的主入口方法11public static void main(String args)1213/創(chuàng)建test類的對象實(shí)例14test t = new test();1516/創(chuàng)建一個(gè)集合類,對象引用為一個(gè)null值17ArrayList al = null;1819/向一個(gè)null的集合對象里添加數(shù)據(jù)20al.add(t.a);2122ArrayList類為一個(gè)集合類和數(shù)組很相似,都是用來存儲數(shù)據(jù)用的。錯(cuò)誤提示在main方法里的20行,提示為NullPointerException,即空指針錯(cuò)誤。對象引用al聲明為一個(gè)null值,表示這個(gè)對象并沒有創(chuàng)建其對象的實(shí)例,只是一個(gè)引用而已。當(dāng)操作任意一個(gè)為null的對象的時(shí)候都將提示空指針錯(cuò)誤。
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年聚合物粘結(jié)砂漿項(xiàng)目可行性研究報(bào)告
- 2019-2025年中國醫(yī)用X射線機(jī)行業(yè)市場深度分析及發(fā)展前景預(yù)測報(bào)告
- 中國阿奇霉素行業(yè)發(fā)展前景預(yù)測及投資策略研究報(bào)告
- 2025年廢鐵項(xiàng)目投資分析及可行性報(bào)告
- 2022-2027年中國支線航空行業(yè)市場調(diào)研及未來發(fā)展趨勢預(yù)測報(bào)告
- 印花扁平絨面料行業(yè)市場發(fā)展及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 2024-2026年中國有線電視調(diào)制解調(diào)器市場競爭格局及投資戰(zhàn)略規(guī)劃報(bào)告
- 2025年豬皮頭層項(xiàng)目可行性研究報(bào)告
- 2025公司合作合同模板
- 2025摩托車買賣合同范本格式
- 2025年林權(quán)抵押合同范本
- 智能檢測與監(jiān)測技術(shù)-智能建造技術(shù)專02課件講解
- 2025蛇年一年級寒假作業(yè)創(chuàng)意與寓意齊【高清可打印】
- 麻風(fēng)病防治知識課件
- 模具部年終總結(jié)--ppt課件
- 立式熱虹吸再沸器機(jī)械設(shè)計(jì)說明書
- 國家開放大學(xué)電大《生產(chǎn)與運(yùn)作管理》2025-2026期末試題及答案
- 質(zhì)量保證大綱(共14頁)
- 木材材積表0.1-10米.xls
- 輕質(zhì)隔墻板安裝合同協(xié)議書范本標(biāo)準(zhǔn)版
- 車輛管理各崗位績效考核量表
評論
0/150
提交評論