




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、面向?qū)ο笾R(shí)小結(jié)及答疑一、面向?qū)ο蠡靖拍罨仡橨ava的面向?qū)ο蟾拍睿^大部分是模擬現(xiàn)實(shí)世界中的事物而設(shè)計(jì)的。繼承:根據(jù)功能和用途,將類按照層次關(guān)系進(jìn)行設(shè)計(jì)。越在下層的類,功能越多越具體;越在上層的類,其“權(quán)力”越大。類一方面使得學(xué)習(xí)出現(xiàn)了暫時(shí)的困難,但也使得代碼的復(fù)用變得很有意思。系統(tǒng)提供的標(biāo)準(zhǔn)類,其名字必須要經(jīng)常查閱翻譯辭典以加深印象。 構(gòu)造方法:對(duì)象在新生成的時(shí)候必須要執(zhí)行的方法,名字應(yīng)該和類名字完全一致。 class A int x; A() x = 2; A(int x) this.x = x; void print() System.out.println(“x=” + x); 默
2、認(rèn)情況下,A()構(gòu)造方法默認(rèn)是會(huì)自動(dòng)生成的,當(dāng)然里面一點(diǎn)代碼都沒有(也就是說,你不寫的話,系統(tǒng)會(huì)幫你寫上一個(gè)空架子的構(gòu)造方法)。構(gòu)造方法前面必須是沒有“返回類型”的。另外,類中的任何除構(gòu)造方法之外的其它方法必須要“返回類型”的。方法重載:在類中存在兩個(gè)同名的方法,但方法的參數(shù)類型不相同。 void print(int x) void print(int a) 注意,上面寫的這兩個(gè)方法不能叫重載的(參數(shù)個(gè)數(shù)、類型完全相同)方法重寫/覆蓋:在子類和父中存在兩個(gè)同名、同參數(shù)的方法。訪問修飾符:private,protected,public,(默認(rèn)) static,final對(duì)類中的一個(gè)static
3、方法來說,它可以直接通過類名進(jìn)行調(diào)用,而不需要生成對(duì)象。final放在一個(gè)變量前面,表示這是一個(gè)常量,只能有一個(gè)值。final放在一個(gè)方法前面,表示這是一個(gè)不能被覆蓋的方法。final放在一個(gè)類前面,表示這是一個(gè)最終類,它不能被別的類繼承。抽象類:就是在class之前加了一個(gè)abstract的類,這樣的類就不能用來生成對(duì)象了。因此,通常如果一個(gè)類不適合生成對(duì)象的話,我們就要把這個(gè)類定義成抽象的?;蛘?,如果一個(gè)類中包含了沒有方法體的方法(也就是抽象方法),這樣的類也必須定義成抽象類。其它類繼承了抽象類的話,就必須補(bǔ)全這個(gè)抽象類中的所有抽象方法的具體代碼。abstract class A int
4、x; abstract void print();接口:在其中只定義抽象方法。接口的目的,是為了強(qiáng)制某些類中必須具有同樣的方法。因此,只要類實(shí)現(xiàn)了接口,這些類就必須提供接口中方法的具體代碼。因此這些類看起來就有了一些共性了(都包含了接口中規(guī)定的方法)。這是接口的一個(gè)強(qiáng)制規(guī)定。此外,接口中的抽象方法必須是public的,如果不寫上的話,系統(tǒng)會(huì)自定幫我們加上。習(xí)慣上我們還是自己寫上public。interface C public void print();class A implements C int x; public void print() System.out.println(“x=”
5、 + x); class B implements C public void print() System.out.println(“hello”); 上面的類A和類B因?yàn)閷?shí)現(xiàn)了接口C,它們就必須提供接口C中規(guī)定的方法/函數(shù),否則編譯就報(bào)錯(cuò)了。這就是接口的一大特點(diǎn)。接口可以這樣使用:C c = new A();c.print(); / 其實(shí)是調(diào)用A類的對(duì)象中的print()方法c = new B();c.print(); / 其實(shí)是調(diào)用B類的對(duì)象中的print()方法可見,接口變量能夠指向任何實(shí)現(xiàn)了該接口的類的對(duì)象,但只能調(diào)用對(duì)象中的那些“由接口規(guī)定的”方法。對(duì)接口變量c來講,無論它指向的是
6、A類對(duì)象還是B類對(duì)象,接口變量c只知道對(duì)象中有print()方法(也就是接口C中規(guī)定的方法),對(duì)象中的其它內(nèi)容,接口變量c則一無所知。如同一個(gè)USB接口,可以插上任何實(shí)現(xiàn)了USB接口的實(shí)際設(shè)備,如插上優(yōu)盤、移動(dòng)硬盤等等。但是若移動(dòng)硬盤還有MP3播放功能的話,我們的USB接口也不會(huì)知道。USB接口仍會(huì)把這種帶有MP3播放功能的移動(dòng)硬盤當(dāng)作普通的移動(dòng)硬盤來對(duì)待。 那么在Java中又為什么需要接口呢?我們?cè)倏瓷厦娴倪@兩個(gè)類,改寫一下(去掉了implements C語句):class A int x; public void print() System.out.println(“x=” + x);
7、class B public void print() System.out.println(“hello”); 現(xiàn)在的類A、B定義只是少了implements C,里面的內(nèi)容和前面一模一樣。唯一的不同是,類A、B里面的方法名字可以隨便更改了(不會(huì)受任何約束):class A int x; public void print222() System.out.println(“x=” + x); class B public void show() System.out.println(“-”); 我們看到,現(xiàn)在的A、B類里面已經(jīng)亂七八糟了,甚至B類中連print()方法都沒有了。但這兩個(gè)類在編
8、譯時(shí)沒有任何問題,它們只是沒有遵守統(tǒng)一的接口約定而已。為了更好地理解面向?qū)ο筮@些概念,請(qǐng)同學(xué)們務(wù)必仔細(xì)琢磨明白提供的那幾個(gè)程序文件:子類構(gòu)造方法Abc.java抽象類Abc.java接口Abc.java方法修飾符Abc.java方法重寫Abc.java方法重載Abc.java繼承Abc.java訪問修飾符Abc.java二、異常異常的設(shè)計(jì),主要是提供一種集中處理問題的機(jī)制。大家體會(huì)一下下面的兩個(gè)例子。這個(gè)例子是教材上的一個(gè)上機(jī)練習(xí)(教材第329頁的練習(xí)1),其目的是計(jì)算一個(gè)從鍵盤輸入數(shù)的階乘(args0就是一個(gè)從鍵盤上輸入的數(shù)字字符串)。常規(guī)的做法是這樣的: / 判斷是否在命令行中輸入了字符串
9、。args是一個(gè)數(shù)組變量/ 如果數(shù)組大小少于1的話,說明使用者沒有輸入要計(jì)算階乘的那個(gè)數(shù) if (args.length < 1) System.out.println("請(qǐng)?zhí)峁┮粋€(gè)數(shù)字!"); return; / 判斷輸入的字符串是否全部是數(shù)字。我們只要判斷字符串a(chǎn)rgs0中/ 包含的每一個(gè)字符是否都是數(shù)字,就可以確定輸入的是否是數(shù)字 String str = args0;for(int i=0; i<str.length(); i+) if(str.charAt(i) < '0' | str.charAt(i) > '9&
10、#39;) System.out.println("提供的參數(shù)不是數(shù)字"); return; / 將從鍵盤輸入的數(shù)字字符串轉(zhuǎn)換成一個(gè)整數(shù),并是否是正數(shù)num = Integer.parseInt(args0);if (num <= 0) System.out.println("難道要計(jì)算負(fù)數(shù)的階乘?"); return; / 計(jì)算num的階乘,存放在n變量中for (i=1; i<=num; i+)n = n * i;System.out.println(args0 + "的階乘是:" + n);我們發(fā)現(xiàn),如果是按常規(guī)做法
11、,步驟非常繁瑣。而如果使用try-catch的話就好很多:try num = Integer.parseInt(args0);if (num <= 0)throw new IllegalArgumentException();for (i=1; i<=num; i+)n = n * i;System.out.println(args0 + "的階乘是:" + n); catch(ArrayIndexOutOfBoundsException e1) System.out.println("請(qǐng)?zhí)峁┮粋€(gè)數(shù)字!"); catch(NumberForm
12、atException e2) System.out.println("提供的參數(shù)不是數(shù)字"); catch(IllegalArgumentException e3) System.out.println("難道要計(jì)算負(fù)數(shù)的階乘?");上面的代碼是標(biāo)準(zhǔn)的參考代碼,使用try-catch可以看出代碼的清晰程度(我們將來會(huì)大量使用下面的這種處理問題的方式)。如果try中的任一行代碼在執(zhí)行時(shí)拋出一個(gè)異常的話,接下來的catch就要開始工作了。如果我們要使得一個(gè)普通方法在調(diào)用時(shí)也有能力拋出異常,我們就需要這樣定義我們自己寫的方法:void check(int x
13、) throws IllegalArgumentException if (x < 0) throw new IllegalArgumentException ();這個(gè)方法和普通方法差不多,就是后面跟著一個(gè):throws IllegalArgumentException,表示這個(gè)方法有可能會(huì)拋出一個(gè)IllegalArgumentException這樣的異常,因此在調(diào)用時(shí)就必須通過try-catch進(jìn)行捕捉處理?,F(xiàn)在可以這樣調(diào)用上面的check()方法了:try num = Integer.parseInt(args0);check(num);for (i=1; i<=num; i
14、+)n = n * i;System.out.println(args0 + "的階乘是:" + n); catch(ArrayIndexOutOfBoundsException e1) System.out.println("請(qǐng)?zhí)峁┮粋€(gè)數(shù)字!"); catch(NumberFormatException e2) System.out.println("提供的參數(shù)不是數(shù)字"); catch(IllegalArgumentException e3) System.out.println("難道要計(jì)算負(fù)數(shù)的階乘?");
15、你可以想像一下,系統(tǒng)中的Integer.parseInt()方法就是按照類似我們上面的做法實(shí)現(xiàn)的。 現(xiàn)在有同學(xué)就會(huì)問了,我們?cè)趺粗朗裁磿r(shí)候要拋出什么樣的異常呢?其實(shí),上面我們只是選擇了一個(gè)標(biāo)準(zhǔn)的異常類IllegalArgumentException(非法參數(shù)異常。Illegal是“非法”的意思,Argument是“參數(shù)”的意思,Exception是“異常”的意思)。我們?cè)谡n堂中給大家看了一些從Exception繼承而來的標(biāo)準(zhǔn)異常類,如果這些類可以使用的話,我們就可以直接選擇其中一個(gè)適合我們處理情況的類來使用,就像我們上面做的一樣。否則,就要自定義異常類了(必須從Exception繼承): c
16、lass FushuException extends Exception FushuException() / 構(gòu)造方法 super("負(fù)數(shù)異常"); void check(int x) throws FushuException if (x < 0) throw new FushuException ();或者在try中直接這樣做:if (x<0) throw new FushuException (); 大家要注意,try-catch-finally異常處理只是提供了一種更方便的“處理問題”的方式。其實(shí)你完全可以在執(zhí)行代碼時(shí)用if去做一大堆判斷,如同前面的
17、代碼。這樣做的思路不怎樣清晰,也就是說“執(zhí)行的操作”和“問題處理”全部揉合在一起,不便于我們的觀察分析。因此,大家必須先掌握異常處理的這種手段,以后我們會(huì)不斷地接觸到其它地方是怎樣使用try-catch做異常處理的。通過不斷的接觸、觀察、分析、總結(jié),從而我們就能模仿著寫自己的異常處理了。另外,Integer是一個(gè)獨(dú)立的類,表示“整數(shù)類”的意思,其中包含了一個(gè)int值。但它和int又是有區(qū)別的,int只是單純的一個(gè)整數(shù),沒有其它任何東西;Integer是一個(gè)類(想像一下結(jié)構(gòu)體),里面包含了屬性字段變量和方法/函數(shù)。以下是從JDK文檔中摘錄出來的對(duì)Integer類的描述:public final
18、class Integer extends Number implements ComparableInteger 類在對(duì)象中包裝了一個(gè)基本類型 int 的值。Integer 類型的對(duì)象包含一個(gè) int 類型的字段。 此外,該類提供了多個(gè)方法,能在 int 類型和 String 類型之間互相轉(zhuǎn)換,還提供了處理 int 類型時(shí)非常有用的其他一些常量和方法。三、Java語言學(xué)習(xí)指導(dǎo)和答疑1、Java是由許許多多的“類”構(gòu)成的,這些類有的是抽象類,有的類又實(shí)現(xiàn)了一些接口(遵從了接口中的方法/函數(shù)約定)。但基本上是一個(gè)類就負(fù)責(zé)“一塊事情”。類名字是有規(guī)律的,類名單詞的第一個(gè)字母總是大寫的。 2、我們經(jīng)
19、常接觸的類是必須要知道的。也就是說,類名單詞只能記下來。當(dāng)然,記下來并沒有那么痛苦,我們可以將經(jīng)常接觸到的類名寫在一個(gè)本子上,經(jīng)常翻閱。比如仿照下面的方式: String 字符串類,包含了許多處理字符串的方法 Integer 整數(shù)類,包含了許多處理整數(shù)的方法 至于類里面包含的方法的具體使用,我們完全可以通過JDK文檔查閱到。3、Java中顯得復(fù)雜的內(nèi)容,就是類。我們將來會(huì)不斷地遇到很多的類。初學(xué)者往往會(huì)覺得Java的難就難在類太多,很亂。這在開始是屬于正常現(xiàn)象。隨著我們學(xué)習(xí)的推進(jìn),大家會(huì)慢慢理清這些內(nèi)容的。4、幾乎所有同學(xué)課題上都不做筆記。難怪同學(xué)們?cè)谡n堂上聽起來比較舒服,課后就什么都不懂了!
20、筆記怎么做?碰到難的問題或者老師一再強(qiáng)調(diào)的地方,記錄一下要點(diǎn),以便課后查閱。不是不分重點(diǎn)一股腦兒什么都記錄下來,也不是做課堂錄音。答疑1:為什么在定義類時(shí),習(xí)慣上將屬性字段寫成private的,而將方法寫成public的?class Bear int legs; public void show() System.out.println("本熊有 " + legs + " 條腿") class Test public static void main(String args) Bear b1, b2;b1 = new Bear(); b1.l
21、egs = 4; b1.show(); System.out.println("這只熊確實(shí)有" + b1.legs + "條腿"); b2 = new Bear(); b2.legs = -2; b2.show(); System.out.println("這只熊確實(shí)有" + b2.legs + "條腿"); 我們可以看到上面的b2.legs賦值明顯是不合邏輯的,腿的數(shù)量不可能是負(fù)數(shù)。那么有沒有什么辦法來控制這種情況?我們知道,因?yàn)閘egs字段變量是在類Bear中被管轄的,因此最好讓Bear類來負(fù)責(zé)這件事情。因此改
22、變成現(xiàn)在這樣:class Bear int legs; public void show() System.out.println("本熊有 " + legs + " 條腿") public void setLegs(int legs) if (legs < 0) this.legs = 4; else this.legs = legs; 我們希望編程人員使用setLegs()方法來設(shè)置熊的腿數(shù)量: b1.setLegs(3); b1.show(); System.out.println("這只熊確實(shí)有" + b1.
23、legs + "條腿"); b2.setLegs(-4); b2.show(); System.out.println("這只熊確實(shí)有" + b2.legs + "條腿");現(xiàn)在的情況比前面好多了,至少不會(huì)出現(xiàn)腿的數(shù)量是負(fù)數(shù)的情況。但總有那么一些不安分的編程人員就是要這樣寫(或者會(huì)不小心這樣): b2.legs = -4;也就是說,盡管我們提供了一個(gè)設(shè)置熊腿數(shù)量的方法setLegs(),但仍無法杜絕將熊腿的數(shù)量設(shè)置為負(fù)數(shù)的情況?,F(xiàn)在,我們?cè)趇nt legs前面增加一個(gè)private就可以徹底解決這個(gè)問題:class Bear priv
24、ate int legs; public void show() System.out.println("本熊有 " + legs + " 條腿") public void setLegs(int legs) if (legs < 0) this.legs = 4; else this.legs = legs; 現(xiàn)在: b1.legs = 4; b2.legs = -2;都是不允許做的(不可以在類對(duì)象的外面直接訪問私有的東西),故而要設(shè)置熊的腿數(shù)量,就只能調(diào)用b1.setLegs(4)和b2.setLegs(-2)了,并且執(zhí)行后的結(jié)果就
25、保證了腿數(shù)為正數(shù)。 不過我們又發(fā)現(xiàn)了另一個(gè)不足,就是下面這條語句出現(xiàn)編譯錯(cuò)誤: System.out.println("這只熊確實(shí)有" + b1.legs + "條腿"); System.out.println("這只熊確實(shí)有" + b2.legs + "條腿");原因在于,legs字段變量是Bear類中私有的東西,不能在類對(duì)象以外訪問。既不能在類的對(duì)象之外修改,也不能在類的對(duì)象之外讀取。所以,為了使得外面的代碼仍可以訪問到熊的腿數(shù),我們需要再增加一個(gè)讀取legs值的方法:class Bear private in
26、t legs; public void show() System.out.println("本熊有 " + legs + " 條腿") public void setLegs(int legs) if (legs < 0) this.legs = 4; else this.legs = legs; public int getLegs() return legs; 這樣將上面的測(cè)試代碼再重寫一遍就好了: b1.setLegs(3); b1.show(); System.out.println("這只熊確實(shí)有" +
27、b1.getLegs() + "條腿"); b2.setLegs(-4); b2.show(); System.out.println("這只熊確實(shí)有" + b2. getLegs() + "條腿");所以,以后我們?cè)趯懽约旱念悤r(shí),大多數(shù)情況下都是將屬性字段變量設(shè)置為private的,然后提供一系列set和get方法來修改或讀取那些private屬性字段的值。這種方法命名的特點(diǎn)是,set或get后面跟著變量名字,且變量名字的第一個(gè)字母改為大寫。答疑2:所有類都是繼承自O(shè)bject類的。也就是說,Object類是Java語言中的所有類的
28、鼻祖?。悴粚懙脑挘到y(tǒng)會(huì)自定幫你添上)class A 等價(jià)于 class A extends Object 答疑3:父類的引用變量,可以指向其子類的對(duì)象。class A int x = 1; void print() System.out.println("x=" + x); class B extends A int y = 2; void show() System.out.println("y=" + y); 上面A是B的父類。我們可以生成兩個(gè)對(duì)象看看: A a = new A(); a.print(); B b = new B(); b.print(); b.show();BbAa現(xiàn)在這樣: a = b; / b的輩份比a小,“小”的直接覆值給“大”的是允許的 a.print(); / 調(diào)用的是B類對(duì)象的print()方法,因?yàn)閍指向的是B類對(duì)象bBa上面的這個(gè)a,其實(shí)就相當(dāng)于是一個(gè)指針變量,它指向的實(shí)際對(duì)象是B類對(duì)象。當(dāng)a.print();執(zhí)行時(shí),執(zhí)行的實(shí)質(zhì)上就是B類對(duì)象中的print()方法?,F(xiàn)在有一個(gè)問題,既然a指向的實(shí)際上是一個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校走廊過道管理制度
- 工廠上班手機(jī)管理制度
- 光纜文明施工管理制度
- 公司生活用水管理制度
- 公司門衛(wèi)快遞管理制度
- 基本藥物補(bǔ)助管理制度
- 全員經(jīng)營費(fèi)用管理制度
- 商場(chǎng)門店盤點(diǎn)管理制度
- 工程公司差旅管理制度
- 劇院票務(wù)銷售管理制度
- 2025年中考物理壓軸題分類匯編:?jiǎn)芜x題(功、能與簡(jiǎn)單機(jī)械綜合53題)原卷版+解析
- T/CATCM 032-2024中藥配方顆粒臨床使用指南
- 風(fēng)景園林設(shè)計(jì)報(bào)告
- DB31/T 1367-2022養(yǎng)老機(jī)構(gòu)服務(wù)質(zhì)量監(jiān)測(cè)與評(píng)價(jià)規(guī)范
- 兒童健康管理中心運(yùn)營方案
- 沙場(chǎng)租地合同協(xié)議書模板
- 2025年壓縮機(jī)用平衡塊項(xiàng)目市場(chǎng)調(diào)查研究報(bào)告
- 2024年云南省宜良縣事業(yè)單位公開招聘醫(yī)療衛(wèi)生崗考前沖刺模擬帶答案
- 八年級(jí)英語下學(xué)期期末考試(廣州專用)(原卷版)
- 渣漿泵市場(chǎng)現(xiàn)狀分析及前景預(yù)測(cè)報(bào)告
- 軍事歷史兵器展覽營行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
評(píng)論
0/150
提交評(píng)論