Java語言面向對象知識小結及答疑_第1頁
Java語言面向對象知識小結及答疑_第2頁
Java語言面向對象知識小結及答疑_第3頁
Java語言面向對象知識小結及答疑_第4頁
Java語言面向對象知識小結及答疑_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、面向對象知識小結及答疑一、面向對象基本概念回顧Java的面向對象概念,絕大部分是模擬現(xiàn)實世界中的事物而設計的。繼承:根據(jù)功能和用途,將類按照層次關系進行設計。越在下層的類,功能越多越具體;越在上層的類,其“權力”越大。類一方面使得學習出現(xiàn)了暫時的困難,但也使得代碼的復用變得很有意思。系統(tǒng)提供的標準類,其名字必須要經常查閱翻譯辭典以加深印象。 構造方法:對象在新生成的時候必須要執(zhí)行的方法,名字應該和類名字完全一致。 class A int x; A() x = 2; A(int x) this.x = x; void print() System.out.println(“x=” + x); 默

2、認情況下,A()構造方法默認是會自動生成的,當然里面一點代碼都沒有(也就是說,你不寫的話,系統(tǒng)會幫你寫上一個空架子的構造方法)。構造方法前面必須是沒有“返回類型”的。另外,類中的任何除構造方法之外的其它方法必須要“返回類型”的。方法重載:在類中存在兩個同名的方法,但方法的參數(shù)類型不相同。 void print(int x) void print(int a) 注意,上面寫的這兩個方法不能叫重載的(參數(shù)個數(shù)、類型完全相同)方法重寫/覆蓋:在子類和父中存在兩個同名、同參數(shù)的方法。訪問修飾符:private,protected,public,(默認) static,final對類中的一個static

3、方法來說,它可以直接通過類名進行調用,而不需要生成對象。final放在一個變量前面,表示這是一個常量,只能有一個值。final放在一個方法前面,表示這是一個不能被覆蓋的方法。final放在一個類前面,表示這是一個最終類,它不能被別的類繼承。抽象類:就是在class之前加了一個abstract的類,這樣的類就不能用來生成對象了。因此,通常如果一個類不適合生成對象的話,我們就要把這個類定義成抽象的?;蛘?,如果一個類中包含了沒有方法體的方法(也就是抽象方法),這樣的類也必須定義成抽象類。其它類繼承了抽象類的話,就必須補全這個抽象類中的所有抽象方法的具體代碼。abstract class A int

4、x; abstract void print();接口:在其中只定義抽象方法。接口的目的,是為了強制某些類中必須具有同樣的方法。因此,只要類實現(xiàn)了接口,這些類就必須提供接口中方法的具體代碼。因此這些類看起來就有了一些共性了(都包含了接口中規(guī)定的方法)。這是接口的一個強制規(guī)定。此外,接口中的抽象方法必須是public的,如果不寫上的話,系統(tǒng)會自定幫我們加上。習慣上我們還是自己寫上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因為實現(xiàn)了接口C,它們就必須提供接口C中規(guī)定的方法/函數(shù),否則編譯就報錯了。這就是接口的一大特點。接口可以這樣使用:C c = new A();c.print(); / 其實是調用A類的對象中的print()方法c = new B();c.print(); / 其實是調用B類的對象中的print()方法可見,接口變量能夠指向任何實現(xiàn)了該接口的類的對象,但只能調用對象中的那些“由接口規(guī)定的”方法。對接口變量c來講,無論它指向的是

