




已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
阜陽師范學院計算機與信息學院,Java程序設計,主講教師:曹紅兵,236,目 錄,任務一 搭建環(huán)境(構建Java集成開發(fā)環(huán)境),任務二 Java歡迎你(開發(fā)簡單Java應用程序,任務三 小試牛刀(學習Java語言基礎),任務四 挑戰(zhàn)選擇(使用分支控制流程),任務五 游戲人生(使用循環(huán)控制流程),任務六 回歸自然(創(chuàng)建、使用類和對象),任務七 3G時代的消息傳遞(定義和使用類方法),任務八 保護你的隱私(封裝的使用),任務九 子承父業(yè)(繼承和多態(tài)的使用),任務十 上帝萬能之手(接口的使用),336,任務十一 用數組存儲信息(使用數組),任務十二 使用字符串進行交流(使用字符串),任務十三 防患于未然(捕獲并處理異常),任務十四 主動出擊(拋出異常),任務十五 認識Java Applet(Applet入門),任務十六 豐富多彩的Applet(在Applet中播放聲音和顯示圖像),任務十七 進入Windows世界(設計圖形用戶界面),任務十八 布局規(guī)劃(使用布局管理器),任務十九 事件委托處理(如何處理事件),任務二十 選擇之道(使用選擇控件和選擇事件),目 錄,436,任務二十一 簡明清晰的菜單(使用菜單和其他常用事件),任務二十二 訪問數據(使用JDBC連接數據庫),任務二十三 訪問數據升級(數據庫編程),任務二十四 文件管理(目錄與文件管理),任務二十五 順序進出之道(文件的順序訪問),任務二十六 隨機進出之道(文件的隨機訪問),任務二十七 JAVA的分身術(創(chuàng)建和啟動線程),任務二十八 線程的生命周期與優(yōu)先級(線程的狀態(tài)與調度),任務二十九 基于連接的通信(Java中的套接字Socket),任務三十 基于無連接的通信(Java中的數據報編程),目 錄,536,任務九 子承父業(yè)(繼承和多態(tài)的使用),2,1,知識目標,能力目標,繼承的概念;繼承關鍵字;父類與子類之間的關系,super關鍵字。多態(tài)的概念;靜態(tài)多態(tài),動態(tài)多態(tài);多態(tài)的實現。最終類和抽象類。,掌握繼承的實現;掌握super關鍵字;掌握多態(tài)的實現。,636,內容提要,4,跟我做:汽車的分類關系,1,2,3,5,實現方案,代碼分析,必備知識,動手做一做,736,9.1 跟我做:汽車的分類關系,任務情景 汽車是一般的交通工具,具有車類型、品牌、引擎數量、外觀顏色等屬性,能夠發(fā)動、加速、剎車、停車等功能。汽車又可分為公共汽車、出租車、卡車等。公共汽車具有自己的第幾路編號、最大載客數量屬性,能夠報站。出租車具有所屬公司、最大載客數量屬性,能夠給乘客打發(fā)票。卡車具有最大載重量屬性,能夠卸貨。請編寫Vehicle汽車類、Bus公共汽車類。Taxi類和Truck類待學完本任務后自行完成。 運行結果,第1章目錄,836,問題分析 回憶任務六中定義類的三個步驟,先定義類名,再編寫類的屬性,最后編寫類的方法。本任務采用這三個步驟,編寫好代碼后,我們很快就會發(fā)現,Vehicle汽車類和Bus公共汽車類出現了許多相同的語句代碼。在屬性方面,都包含了車類型、品牌、引擎數量、外觀顏色重復的信息定義,在功能上都有發(fā)動、加速、剎車、停車等重復的行為定義。汽車、公共汽車的成員變量和成員方法對照請見圖9-2。 現在,我們換個思路考慮。汽車是一般性的概念,它包含的成員變量和成員方法,在公共汽車、出租車、卡車中也具有,因為公共汽車是一種汽車,出租車、卡車也是一種汽車,只不過公共汽車、出租車、卡車是一種更具體的汽車,除了汽車的公共特性外,還有自己的特有性質。 經過分析,采取如下措施,在定義類時,將公共汽車類、出租車類、卡車類中相同的屬性和方法抽象出來,集中放在汽車類中,形成一種共享的機制,公共汽車類、出租車類、卡車類中只放自己特有的成員變量和成員方法,減少重復代碼。這樣的汽車類稱為父類,公共汽車類、出租車類、卡車類稱為子類。子類繼承父類的非私有成員變量和成員方法。,第1章目錄,9.2 實現方案,936,解決步驟 1.打開Eclipse,在study項目中創(chuàng)建包com.task09,再確定類名Vehicle,得到類的框架。 package com.task09; public class Vehicle 2.然后,進行類的屬性描述,只輸入抽象出來的共有的成員變量 String type; String brand; int engineNum; String color; 3.接著,定義類的構造方法: public Vehicle() public Vehicle(String type,String brand, int engineNum, String color) 4.再定義抽象出來的共有的方法: /發(fā)動、加速、剎車、停車 public void start() public void accelerate() public void brake() public void stop(),9.2 實現方案,1036,5.定義Bus類。Bus類作為更具體的子類,只定義自己特有的性質。父類Vehicle類已有的成員變量和成員方法不再定義。 public class Bus extends Vehicle /加上extends關鍵字和父類名Vehicle /公共汽車具有自己的最大載客數量、第幾路編號屬性 int maxLoad; /特有的成員變量 String busNo; /* * 構造方法 */ public Bus() public Bus(int maxLoad,String busNo) /報站 public void announceBusStop() /特有的成員方法 6.定義VehicleTest測試類,運行程序。對Vehicle類、Bus類的繼承關系進行測試,Bus類能否訪問父類的成員變量,能否調用父類的成員方法。 Bus bus=new Bus(“子類公共汽車“,“女神“, 2, “白色“,50,“9路“); bus.start(); /調用父類的成員方法 bus.announceBusStop(); /公共汽車報站,9.2 實現方案,1136,程序代碼,第1章目錄,9.3 代碼分析,1236,9.3 代碼分析,應用擴展 Bus類繼承了Vehicle類后,在發(fā)動、加速、剎車、停車功能上加上自己的特性,就要重寫這四個方法。重寫形成了多態(tài)。Bus類升級新增方法如下: /發(fā)動、加速、剎車、停車 public void start() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車發(fā)動“); public void accelerate() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車加速“); public void brake() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車剎車“); public void stop() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車停車“); ,第1章目錄,1336,9.4 必備知識,9.4.1 類的繼承 1. 繼承的概念 由一個已有類定義一個新類,稱為新類繼承了已有類。已有類稱為父類,新類稱為子類。例如,汽車類是父類,公共汽車類、出租車類、卡車類是子類。通過子類繼承父類,子類具有父類的一般特性,包括非私有的屬性和行為。子類還可以增加自身特性,定義新的屬性和行為,甚至可以重新定義父類中的屬性和方法,擴展類的功能。 例如,汽車類具有車類型、品牌、引擎數量、外觀顏色,能夠發(fā)動、加速、剎車、停車等一般特性。作為子類的公共汽車類、出租車類、卡車類繼承了父類的這些特性,另外,新增了自己的特性,公共汽車具有自己的第幾路編號、最大載客數量屬性,能夠報站。出租車具有所屬公司、最大載客數量屬性,能夠給乘客打發(fā)票??ㄜ嚲哂凶畲筝d重量屬性,能夠卸貨。公共汽車類還重新定義了父類的發(fā)動、汽車公共汽車出租車卡車 加速、剎車、停車功能。,第1章目錄,圖9-2 汽車又可分為公共汽車、出租車、卡車,1436,怎樣判斷類與類之間具有繼承關系呢?汽車具有一般特性,公共汽車、出租車、卡車是一種汽車,具有更具體的特性,符合is-a關系。根據這種原則,確定汽車是父類,公共汽車、出租車、卡車是子類。父類更通用、子類更具體。 再看一看人、消費者和經銷商關系。人具有姓名、年齡屬性,能夠說話。消費者、經銷商是一種人,具有姓名、年齡屬性,能夠說話。消費者還能夠購物、付費,經銷商能夠進貨、收費,具有更具體的特性。符合is-a關系。所以,人是父類,消費者和經銷商是子類。,第1章目錄,9.4 必備知識,1536,2. 繼承的意義 在定義汽車類、公共汽車類、出租車類、卡車類時,通過分析了解到,汽車類和其他車類之間的重復代碼太多,具有許多相同的成員變量和成員方法,既增加了程序員的工作量,降低編程效率,也違背了Java語言的“write once, only once”的原則。 如果把所有子類中相同的代碼都抽取到父類中,建立繼承關系,讓子類自動繼承父類的屬性和方法,那么子類中就省去重復代碼。 例如,在汽車類、公共汽車類、出租車類、卡車類建立了繼承關系后,公共汽車類、出租車類、卡車類中相同的代碼,包括成員變量定義和方法的定義,抽取到汽車類中,子類中不再進行重復定義,程序的有效實現代碼得到復用。因此,使用繼承提高代碼的復用性。,9.4 必備知識,1636,3. 繼承的實現 繼承的實現分兩個步驟: 定義父類 父類可以是系統(tǒng)類,也可以是自定義類。如果是系統(tǒng)類,該步驟可以省略。 在父類中只定義一些通用的屬性與方法,例如:Vehicle汽車類只定義了車類型、品牌、引擎數量、外觀顏色屬性,以及發(fā)動、加速、剎車、停車行為。 String type; /車類型、品牌、引擎數量、外觀顏色屬性 String brand; int engineNum; String color; public void start() /發(fā)動、加速、剎車、停車行為 public void accelerate() public void brake() public void stop(),9.4 必備知識,1736,定義子類 子類定義格式: 類修飾符 class 子類名 extends 父類名 extends關鍵字表示一個類繼承了另一個類。例如,Bus公共汽車類繼承Vehicle汽車類。 public class Bus extends Vehicle /父類名只能有一個 然后,定義子類特有的成員變量和成員方法。例如,Bus公共汽車類作為子類,新增了自己的特性。 int maxLoad; /子類特有的屬性 String busNo; public void announceBusStop() /報站,子類特有的方法 System.out.println(busNo+“公共汽車報站“); 注意:一個子類只能繼承一個父類,即單繼承。但一個父類可以有多個子類。,9.4 必備知識,1836,改錯: 下面繼承定義有哪些錯誤? /* *人(Person)具有姓名(name)、年齡屬性(age),能夠說話(talk)。 *消費者(Customer)具有姓名(name)、年齡屬性(age),能夠說話(talk),還能夠購物( shop)。 */ public class Person String name; int age; public void talk() System.out.println(name +“說話“ ); public class person extends Customer, Shop String name; public void talk() System.out.println(name +“說話“ ); private void shop () System.out.println(name +“購物“); 提示:有5個錯誤。,9.4 必備知識,1936,4. 子類與父類的關系 定義子類之后,父類與子類之間就產生了一些特殊的關系,在代碼編寫上會受到影響,程序員必須清楚。 子類自動繼承父類的屬性和方法,但不能繼承訪問權限為private的成員變量和成員方法。例如: 父類Vehicle中有一私有成員變量和一私有成員方法: private String color; /父類中私有成員變量 private void start() /父類中私有成員方法 子類Bus中,按如下方式對父類成員變量和成員方法進行訪問,將會出錯。 color=“銀灰色“; /子類中訪問父類中私有成員變量,出錯 start(); /子類中調用父類中私有成員方法,出錯 當我們將父類Vehicle中private改為缺省時,子類Bus中訪問順利完成。 String color; /父類中private改為缺省 void start() /父類中private改為缺省 子類中可以定義特定的屬性和方法。例如,在子類Bus中,增加售票員(conductor)屬性,和開門open()方法: String conductor; void open() ,9.4 必備知識,2036,子類中方法重寫。所謂方法重寫就是子類定義的方法和父類的方法具有相同的名稱、參數列表、返回類型和訪問修飾符。例如,父類Vehicle中有如下方法: public void accelerate() System.out.println(type+brand+engineNum+“引擎“+color+“汽車加速“); 在子類Bus中,新增自己的加速accelerate()方法,這就是方法重寫。 public void accelerate() /方法重寫 super.accelerate(); System.out.println(“這是子類Bus中的重寫方法“); 方法重寫會隱藏父類的同名方法。也就是說,在子類Bus中,如果調用accelerate()方法,將不再是調用父類的accelerate()方法,而是子類Bus中的方法。 子類的屬性與父類的屬性相同時,也會出現隱藏的現象。,9.4 必備知識,2136,super關鍵字與this關鍵字 出現隱藏現象后,如果需要使用父類的成員屬性和成員方法,可以通過使用super關鍵字。例如,在子類Bus中,調用父類的accelerate()方法: super.accelerate(); /super指當前對象的父對象 如果用this關鍵字,則表示調用當前對象的accelerate()方法: this.accelerate(); /this指當前對象 通過使用super關鍵字與this關鍵字,可以很顯式地區(qū)分開調用的是當前對象的成員,還是父對象的成員。 另外,當方法體中定義的變量,或方法的形式參數與對象的成員變量名相同,也必須用this關鍵字指明當前對象的成員變量。,9.4 必備知識,2236,子類的構造方法 子類不能繼承父類的構造方法,因為父類的構造方法用來創(chuàng)建父類對象,子類需定義自己的構造方法,創(chuàng)建子類對象。 子類的構造方法中,通過super關鍵字調用父類的構造方法。例如,在子類Bus的構造方法中,用如下語句實現了對父類構造方法的調用: super(); /調用父類的無參構造方法 super(type,brand, engineNum, color); /調用父類的帶參構造方法 注意:super(參數);必須是子類構造方法的第一條語句。如果該語句省略,則會自動調用父類無參構造方法。因為子類創(chuàng)建對象時,先創(chuàng)建父類對象,再創(chuàng)建子類對象。 如果需要調用當前類中的構造方法,用this關鍵字。例如,在子類Bus的構造方法中,用如下語句實現了對當前類中的構造方法的調用: this(40,“8路”); /調用當前類中的帶參構造方法,9.4 必備知識,2336,5. 根類Object 在Java 中,所有的類都是通過直接或間接地繼承java.lang.Object類得到的,Object類是一切類的祖先,稱為根類。 當定義類,而沒有使用extends關鍵字時,表示所定義類的父類為Object類,這是Java中的一種特別約定。根類Object類的方法如clone()、equals(obj)、finalize()、getClass()、hashCode()、notify()、notifyAll()、toString()、wait()等,子類都可以通過繼承,進行調用。 關于toString()方法,在任務六的類的定義中,通過重寫,已經多次使用了該方法。,9.4 必備知識,2436,9.4.2 類的多態(tài) 1. 多態(tài)的概念 多態(tài)是指一個方法聲明的多種實現狀態(tài),即在程序中同名的不同方法共存,調用者只需要使用同一個方法名,系統(tǒng)會根據不同情況,調用相應的方法,從而實現不同的功能。簡而言之,多態(tài)性即“一個名字,多個方法”。例如,父類Vehicle中有如下方法: public void accelerate() 在子類Bus中,也有accelerate()方法: public void accelerate() /方法重寫 在程序中同名的不同方法共存,形成了多態(tài)。 2. 多態(tài)的意義 在面向對象程序設計中,多態(tài)是具有表現多種形態(tài)的能力的特征,有時需要利用方法的重名,提高程序的抽象度和簡潔性,以及程序的可擴展性及可維護性。例如使用多態(tài)之后,當需要增加新的子類PoliceCar警車類時,無需更改父類Vehicle,代碼得到了擴展,維護起來也方便。,9.4 必備知識,2536,3.多態(tài)的分類 多態(tài)分為靜態(tài)多態(tài)和動態(tài)多態(tài)。靜態(tài)多態(tài)指通過同一個類中的方法重載實現的多態(tài),動態(tài)多態(tài)指通過類與類之間的方法重寫實現的多態(tài)。方法重載參見8.4.4。方法重寫參見本任務9.4.1 類的繼承4.子類與父類的關系 子類中方法重寫部分。 靜態(tài)多態(tài)是編譯時多態(tài),指程序會根據參數的不同來調用相應的方法,具體調用哪個被重載的方法,由編譯器在編譯階段靜態(tài)決定。 動態(tài)多態(tài)是運行時多態(tài),指在運行時根據調用該方法的實例的類型來決定調用哪個重寫方法。 靜態(tài)多態(tài)對程序運行更有效率,動態(tài)多態(tài)更具有靈活性。 4.多態(tài)的實現 多態(tài)通過給同一個方法定義幾個版本來實現的。例如,現有三個類,Grandfather類是Father類的父類,Father類是Child類的父類。三個類的代碼如下:,9.4 必備知識,2636,package com.task09; /* * Grandfather.java * 多態(tài),本類作為Father的父類 */ public class Grandfather int i; int j; /* * param i * param j */ public Grandfather(int i, int j) this.i = i; this.j = j; int smoke() System.out.println(“Grandfather的方法smoke():“); return i+j; ,9.4 必備知識,2736,package com.task09; /* * Father.java * 多態(tài),本類作為Grandfather的子類,本類作為Child的父類 */ public class Father extends Grandfather /* * param i * param j */ public Father(int i, int j) super(i, j); int drink() System.out.println(“Father的方法drink():“); return 0; ,9.4 必備知識,2836,package com.task09; /* * Child.java * 多態(tài),本類作為Father的子類 */ public class Child extends Father /* * param i * param j */ public Child(int i, int j) /子類的構造方法 super(i, j); /調用父類的構造方法 int drink() /重寫了父類的方法 System.out.println(“Child重寫的方法drink():“); return i*j; package com.task09; public class GrandfatherTest /* * param args */ public static void main(String args) /創(chuàng)建子類的對象,賦給父類對象變量father Father father=new Child(3,4); /調用子類Child重寫的drink()方法 System.out.println(father.getClass()+“喝水杯數“+father.drink(); /調用父類Grandfather的smoke()方法(子類未重寫) System.out.println(father.getClass()+“抽煙支數“+father.smoke(); ,9.4 必備知識,2936,多態(tài)程序運行結果見圖9-3。 在GrandfatherTest測試類中,首先聲明Father類型的變量father,然后建立Father類的子類Child類的一個實例,并把引用存儲到father中。Java運行時,系統(tǒng)分析該引用是Child類型的一個實例,因此調用子類Child重寫的drink()方法。因為方法smoke()未被子類Child重寫,所以運行時系統(tǒng)調用繼承的父類Father的父類Grandfather的smoke()方法。 注意:因為子類通過繼承具備了父類的所有屬性(私有屬性除外),所以,凡是要求使用父類對象的地方,都可以用子類對象來代替。 對子類的一個實例,運行時系統(tǒng)到底調用哪一個方法呢?如果子類重寫了父類的方法,則調用子類的方法;如果子類未重寫父類的方法,則調用父類的方法。因此,父類對象可以通過引用子類的實例調用子類的方法。,9.4 必備知識,3036,改錯: 下面關于多態(tài)定義有哪些錯誤? 父類Grandfather中有如下方法: int smoke() System.out.println(“Grandfather的方法smoke():“); return i+j; 子類Father中定義了方法: int smoke(int i) System.out.println(“Father的方法smoke():“); return i+j; 提示:有1個錯誤。,9.4 必備知識,3136,9.4.3 最終類和抽象類 1.最終類 當一個類的定義使用了final關鍵字時,該類稱為最終類。最終類不能有子類,也就是不能被繼承。一般,用來完成某種標準功能的類,例如,系統(tǒng)類String、Byte和Double,或定義已經很完美,不需要生成子類的類,通常定義為最終類。 最終類的聲明格式: final class 類名 2.抽象類 當一個類的定義使用了abstract 關鍵字時,該類稱為抽象類。抽象類是供子類繼承卻不能創(chuàng)建實例的類。抽象類中可以聲明只有方法頭沒有方法體的抽象方法,方法體由子類實現。抽象類提供了方法聲明與方法實現分離的機制,使各子類表現出共同的行為模式。抽象方法在不同的子類中表現出多態(tài)性。 抽象類的聲明格式: public abstract class 類名 ,9.4 必備知識,3236,在面向對象程序設計時,抽象類一般用于現實世界抽象的概念,例如,食物,水果、交通工具等,我們看不到他們的實例,只能看到他們子類,例如米飯、蘋果、飛機等子類的實例。 Java中的java.lang.Number類是抽象類,沒有實例,它是integer和float具體數字類型的抽象父類。 例如,有計算機類Computer和筆記本電腦類Notebook兩個類。Computer為抽象類,Notebook為其
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國抗菌沐浴露行業(yè)市場全景分析及前景機遇研判報告
- 2025年中國建盞行業(yè)市場全景分析及前景機遇研判報告
- 2025-2030年中國型材行業(yè)市場全景調研及投資價值評估咨詢報告
- 建筑節(jié)能報告用指標的確定
- 稅務師老師講解課件
- 2025年中國智能防火墻行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2022-2027年中國帶魚捕撈行業(yè)市場調查研究及投資戰(zhàn)略研究報告
- 2025年 重慶四聯特種裝備材料有限公司招聘考試筆試試題附答案
- 中國機動車綜合測試儀行業(yè)市場調研及投資戰(zhàn)略研究報告
- 2025年 內蒙古呼和浩特中航集團信息管理部招聘考試筆試試題附答案
- GB/T 18314-2001全球定位系統(tǒng)(GPS)測量規(guī)范
- 工貿行業(yè)重點可燃性粉塵目錄(2022版)
- 近代史期末復習試題
- 教學設計 完整版:Summer holiday plans
- 2022年武漢市法院書記員招聘考試題庫及答案解析
- 湖南省邵陽市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 齊齊哈爾大學教師教育實踐中心申報材料匯總
- 中考物理總復習課教案(第一輪)
- 工廠開工試車方案
- 變電站土石方工程施工方案(42頁)
- 英語專業(yè)四級寫作評分標準
評論
0/150
提交評論