任務九子承父業(yè)(繼承和多態(tài)的使用).ppt_第1頁
任務九子承父業(yè)(繼承和多態(tài)的使用).ppt_第2頁
任務九子承父業(yè)(繼承和多態(tài)的使用).ppt_第3頁
任務九子承父業(yè)(繼承和多態(tài)的使用).ppt_第4頁
任務九子承父業(yè)(繼承和多態(tài)的使用).ppt_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

阜陽師范學院計算機與信息學院,Java程序設計,主講教師:曹紅兵,236,目 錄,任務一 搭建環(huán)境(構(gòu)建Java集成開發(fā)環(huán)境),任務二 Java歡迎你(開發(fā)簡單Java應用程序,任務三 小試牛刀(學習Java語言基礎),任務四 挑戰(zhàn)選擇(使用分支控制流程),任務五 游戲人生(使用循環(huán)控制流程),任務六 回歸自然(創(chuàng)建、使用類和對象),任務七 3G時代的消息傳遞(定義和使用類方法),任務八 保護你的隱私(封裝的使用),任務九 子承父業(yè)(繼承和多態(tài)的使用),任務十 上帝萬能之手(接口的使用),336,任務十一 用數(shù)組存儲信息(使用數(shù)組),任務十二 使用字符串進行交流(使用字符串),任務十三 防患于未然(捕獲并處理異常),任務十四 主動出擊(拋出異常),任務十五 認識Java Applet(Applet入門),任務十六 豐富多彩的Applet(在Applet中播放聲音和顯示圖像),任務十七 進入Windows世界(設計圖形用戶界面),任務十八 布局規(guī)劃(使用布局管理器),任務十九 事件委托處理(如何處理事件),任務二十 選擇之道(使用選擇控件和選擇事件),目 錄,436,任務二十一 簡明清晰的菜單(使用菜單和其他常用事件),任務二十二 訪問數(shù)據(jù)(使用JDBC連接數(shù)據(jù)庫),任務二十三 訪問數(shù)據(jù)升級(數(shù)據(jù)庫編程),任務二十四 文件管理(目錄與文件管理),任務二十五 順序進出之道(文件的順序訪問),任務二十六 隨機進出之道(文件的隨機訪問),任務二十七 JAVA的分身術(shù)(創(chuàng)建和啟動線程),任務二十八 線程的生命周期與優(yōu)先級(線程的狀態(tài)與調(diào)度),任務二十九 基于連接的通信(Java中的套接字Socket),任務三十 基于無連接的通信(Java中的數(shù)據(jù)報編程),目 錄,536,任務九 子承父業(yè)(繼承和多態(tài)的使用),2,1,知識目標,能力目標,繼承的概念;繼承關(guān)鍵字;父類與子類之間的關(guān)系,super關(guān)鍵字。多態(tài)的概念;靜態(tài)多態(tài),動態(tài)多態(tài);多態(tài)的實現(xiàn)。最終類和抽象類。,掌握繼承的實現(xiàn);掌握super關(guān)鍵字;掌握多態(tài)的實現(xiàn)。,636,內(nèi)容提要,4,跟我做:汽車的分類關(guān)系,1,2,3,5,實現(xiàn)方案,代碼分析,必備知識,動手做一做,736,9.1 跟我做:汽車的分類關(guān)系,任務情景 汽車是一般的交通工具,具有車類型、品牌、引擎數(shù)量、外觀顏色等屬性,能夠發(fā)動、加速、剎車、停車等功能。汽車又可分為公共汽車、出租車、卡車等。公共汽車具有自己的第幾路編號、最大載客數(shù)量屬性,能夠報站。出租車具有所屬公司、最大載客數(shù)量屬性,能夠給乘客打發(fā)票??ㄜ嚲哂凶畲筝d重量屬性,能夠卸貨。請編寫Vehicle汽車類、Bus公共汽車類。Taxi類和Truck類待學完本任務后自行完成。 運行結(jié)果,第1章目錄,836,問題分析 回憶任務六中定義類的三個步驟,先定義類名,再編寫類的屬性,最后編寫類的方法。本任務采用這三個步驟,編寫好代碼后,我們很快就會發(fā)現(xiàn),Vehicle汽車類和Bus公共汽車類出現(xiàn)了許多相同的語句代碼。在屬性方面,都包含了車類型、品牌、引擎數(shù)量、外觀顏色重復的信息定義,在功能上都有發(fā)動、加速、剎車、停車等重復的行為定義。汽車、公共汽車的成員變量和成員方法對照請見圖9-2。 現(xiàn)在,我們換個思路考慮。汽車是一般性的概念,它包含的成員變量和成員方法,在公共汽車、出租車、卡車中也具有,因為公共汽車是一種汽車,出租車、卡車也是一種汽車,只不過公共汽車、出租車、卡車是一種更具體的汽車,除了汽車的公共特性外,還有自己的特有性質(zhì)。 經(jīng)過分析,采取如下措施,在定義類時,將公共汽車類、出租車類、卡車類中相同的屬性和方法抽象出來,集中放在汽車類中,形成一種共享的機制,公共汽車類、出租車類、卡車類中只放自己特有的成員變量和成員方法,減少重復代碼。這樣的汽車類稱為父類,公共汽車類、出租車類、卡車類稱為子類。子類繼承父類的非私有成員變量和成員方法。,第1章目錄,9.2 實現(xiàn)方案,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.接著,定義類的構(gòu)造方法: 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 實現(xiàn)方案,1036,5.定義Bus類。Bus類作為更具體的子類,只定義自己特有的性質(zhì)。父類Vehicle類已有的成員變量和成員方法不再定義。 public class Bus extends Vehicle /加上extends關(guān)鍵字和父類名Vehicle /公共汽車具有自己的最大載客數(shù)量、第幾路編號屬性 int maxLoad; /特有的成員變量 String busNo; /* * 構(gòu)造方法 */ public Bus() public Bus(int maxLoad,String busNo) /報站 public void announceBusStop() /特有的成員方法 6.定義VehicleTest測試類,運行程序。對Vehicle類、Bus類的繼承關(guān)系進行測試,Bus類能否訪問父類的成員變量,能否調(diào)用父類的成員方法。 Bus bus=new Bus(“子類公共汽車“,“女神“, 2, “白色“,50,“9路“); bus.start(); /調(diào)用父類的成員方法 bus.announceBusStop(); /公共汽車報站,9.2 實現(xiàn)方案,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. 繼承的概念 由一個已有類定義一個新類,稱為新類繼承了已有類。已有類稱為父類,新類稱為子類。例如,汽車類是父類,公共汽車類、出租車類、卡車類是子類。通過子類繼承父類,子類具有父類的一般特性,包括非私有的屬性和行為。子類還可以增加自身特性,定義新的屬性和行為,甚至可以重新定義父類中的屬性和方法,擴展類的功能。 例如,汽車類具有車類型、品牌、引擎數(shù)量、外觀顏色,能夠發(fā)動、加速、剎車、停車等一般特性。作為子類的公共汽車類、出租車類、卡車類繼承了父類的這些特性,另外,新增了自己的特性,公共汽車具有自己的第幾路編號、最大載客數(shù)量屬性,能夠報站。出租車具有所屬公司、最大載客數(shù)量屬性,能夠給乘客打發(fā)票??ㄜ嚲哂凶畲筝d重量屬性,能夠卸貨。公共汽車類還重新定義了父類的發(fā)動、汽車公共汽車出租車卡車 加速、剎車、停車功能。,第1章目錄,圖9-2 汽車又可分為公共汽車、出租車、卡車,1436,怎樣判斷類與類之間具有繼承關(guān)系呢?汽車具有一般特性,公共汽車、出租車、卡車是一種汽車,具有更具體的特性,符合is-a關(guān)系。根據(jù)這種原則,確定汽車是父類,公共汽車、出租車、卡車是子類。父類更通用、子類更具體。 再看一看人、消費者和經(jīng)銷商關(guān)系。人具有姓名、年齡屬性,能夠說話。消費者、經(jīng)銷商是一種人,具有姓名、年齡屬性,能夠說話。消費者還能夠購物、付費,經(jīng)銷商能夠進貨、收費,具有更具體的特性。符合is-a關(guān)系。所以,人是父類,消費者和經(jīng)銷商是子類。,第1章目錄,9.4 必備知識,1536,2. 繼承的意義 在定義汽車類、公共汽車類、出租車類、卡車類時,通過分析了解到,汽車類和其他車類之間的重復代碼太多,具有許多相同的成員變量和成員方法,既增加了程序員的工作量,降低編程效率,也違背了Java語言的“write once, only once”的原則。 如果把所有子類中相同的代碼都抽取到父類中,建立繼承關(guān)系,讓子類自動繼承父類的屬性和方法,那么子類中就省去重復代碼。 例如,在汽車類、公共汽車類、出租車類、卡車類建立了繼承關(guān)系后,公共汽車類、出租車類、卡車類中相同的代碼,包括成員變量定義和方法的定義,抽取到汽車類中,子類中不再進行重復定義,程序的有效實現(xiàn)代碼得到復用。因此,使用繼承提高代碼的復用性。,9.4 必備知識,1636,3. 繼承的實現(xiàn) 繼承的實現(xiàn)分兩個步驟: 定義父類 父類可以是系統(tǒng)類,也可以是自定義類。如果是系統(tǒng)類,該步驟可以省略。 在父類中只定義一些通用的屬性與方法,例如:Vehicle汽車類只定義了車類型、品牌、引擎數(shù)量、外觀顏色屬性,以及發(fā)動、加速、剎車、停車行為。 String type; /車類型、品牌、引擎數(shù)量、外觀顏色屬性 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關(guān)鍵字表示一個類繼承了另一個類。例如,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. 子類與父類的關(guān)系 定義子類之后,父類與子類之間就產(chǎn)生了一些特殊的關(guān)系,在代碼編寫上會受到影響,程序員必須清楚。 子類自動繼承父類的屬性和方法,但不能繼承訪問權(quán)限為private的成員變量和成員方法。例如: 父類Vehicle中有一私有成員變量和一私有成員方法: private String color; /父類中私有成員變量 private void start() /父類中私有成員方法 子類Bus中,按如下方式對父類成員變量和成員方法進行訪問,將會出錯。 color=“銀灰色“; /子類中訪問父類中私有成員變量,出錯 start(); /子類中調(diào)用父類中私有成員方法,出錯 當我們將父類Vehicle中private改為缺省時,子類Bus中訪問順利完成。 String color; /父類中private改為缺省 void start() /父類中private改為缺省 子類中可以定義特定的屬性和方法。例如,在子類Bus中,增加售票員(conductor)屬性,和開門open()方法: String conductor; void open() ,9.4 必備知識,2036,子類中方法重寫。所謂方法重寫就是子類定義的方法和父類的方法具有相同的名稱、參數(shù)列表、返回類型和訪問修飾符。例如,父類Vehicle中有如下方法: public void accelerate() System.out.println(type+brand+engineNum+“引擎“+color+“汽車加速“); 在子類Bus中,新增自己的加速accelerate()方法,這就是方法重寫。 public void accelerate() /方法重寫 super.accelerate(); System.out.println(“這是子類Bus中的重寫方法“); 方法重寫會隱藏父類的同名方法。也就是說,在子類Bus中,如果調(diào)用accelerate()方法,將不再是調(diào)用父類的accelerate()方法,而是子類Bus中的方法。 子類的屬性與父類的屬性相同時,也會出現(xiàn)隱藏的現(xiàn)象。,9.4 必備知識,2136,super關(guān)鍵字與this關(guān)鍵字 出現(xiàn)隱藏現(xiàn)象后,如果需要使用父類的成員屬性和成員方法,可以通過使用super關(guān)鍵字。例如,在子類Bus中,調(diào)用父類的accelerate()方法: super.accelerate(); /super指當前對象的父對象 如果用this關(guān)鍵字,則表示調(diào)用當前對象的accelerate()方法: this.accelerate(); /this指當前對象 通過使用super關(guān)鍵字與this關(guān)鍵字,可以很顯式地區(qū)分開調(diào)用的是當前對象的成員,還是父對象的成員。 另外,當方法體中定義的變量,或方法的形式參數(shù)與對象的成員變量名相同,也必須用this關(guān)鍵字指明當前對象的成員變量。,9.4 必備知識,2236,子類的構(gòu)造方法 子類不能繼承父類的構(gòu)造方法,因為父類的構(gòu)造方法用來創(chuàng)建父類對象,子類需定義自己的構(gòu)造方法,創(chuàng)建子類對象。 子類的構(gòu)造方法中,通過super關(guān)鍵字調(diào)用父類的構(gòu)造方法。例如,在子類Bus的構(gòu)造方法中,用如下語句實現(xiàn)了對父類構(gòu)造方法的調(diào)用: super(); /調(diào)用父類的無參構(gòu)造方法 super(type,brand, engineNum, color); /調(diào)用父類的帶參構(gòu)造方法 注意:super(參數(shù));必須是子類構(gòu)造方法的第一條語句。如果該語句省略,則會自動調(diào)用父類無參構(gòu)造方法。因為子類創(chuàng)建對象時,先創(chuàng)建父類對象,再創(chuàng)建子類對象。 如果需要調(diào)用當前類中的構(gòu)造方法,用this關(guān)鍵字。例如,在子類Bus的構(gòu)造方法中,用如下語句實現(xiàn)了對當前類中的構(gòu)造方法的調(diào)用: this(40,“8路”); /調(diào)用當前類中的帶參構(gòu)造方法,9.4 必備知識,2336,5. 根類Object 在Java 中,所有的類都是通過直接或間接地繼承java.lang.Object類得到的,Object類是一切類的祖先,稱為根類。 當定義類,而沒有使用extends關(guān)鍵字時,表示所定義類的父類為Object類,這是Java中的一種特別約定。根類Object類的方法如clone()、equals(obj)、finalize()、getClass()、hashCode()、notify()、notifyAll()、toString()、wait()等,子類都可以通過繼承,進行調(diào)用。 關(guān)于toString()方法,在任務六的類的定義中,通過重寫,已經(jīng)多次使用了該方法。,9.4 必備知識,2436,9.4.2 類的多態(tài) 1. 多態(tài)的概念 多態(tài)是指一個方法聲明的多種實現(xiàn)狀態(tài),即在程序中同名的不同方法共存,調(diào)用者只需要使用同一個方法名,系統(tǒng)會根據(jù)不同情況,調(diào)用相應的方法,從而實現(xiàn)不同的功能。簡而言之,多態(tài)性即“一個名字,多個方法”。例如,父類Vehicle中有如下方法: public void accelerate() 在子類Bus中,也有accelerate()方法: public void accelerate() /方法重寫 在程序中同名的不同方法共存,形成了多態(tài)。 2. 多態(tài)的意義 在面向?qū)ο蟪绦蛟O計中,多態(tài)是具有表現(xiàn)多種形態(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)指通過同一個類中的方法重載實現(xiàn)的多態(tài),動態(tài)多態(tài)指通過類與類之間的方法重寫實現(xiàn)的多態(tài)。方法重載參見8.4.4。方法重寫參見本任務9.4.1 類的繼承4.子類與父類的關(guān)系 子類中方法重寫部分。 靜態(tài)多態(tài)是編譯時多態(tài),指程序會根據(jù)參數(shù)的不同來調(diào)用相應的方法,具體調(diào)用哪個被重載的方法,由編譯器在編譯階段靜態(tài)決定。 動態(tài)多態(tài)是運行時多態(tài),指在運行時根據(jù)調(diào)用該方法的實例的類型來決定調(diào)用哪個重寫方法。 靜態(tài)多態(tài)對程序運行更有效率,動態(tài)多態(tài)更具有靈活性。 4.多態(tài)的實現(xiàn) 多態(tài)通過給同一個方法定義幾個版本來實現(xiàn)的。例如,現(xiàn)有三個類,Grandfather類是Father類的父類,F(xiàn)ather類是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) /子類的構(gòu)造方法 super(i, j); /調(diào)用父類的構(gòu)造方法 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); /調(diào)用子類Child重寫的drink()方法 System.out.println(father.getClass()+“喝水杯數(shù)“+father.drink(); /調(diào)用父類Grandfather的smoke()方法(子類未重寫) System.out.println(father.getClass()+“抽煙支數(shù)“+father.smoke(); ,9.4 必備知識,2936,多態(tài)程序運行結(jié)果見圖9-3。 在GrandfatherTest測試類中,首先聲明Father類型的變量father,然后建立Father類的子類Child類的一個實例,并把引用存儲到father中。Java運行時,系統(tǒng)分析該引用是Child類型的一個實例,因此調(diào)用子類Child重寫的drink()方法。因為方法smoke()未被子類Child重寫,所以運行時系統(tǒng)調(diào)用繼承的父類Father的父類Grandfather的smoke()方法。 注意:因為子類通過繼承具備了父類的所有屬性(私有屬性除外),所以,凡是要求使用父類對象的地方,都可以用子類對象來代替。 對子類的一個實例,運行時系統(tǒng)到底調(diào)用哪一個方法呢?如果子類重寫了父類的方法,則調(diào)用子類的方法;如果子類未重寫父類的方法,則調(diào)用父類的方法。因此,父類對象可以通過引用子類的實例調(diào)用子類的方法。,9.4 必備知識,3036,改錯: 下面關(guān)于多態(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關(guān)鍵字時,該類稱為最終類。最終類不能有子類,也就是不能被繼承。一般,用來完成某種標準功能的類,例如,系統(tǒng)類String、Byte和Double,或定義已經(jīng)很完美,不需要生成子類的類,通常定義為最終類。 最終類的聲明格式: final class 類名 2.抽象類 當一個類的定義使用了abstract 關(guān)鍵字時,該類稱為抽象類。抽象類是供子類繼承卻不能創(chuàng)建實例的類。抽象類中可以聲明只有方法頭沒有方法體的抽象方法,方法體由子類實現(xiàn)。抽象類提供了方法聲明與方法實現(xiàn)分離的機制,使各子類表現(xiàn)出共同的行為模式。抽象方法在不同的子類中表現(xiàn)出多態(tài)性。 抽象類的聲明格式: public abstract class 類名 ,9.4 必備知識,3236,在面向?qū)ο蟪绦蛟O計時,抽象類一般用于現(xiàn)實世界抽象的概念,例如,食物,水果、交通工具等,我們看不到他們的實例,只能看到他們子類,例如米飯、蘋果、飛機等子類的實例。 Java中的java.lang.Number類是抽象類,沒有實例,它是integer和float具體數(shù)字類型的抽象父類。 例如,有計算機類Computer和筆記本電腦類Notebook兩個類。Computer為抽象類,Notebook為其

溫馨提示

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

評論

0/150

提交評論