6、A類對象還是B類對象,接口變量c只知道對象中有print()方法(也就是接口C中規(guī)定的方法),對象中的其它內容,接口變量c則一無所知。如同一個USB接口,可以插上任何實現(xiàn)了USB接口的實際設備,如插上優(yōu)盤、移動硬盤等等。但是若移動硬盤還有MP3播放功能的話,我們的USB接口也不會知道。USB接口仍會把這種帶有MP3播放功能的移動硬盤當作普通的移動硬盤來對待。 那么在Java中又為什么需要接口呢?我們再看上面的這兩個類,改寫一下(去掉了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,里面的內容和前面一模一樣。唯一的不同是,類A、B里面的方法名字可以隨便更改了(不會受任何約束):class A int x; public void print222() System.out.println(“x=” + x); class B public void show() System.out.println(“-”); 我們看到,現(xiàn)在的A、B類里面已經亂七八糟了,甚至B類中連print()方法都沒有了。但這兩個類在編

8、譯時沒有任何問題,它們只是沒有遵守統(tǒng)一的接口約定而已。為了更好地理解面向對象這些概念,請同學們務必仔細琢磨明白提供的那幾個程序文件:子類構造方法Abc.java抽象類Abc.java接口Abc.java方法修飾符Abc.java方法重寫Abc.java方法重載Abc.java繼承Abc.java訪問修飾符Abc.java二、異常異常的設計,主要是提供一種集中處理問題的機制。大家體會一下下面的兩個例子。這個例子是教材上的一個上機練習(教材第329頁的練習1),其目的是計算一個從鍵盤輸入數(shù)的階乘(args0就是一個從鍵盤上輸入的數(shù)字字符串)。常規(guī)的做法是這樣的: / 判斷是否在命令行中輸入了字符串

9、。args是一個數(shù)組變量/ 如果數(shù)組大小少于1的話,說明使用者沒有輸入要計算階乘的那個數(shù) if (args.length < 1) System.out.println("請?zhí)峁┮粋€數(shù)字!"); return; / 判斷輸入的字符串是否全部是數(shù)字。我們只要判斷字符串args0中/ 包含的每一個字符是否都是數(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ù)字字符串轉換成一個整數(shù),并是否是正數(shù)num = Integer.parseInt(args0);if (num <= 0) System.out.println("難道要計算負數(shù)的階乘?"); return; / 計算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("請?zhí)峁┮粋€數(shù)字!"); catch(NumberForm

12、atException e2) System.out.println("提供的參數(shù)不是數(shù)字"); catch(IllegalArgumentException e3) System.out.println("難道要計算負數(shù)的階乘?");上面的代碼是標準的參考代碼,使用try-catch可以看出代碼的清晰程度(我們將來會大量使用下面的這種處理問題的方式)。如果try中的任一行代碼在執(zhí)行時拋出一個異常的話,接下來的catch就要開始工作了。如果我們要使得一個普通方法在調用時也有能力拋出異常,我們就需要這樣定義我們自己寫的方法:void check(int x

13、) throws IllegalArgumentException if (x < 0) throw new IllegalArgumentException ();這個方法和普通方法差不多,就是后面跟著一個:throws IllegalArgumentException,表示這個方法有可能會拋出一個IllegalArgumentException這樣的異常,因此在調用時就必須通過try-catch進行捕捉處理?,F(xiàn)在可以這樣調用上面的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("請?zhí)峁┮粋€數(shù)字!"); catch(NumberFormatException e2) System.out.println("提供的參數(shù)不是數(shù)字"); catch(IllegalArgumentException e3) System.out.println("難道要計算負數(shù)的階乘?");

15、你可以想像一下,系統(tǒng)中的Integer.parseInt()方法就是按照類似我們上面的做法實現(xiàn)的。 現(xiàn)在有同學就會問了,我們怎么知道什么時候要拋出什么樣的異常呢?其實,上面我們只是選擇了一個標準的異常類IllegalArgumentException(非法參數(shù)異常。Illegal是“非法”的意思,Argument是“參數(shù)”的意思,Exception是“異?!钡囊馑迹?。我們在課堂中給大家看了一些從Exception繼承而來的標準異常類,如果這些類可以使用的話,我們就可以直接選擇其中一個適合我們處理情況的類來使用,就像我們上面做的一樣。否則,就要自定義異常類了(必須從Exception繼承): c

16、lass FushuException extends Exception FushuException() / 構造方法 super("負數(shù)異常"); void check(int x) throws FushuException if (x < 0) throw new FushuException ();或者在try中直接這樣做:if (x<0) throw new FushuException (); 大家要注意,try-catch-finally異常處理只是提供了一種更方便的“處理問題”的方式。其實你完全可以在執(zhí)行代碼時用if去做一大堆判斷,如同前面的

17、代碼。這樣做的思路不怎樣清晰,也就是說“執(zhí)行的操作”和“問題處理”全部揉合在一起,不便于我們的觀察分析。因此,大家必須先掌握異常處理的這種手段,以后我們會不斷地接觸到其它地方是怎樣使用try-catch做異常處理的。通過不斷的接觸、觀察、分析、總結,從而我們就能模仿著寫自己的異常處理了。另外,Integer是一個獨立的類,表示“整數(shù)類”的意思,其中包含了一個int值。但它和int又是有區(qū)別的,int只是單純的一個整數(shù),沒有其它任何東西;Integer是一個類(想像一下結構體),里面包含了屬性字段變量和方法/函數(shù)。以下是從JDK文檔中摘錄出來的對Integer類的描述:public final

18、class Integer extends Number implements ComparableInteger 類在對象中包裝了一個基本類型 int 的值。Integer 類型的對象包含一個 int 類型的字段。 此外,該類提供了多個方法,能在 int 類型和 String 類型之間互相轉換,還提供了處理 int 類型時非常有用的其他一些常量和方法。三、Java語言學習指導和答疑1、Java是由許許多多的“類”構成的,這些類有的是抽象類,有的類又實現(xiàn)了一些接口(遵從了接口中的方法/函數(shù)約定)。但基本上是一個類就負責“一塊事情”。類名字是有規(guī)律的,類名單詞的第一個字母總是大寫的。 2、我們經

19、常接觸的類是必須要知道的。也就是說,類名單詞只能記下來。當然,記下來并沒有那么痛苦,我們可以將經常接觸到的類名寫在一個本子上,經常翻閱。比如仿照下面的方式: String 字符串類,包含了許多處理字符串的方法 Integer 整數(shù)類,包含了許多處理整數(shù)的方法 至于類里面包含的方法的具體使用,我們完全可以通過JDK文檔查閱到。3、Java中顯得復雜的內容,就是類。我們將來會不斷地遇到很多的類。初學者往往會覺得Java的難就難在類太多,很亂。這在開始是屬于正常現(xiàn)象。隨著我們學習的推進,大家會慢慢理清這些內容的。4、幾乎所有同學課題上都不做筆記。難怪同學們在課堂上聽起來比較舒服,課后就什么都不懂了!

20、筆記怎么做?碰到難的問題或者老師一再強調的地方,記錄一下要點,以便課后查閱。不是不分重點一股腦兒什么都記錄下來,也不是做課堂錄音。答疑1:為什么在定義類時,習慣上將屬性字段寫成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("這只熊確實有" + b1.legs + "條腿"); b2 = new Bear(); b2.legs = -2; b2.show(); System.out.println("這只熊確實有" + b2.legs + "條腿"); 我們可以看到上面的b2.legs賦值明顯是不合邏輯的,腿的數(shù)量不可能是負數(shù)。那么有沒有什么辦法來控制這種情況?我們知道,因為legs字段變量是在類Bear中被管轄的,因此最好讓Bear類來負責這件事情。因此改

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ù)量: b1.setLegs(3); b1.show(); System.out.println("這只熊確實有" + b1.

23、legs + "條腿"); b2.setLegs(-4); b2.show(); System.out.println("這只熊確實有" + b2.legs + "條腿");現(xiàn)在的情況比前面好多了,至少不會出現(xiàn)腿的數(shù)量是負數(shù)的情況。但總有那么一些不安分的編程人員就是要這樣寫(或者會不小心這樣): b2.legs = -4;也就是說,盡管我們提供了一個設置熊腿數(shù)量的方法setLegs(),但仍無法杜絕將熊腿的數(shù)量設置為負數(shù)的情況。現(xiàn)在,我們在int legs前面增加一個private就可以徹底解決這個問題: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;都是不允許做的(不可以在類對象的外面直接訪問私有的東西),故而要設置熊的腿數(shù)量,就只能調用b1.setLegs(4)和b2.setLegs(-2)了,并且執(zhí)行后的結果就

25、保證了腿數(shù)為正數(shù)。 不過我們又發(fā)現(xiàn)了另一個不足,就是下面這條語句出現(xiàn)編譯錯誤: System.out.println("這只熊確實有" + b1.legs + "條腿"); System.out.println("這只熊確實有" + b2.legs + "條腿");原因在于,legs字段變量是Bear類中私有的東西,不能在類對象以外訪問。既不能在類的對象之外修改,也不能在類的對象之外讀取。所以,為了使得外面的代碼仍可以訪問到熊的腿數(shù),我們需要再增加一個讀取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; 這樣將上面的測試代碼再重寫一遍就好了: b1.setLegs(3); b1.show(); System.out.println("這只熊確實有" +

27、b1.getLegs() + "條腿"); b2.setLegs(-4); b2.show(); System.out.println("這只熊確實有" + b2. getLegs() + "條腿");所以,以后我們在寫自己的類時,大多數(shù)情況下都是將屬性字段變量設置為private的,然后提供一系列set和get方法來修改或讀取那些private屬性字段的值。這種方法命名的特點是,set或get后面跟著變量名字,且變量名字的第一個字母改為大寫。答疑2:所有類都是繼承自Object類的。也就是說,Object類是Java語言中的所有類的

28、鼻祖?。悴粚懙脑挘到y(tǒng)會自定幫你添上)class A 等價于 class A extends Object 答疑3:父類的引用變量,可以指向其子類的對象。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的父類。我們可以生成兩個對象看看: A a = new A(); a.print(); B b = new B(); b.print(); b.show();BbAa現(xiàn)在這樣: a = b; / b的輩份比a小,“小”的直接覆值給“大”的是允許的 a.print(); / 調用的是B類對象的print()方法,因為a指向的是B類對象bBa上面的這個a,其實就相當于是一個指針變量,它指向的實際對象是B類對象。當a.print();執(zhí)行時,執(zhí)行的實質上就是B類對象中的print()方法?,F(xiàn)在有一個問

溫馨提示

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

評論

0/150

提交評論