已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
阜陽(yáng)師范學(xué)院計(jì)算機(jī)與信息學(xué)院,Java程序設(shè)計(jì),主講教師:曹紅兵,236,目 錄,任務(wù)一 搭建環(huán)境(構(gòu)建Java集成開(kāi)發(fā)環(huán)境),任務(wù)二 Java歡迎你(開(kāi)發(fā)簡(jiǎn)單Java應(yīng)用程序,任務(wù)三 小試牛刀(學(xué)習(xí)Java語(yǔ)言基礎(chǔ)),任務(wù)四 挑戰(zhàn)選擇(使用分支控制流程),任務(wù)五 游戲人生(使用循環(huán)控制流程),任務(wù)六 回歸自然(創(chuàng)建、使用類(lèi)和對(duì)象),任務(wù)七 3G時(shí)代的消息傳遞(定義和使用類(lèi)方法),任務(wù)八 保護(hù)你的隱私(封裝的使用),任務(wù)九 子承父業(yè)(繼承和多態(tài)的使用),任務(wù)十 上帝萬(wàn)能之手(接口的使用),336,任務(wù)十一 用數(shù)組存儲(chǔ)信息(使用數(shù)組),任務(wù)十二 使用字符串進(jìn)行交流(使用字符串),任務(wù)十三 防患于未然(捕獲并處理異常),任務(wù)十四 主動(dòng)出擊(拋出異常),任務(wù)十五 認(rèn)識(shí)Java Applet(Applet入門(mén)),任務(wù)十六 豐富多彩的Applet(在Applet中播放聲音和顯示圖像),任務(wù)十七 進(jìn)入Windows世界(設(shè)計(jì)圖形用戶界面),任務(wù)十八 布局規(guī)劃(使用布局管理器),任務(wù)十九 事件委托處理(如何處理事件),任務(wù)二十 選擇之道(使用選擇控件和選擇事件),目 錄,436,任務(wù)二十一 簡(jiǎn)明清晰的菜單(使用菜單和其他常用事件),任務(wù)二十二 訪問(wèn)數(shù)據(jù)(使用JDBC連接數(shù)據(jù)庫(kù)),任務(wù)二十三 訪問(wèn)數(shù)據(jù)升級(jí)(數(shù)據(jù)庫(kù)編程),任務(wù)二十四 文件管理(目錄與文件管理),任務(wù)二十五 順序進(jìn)出之道(文件的順序訪問(wèn)),任務(wù)二十六 隨機(jī)進(jìn)出之道(文件的隨機(jī)訪問(wèn)),任務(wù)二十七 JAVA的分身術(shù)(創(chuàng)建和啟動(dòng)線程),任務(wù)二十八 線程的生命周期與優(yōu)先級(jí)(線程的狀態(tài)與調(diào)度),任務(wù)二十九 基于連接的通信(Java中的套接字Socket),任務(wù)三十 基于無(wú)連接的通信(Java中的數(shù)據(jù)報(bào)編程),目 錄,536,任務(wù)九 子承父業(yè)(繼承和多態(tài)的使用),2,1,知識(shí)目標(biāo),能力目標(biāo),繼承的概念;繼承關(guān)鍵字;父類(lèi)與子類(lèi)之間的關(guān)系,super關(guān)鍵字。多態(tài)的概念;靜態(tài)多態(tài),動(dòng)態(tài)多態(tài);多態(tài)的實(shí)現(xiàn)。最終類(lèi)和抽象類(lèi)。,掌握繼承的實(shí)現(xiàn);掌握super關(guān)鍵字;掌握多態(tài)的實(shí)現(xiàn)。,636,內(nèi)容提要,4,跟我做:汽車(chē)的分類(lèi)關(guān)系,1,2,3,5,實(shí)現(xiàn)方案,代碼分析,必備知識(shí),動(dòng)手做一做,736,9.1 跟我做:汽車(chē)的分類(lèi)關(guān)系,任務(wù)情景 汽車(chē)是一般的交通工具,具有車(chē)類(lèi)型、品牌、引擎數(shù)量、外觀顏色等屬性,能夠發(fā)動(dòng)、加速、剎車(chē)、停車(chē)等功能。汽車(chē)又可分為公共汽車(chē)、出租車(chē)、卡車(chē)等。公共汽車(chē)具有自己的第幾路編號(hào)、最大載客數(shù)量屬性,能夠報(bào)站。出租車(chē)具有所屬公司、最大載客數(shù)量屬性,能夠給乘客打發(fā)票??ㄜ?chē)具有最大載重量屬性,能夠卸貨。請(qǐng)編寫(xiě)Vehicle汽車(chē)類(lèi)、Bus公共汽車(chē)類(lèi)。Taxi類(lèi)和Truck類(lèi)待學(xué)完本任務(wù)后自行完成。 運(yùn)行結(jié)果,第1章目錄,836,問(wèn)題分析 回憶任務(wù)六中定義類(lèi)的三個(gè)步驟,先定義類(lèi)名,再編寫(xiě)類(lèi)的屬性,最后編寫(xiě)類(lèi)的方法。本任務(wù)采用這三個(gè)步驟,編寫(xiě)好代碼后,我們很快就會(huì)發(fā)現(xiàn),Vehicle汽車(chē)類(lèi)和Bus公共汽車(chē)類(lèi)出現(xiàn)了許多相同的語(yǔ)句代碼。在屬性方面,都包含了車(chē)類(lèi)型、品牌、引擎數(shù)量、外觀顏色重復(fù)的信息定義,在功能上都有發(fā)動(dòng)、加速、剎車(chē)、停車(chē)等重復(fù)的行為定義。汽車(chē)、公共汽車(chē)的成員變量和成員方法對(duì)照請(qǐng)見(jiàn)圖9-2。 現(xiàn)在,我們換個(gè)思路考慮。汽車(chē)是一般性的概念,它包含的成員變量和成員方法,在公共汽車(chē)、出租車(chē)、卡車(chē)中也具有,因?yàn)楣财?chē)是一種汽車(chē),出租車(chē)、卡車(chē)也是一種汽車(chē),只不過(guò)公共汽車(chē)、出租車(chē)、卡車(chē)是一種更具體的汽車(chē),除了汽車(chē)的公共特性外,還有自己的特有性質(zhì)。 經(jīng)過(guò)分析,采取如下措施,在定義類(lèi)時(shí),將公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)中相同的屬性和方法抽象出來(lái),集中放在汽車(chē)類(lèi)中,形成一種共享的機(jī)制,公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)中只放自己特有的成員變量和成員方法,減少重復(fù)代碼。這樣的汽車(chē)類(lèi)稱為父類(lèi),公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)稱為子類(lèi)。子類(lèi)繼承父類(lèi)的非私有成員變量和成員方法。,第1章目錄,9.2 實(shí)現(xiàn)方案,936,解決步驟 1.打開(kāi)Eclipse,在study項(xiàng)目中創(chuàng)建包c(diǎn)om.task09,再確定類(lèi)名Vehicle,得到類(lèi)的框架。 package com.task09; public class Vehicle 2.然后,進(jìn)行類(lèi)的屬性描述,只輸入抽象出來(lái)的共有的成員變量 String type; String brand; int engineNum; String color; 3.接著,定義類(lèi)的構(gòu)造方法: public Vehicle() public Vehicle(String type,String brand, int engineNum, String color) 4.再定義抽象出來(lái)的共有的方法: /發(fā)動(dòng)、加速、剎車(chē)、停車(chē) public void start() public void accelerate() public void brake() public void stop(),9.2 實(shí)現(xiàn)方案,1036,5.定義Bus類(lèi)。Bus類(lèi)作為更具體的子類(lèi),只定義自己特有的性質(zhì)。父類(lèi)Vehicle類(lèi)已有的成員變量和成員方法不再定義。 public class Bus extends Vehicle /加上extends關(guān)鍵字和父類(lèi)名Vehicle /公共汽車(chē)具有自己的最大載客數(shù)量、第幾路編號(hào)屬性 int maxLoad; /特有的成員變量 String busNo; /* * 構(gòu)造方法 */ public Bus() public Bus(int maxLoad,String busNo) /報(bào)站 public void announceBusStop() /特有的成員方法 6.定義VehicleTest測(cè)試類(lèi),運(yùn)行程序。對(duì)Vehicle類(lèi)、Bus類(lèi)的繼承關(guān)系進(jìn)行測(cè)試,Bus類(lèi)能否訪問(wèn)父類(lèi)的成員變量,能否調(diào)用父類(lèi)的成員方法。 Bus bus=new Bus(“子類(lèi)公共汽車(chē)“,“女神“, 2, “白色“,50,“9路“); bus.start(); /調(diào)用父類(lèi)的成員方法 bus.announceBusStop(); /公共汽車(chē)報(bào)站,9.2 實(shí)現(xiàn)方案,1136,程序代碼,第1章目錄,9.3 代碼分析,1236,9.3 代碼分析,應(yīng)用擴(kuò)展 Bus類(lèi)繼承了Vehicle類(lèi)后,在發(fā)動(dòng)、加速、剎車(chē)、停車(chē)功能上加上自己的特性,就要重寫(xiě)這四個(gè)方法。重寫(xiě)形成了多態(tài)。Bus類(lèi)升級(jí)新增方法如下: /發(fā)動(dòng)、加速、剎車(chē)、停車(chē) public void start() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車(chē)發(fā)動(dòng)“); public void accelerate() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車(chē)加速“); public void brake() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車(chē)剎車(chē)“); public void stop() System.out.println(type+busNo+brand+engineNum+“引擎“+color+“汽車(chē)停車(chē)“); ,第1章目錄,1336,9.4 必備知識(shí),9.4.1 類(lèi)的繼承 1. 繼承的概念 由一個(gè)已有類(lèi)定義一個(gè)新類(lèi),稱為新類(lèi)繼承了已有類(lèi)。已有類(lèi)稱為父類(lèi),新類(lèi)稱為子類(lèi)。例如,汽車(chē)類(lèi)是父類(lèi),公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)是子類(lèi)。通過(guò)子類(lèi)繼承父類(lèi),子類(lèi)具有父類(lèi)的一般特性,包括非私有的屬性和行為。子類(lèi)還可以增加自身特性,定義新的屬性和行為,甚至可以重新定義父類(lèi)中的屬性和方法,擴(kuò)展類(lèi)的功能。 例如,汽車(chē)類(lèi)具有車(chē)類(lèi)型、品牌、引擎數(shù)量、外觀顏色,能夠發(fā)動(dòng)、加速、剎車(chē)、停車(chē)等一般特性。作為子類(lèi)的公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)繼承了父類(lèi)的這些特性,另外,新增了自己的特性,公共汽車(chē)具有自己的第幾路編號(hào)、最大載客數(shù)量屬性,能夠報(bào)站。出租車(chē)具有所屬公司、最大載客數(shù)量屬性,能夠給乘客打發(fā)票??ㄜ?chē)具有最大載重量屬性,能夠卸貨。公共汽車(chē)類(lèi)還重新定義了父類(lèi)的發(fā)動(dòng)、汽車(chē)公共汽車(chē)出租車(chē)卡車(chē) 加速、剎車(chē)、停車(chē)功能。,第1章目錄,圖9-2 汽車(chē)又可分為公共汽車(chē)、出租車(chē)、卡車(chē),1436,怎樣判斷類(lèi)與類(lèi)之間具有繼承關(guān)系呢?汽車(chē)具有一般特性,公共汽車(chē)、出租車(chē)、卡車(chē)是一種汽車(chē),具有更具體的特性,符合is-a關(guān)系。根據(jù)這種原則,確定汽車(chē)是父類(lèi),公共汽車(chē)、出租車(chē)、卡車(chē)是子類(lèi)。父類(lèi)更通用、子類(lèi)更具體。 再看一看人、消費(fèi)者和經(jīng)銷(xiāo)商關(guān)系。人具有姓名、年齡屬性,能夠說(shuō)話。消費(fèi)者、經(jīng)銷(xiāo)商是一種人,具有姓名、年齡屬性,能夠說(shuō)話。消費(fèi)者還能夠購(gòu)物、付費(fèi),經(jīng)銷(xiāo)商能夠進(jìn)貨、收費(fèi),具有更具體的特性。符合is-a關(guān)系。所以,人是父類(lèi),消費(fèi)者和經(jīng)銷(xiāo)商是子類(lèi)。,第1章目錄,9.4 必備知識(shí),1536,2. 繼承的意義 在定義汽車(chē)類(lèi)、公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)時(shí),通過(guò)分析了解到,汽車(chē)類(lèi)和其他車(chē)類(lèi)之間的重復(fù)代碼太多,具有許多相同的成員變量和成員方法,既增加了程序員的工作量,降低編程效率,也違背了Java語(yǔ)言的“write once, only once”的原則。 如果把所有子類(lèi)中相同的代碼都抽取到父類(lèi)中,建立繼承關(guān)系,讓子類(lèi)自動(dòng)繼承父類(lèi)的屬性和方法,那么子類(lèi)中就省去重復(fù)代碼。 例如,在汽車(chē)類(lèi)、公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)建立了繼承關(guān)系后,公共汽車(chē)類(lèi)、出租車(chē)類(lèi)、卡車(chē)類(lèi)中相同的代碼,包括成員變量定義和方法的定義,抽取到汽車(chē)類(lèi)中,子類(lèi)中不再進(jìn)行重復(fù)定義,程序的有效實(shí)現(xiàn)代碼得到復(fù)用。因此,使用繼承提高代碼的復(fù)用性。,9.4 必備知識(shí),1636,3. 繼承的實(shí)現(xiàn) 繼承的實(shí)現(xiàn)分兩個(gè)步驟: 定義父類(lèi) 父類(lèi)可以是系統(tǒng)類(lèi),也可以是自定義類(lèi)。如果是系統(tǒng)類(lèi),該步驟可以省略。 在父類(lèi)中只定義一些通用的屬性與方法,例如:Vehicle汽車(chē)類(lèi)只定義了車(chē)類(lèi)型、品牌、引擎數(shù)量、外觀顏色屬性,以及發(fā)動(dòng)、加速、剎車(chē)、停車(chē)行為。 String type; /車(chē)類(lèi)型、品牌、引擎數(shù)量、外觀顏色屬性 String brand; int engineNum; String color; public void start() /發(fā)動(dòng)、加速、剎車(chē)、停車(chē)行為 public void accelerate() public void brake() public void stop(),9.4 必備知識(shí),1736,定義子類(lèi) 子類(lèi)定義格式: 類(lèi)修飾符 class 子類(lèi)名 extends 父類(lèi)名 extends關(guān)鍵字表示一個(gè)類(lèi)繼承了另一個(gè)類(lèi)。例如,Bus公共汽車(chē)類(lèi)繼承Vehicle汽車(chē)類(lèi)。 public class Bus extends Vehicle /父類(lèi)名只能有一個(gè) 然后,定義子類(lèi)特有的成員變量和成員方法。例如,Bus公共汽車(chē)類(lèi)作為子類(lèi),新增了自己的特性。 int maxLoad; /子類(lèi)特有的屬性 String busNo; public void announceBusStop() /報(bào)站,子類(lèi)特有的方法 System.out.println(busNo+“公共汽車(chē)報(bào)站“); 注意:一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi),即單繼承。但一個(gè)父類(lèi)可以有多個(gè)子類(lèi)。,9.4 必備知識(shí),1836,改錯(cuò): 下面繼承定義有哪些錯(cuò)誤? /* *人(Person)具有姓名(name)、年齡屬性(age),能夠說(shuō)話(talk)。 *消費(fèi)者(Customer)具有姓名(name)、年齡屬性(age),能夠說(shuō)話(talk),還能夠購(gòu)物( shop)。 */ public class Person String name; int age; public void talk() System.out.println(name +“說(shuō)話“ ); public class person extends Customer, Shop String name; public void talk() System.out.println(name +“說(shuō)話“ ); private void shop () System.out.println(name +“購(gòu)物“); 提示:有5個(gè)錯(cuò)誤。,9.4 必備知識(shí),1936,4. 子類(lèi)與父類(lèi)的關(guān)系 定義子類(lèi)之后,父類(lèi)與子類(lèi)之間就產(chǎn)生了一些特殊的關(guān)系,在代碼編寫(xiě)上會(huì)受到影響,程序員必須清楚。 子類(lèi)自動(dòng)繼承父類(lèi)的屬性和方法,但不能繼承訪問(wèn)權(quán)限為private的成員變量和成員方法。例如: 父類(lèi)Vehicle中有一私有成員變量和一私有成員方法: private String color; /父類(lèi)中私有成員變量 private void start() /父類(lèi)中私有成員方法 子類(lèi)Bus中,按如下方式對(duì)父類(lèi)成員變量和成員方法進(jìn)行訪問(wèn),將會(huì)出錯(cuò)。 color=“銀灰色“; /子類(lèi)中訪問(wèn)父類(lèi)中私有成員變量,出錯(cuò) start(); /子類(lèi)中調(diào)用父類(lèi)中私有成員方法,出錯(cuò) 當(dāng)我們將父類(lèi)Vehicle中private改為缺省時(shí),子類(lèi)Bus中訪問(wèn)順利完成。 String color; /父類(lèi)中private改為缺省 void start() /父類(lèi)中private改為缺省 子類(lèi)中可以定義特定的屬性和方法。例如,在子類(lèi)Bus中,增加售票員(conductor)屬性,和開(kāi)門(mén)open()方法: String conductor; void open() ,9.4 必備知識(shí),2036,子類(lèi)中方法重寫(xiě)。所謂方法重寫(xiě)就是子類(lèi)定義的方法和父類(lèi)的方法具有相同的名稱、參數(shù)列表、返回類(lèi)型和訪問(wèn)修飾符。例如,父類(lèi)Vehicle中有如下方法: public void accelerate() System.out.println(type+brand+engineNum+“引擎“+color+“汽車(chē)加速“); 在子類(lèi)Bus中,新增自己的加速accelerate()方法,這就是方法重寫(xiě)。 public void accelerate() /方法重寫(xiě) super.accelerate(); System.out.println(“這是子類(lèi)Bus中的重寫(xiě)方法“); 方法重寫(xiě)會(huì)隱藏父類(lèi)的同名方法。也就是說(shuō),在子類(lèi)Bus中,如果調(diào)用accelerate()方法,將不再是調(diào)用父類(lèi)的accelerate()方法,而是子類(lèi)Bus中的方法。 子類(lèi)的屬性與父類(lèi)的屬性相同時(shí),也會(huì)出現(xiàn)隱藏的現(xiàn)象。,9.4 必備知識(shí),2136,super關(guān)鍵字與this關(guān)鍵字 出現(xiàn)隱藏現(xiàn)象后,如果需要使用父類(lèi)的成員屬性和成員方法,可以通過(guò)使用super關(guān)鍵字。例如,在子類(lèi)Bus中,調(diào)用父類(lèi)的accelerate()方法: super.accelerate(); /super指當(dāng)前對(duì)象的父對(duì)象 如果用this關(guān)鍵字,則表示調(diào)用當(dāng)前對(duì)象的accelerate()方法: this.accelerate(); /this指當(dāng)前對(duì)象 通過(guò)使用super關(guān)鍵字與this關(guān)鍵字,可以很顯式地區(qū)分開(kāi)調(diào)用的是當(dāng)前對(duì)象的成員,還是父對(duì)象的成員。 另外,當(dāng)方法體中定義的變量,或方法的形式參數(shù)與對(duì)象的成員變量名相同,也必須用this關(guān)鍵字指明當(dāng)前對(duì)象的成員變量。,9.4 必備知識(shí),2236,子類(lèi)的構(gòu)造方法 子類(lèi)不能繼承父類(lèi)的構(gòu)造方法,因?yàn)楦割?lèi)的構(gòu)造方法用來(lái)創(chuàng)建父類(lèi)對(duì)象,子類(lèi)需定義自己的構(gòu)造方法,創(chuàng)建子類(lèi)對(duì)象。 子類(lèi)的構(gòu)造方法中,通過(guò)super關(guān)鍵字調(diào)用父類(lèi)的構(gòu)造方法。例如,在子類(lèi)Bus的構(gòu)造方法中,用如下語(yǔ)句實(shí)現(xiàn)了對(duì)父類(lèi)構(gòu)造方法的調(diào)用: super(); /調(diào)用父類(lèi)的無(wú)參構(gòu)造方法 super(type,brand, engineNum, color); /調(diào)用父類(lèi)的帶參構(gòu)造方法 注意:super(參數(shù));必須是子類(lèi)構(gòu)造方法的第一條語(yǔ)句。如果該語(yǔ)句省略,則會(huì)自動(dòng)調(diào)用父類(lèi)無(wú)參構(gòu)造方法。因?yàn)樽宇?lèi)創(chuàng)建對(duì)象時(shí),先創(chuàng)建父類(lèi)對(duì)象,再創(chuàng)建子類(lèi)對(duì)象。 如果需要調(diào)用當(dāng)前類(lèi)中的構(gòu)造方法,用this關(guān)鍵字。例如,在子類(lèi)Bus的構(gòu)造方法中,用如下語(yǔ)句實(shí)現(xiàn)了對(duì)當(dāng)前類(lèi)中的構(gòu)造方法的調(diào)用: this(40,“8路”); /調(diào)用當(dāng)前類(lèi)中的帶參構(gòu)造方法,9.4 必備知識(shí),2336,5. 根類(lèi)Object 在Java 中,所有的類(lèi)都是通過(guò)直接或間接地繼承java.lang.Object類(lèi)得到的,Object類(lèi)是一切類(lèi)的祖先,稱為根類(lèi)。 當(dāng)定義類(lèi),而沒(méi)有使用extends關(guān)鍵字時(shí),表示所定義類(lèi)的父類(lèi)為Object類(lèi),這是Java中的一種特別約定。根類(lèi)Object類(lèi)的方法如clone()、equals(obj)、finalize()、getClass()、hashCode()、notify()、notifyAll()、toString()、wait()等,子類(lèi)都可以通過(guò)繼承,進(jìn)行調(diào)用。 關(guān)于toString()方法,在任務(wù)六的類(lèi)的定義中,通過(guò)重寫(xiě),已經(jīng)多次使用了該方法。,9.4 必備知識(shí),2436,9.4.2 類(lèi)的多態(tài) 1. 多態(tài)的概念 多態(tài)是指一個(gè)方法聲明的多種實(shí)現(xiàn)狀態(tài),即在程序中同名的不同方法共存,調(diào)用者只需要使用同一個(gè)方法名,系統(tǒng)會(huì)根據(jù)不同情況,調(diào)用相應(yīng)的方法,從而實(shí)現(xiàn)不同的功能。簡(jiǎn)而言之,多態(tài)性即“一個(gè)名字,多個(gè)方法”。例如,父類(lèi)Vehicle中有如下方法: public void accelerate() 在子類(lèi)Bus中,也有accelerate()方法: public void accelerate() /方法重寫(xiě) 在程序中同名的不同方法共存,形成了多態(tài)。 2. 多態(tài)的意義 在面向?qū)ο蟪绦蛟O(shè)計(jì)中,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征,有時(shí)需要利用方法的重名,提高程序的抽象度和簡(jiǎn)潔性,以及程序的可擴(kuò)展性及可維護(hù)性。例如使用多態(tài)之后,當(dāng)需要增加新的子類(lèi)PoliceCar警車(chē)類(lèi)時(shí),無(wú)需更改父類(lèi)Vehicle,代碼得到了擴(kuò)展,維護(hù)起來(lái)也方便。,9.4 必備知識(shí),2536,3.多態(tài)的分類(lèi) 多態(tài)分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)。靜態(tài)多態(tài)指通過(guò)同一個(gè)類(lèi)中的方法重載實(shí)現(xiàn)的多態(tài),動(dòng)態(tài)多態(tài)指通過(guò)類(lèi)與類(lèi)之間的方法重寫(xiě)實(shí)現(xiàn)的多態(tài)。方法重載參見(jiàn)8.4.4。方法重寫(xiě)參見(jiàn)本任務(wù)9.4.1 類(lèi)的繼承4.子類(lèi)與父類(lèi)的關(guān)系 子類(lèi)中方法重寫(xiě)部分。 靜態(tài)多態(tài)是編譯時(shí)多態(tài),指程序會(huì)根據(jù)參數(shù)的不同來(lái)調(diào)用相應(yīng)的方法,具體調(diào)用哪個(gè)被重載的方法,由編譯器在編譯階段靜態(tài)決定。 動(dòng)態(tài)多態(tài)是運(yùn)行時(shí)多態(tài),指在運(yùn)行時(shí)根據(jù)調(diào)用該方法的實(shí)例的類(lèi)型來(lái)決定調(diào)用哪個(gè)重寫(xiě)方法。 靜態(tài)多態(tài)對(duì)程序運(yùn)行更有效率,動(dòng)態(tài)多態(tài)更具有靈活性。 4.多態(tài)的實(shí)現(xiàn) 多態(tài)通過(guò)給同一個(gè)方法定義幾個(gè)版本來(lái)實(shí)現(xiàn)的。例如,現(xiàn)有三個(gè)類(lèi),Grandfather類(lèi)是Father類(lèi)的父類(lèi),F(xiàn)ather類(lèi)是Child類(lèi)的父類(lèi)。三個(gè)類(lèi)的代碼如下:,9.4 必備知識(shí),2636,package com.task09; /* * Grandfather.java * 多態(tài),本類(lèi)作為Father的父類(lèi) */ 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 必備知識(shí),2736,package com.task09; /* * Father.java * 多態(tài),本類(lèi)作為Grandfather的子類(lèi),本類(lèi)作為Child的父類(lèi) */ 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 必備知識(shí),2836,package com.task09; /* * Child.java * 多態(tài),本類(lèi)作為Father的子類(lèi) */ public class Child extends Father /* * param i * param j */ public Child(int i, int j) /子類(lèi)的構(gòu)造方法 super(i, j); /調(diào)用父類(lèi)的構(gòu)造方法 int drink() /重寫(xiě)了父類(lèi)的方法 System.out.println(“Child重寫(xiě)的方法drink():“); return i*j; package com.task09; public class GrandfatherTest /* * param args */ public static void main(String args) /創(chuàng)建子類(lèi)的對(duì)象,賦給父類(lèi)對(duì)象變量father Father father=new Child(3,4); /調(diào)用子類(lèi)Child重寫(xiě)的drink()方法 System.out.println(father.getClass()+“喝水杯數(shù)“+father.drink(); /調(diào)用父類(lèi)Grandfather的smoke()方法(子類(lèi)未重寫(xiě)) System.out.println(father.getClass()+“抽煙支數(shù)“+father.smoke(); ,9.4 必備知識(shí),2936,多態(tài)程序運(yùn)行結(jié)果見(jiàn)圖9-3。 在GrandfatherTest測(cè)試類(lèi)中,首先聲明Father類(lèi)型的變量father,然后建立Father類(lèi)的子類(lèi)Child類(lèi)的一個(gè)實(shí)例,并把引用存儲(chǔ)到father中。Java運(yùn)行時(shí),系統(tǒng)分析該引用是Child類(lèi)型的一個(gè)實(shí)例,因此調(diào)用子類(lèi)Child重寫(xiě)的drink()方法。因?yàn)榉椒╯moke()未被子類(lèi)Child重寫(xiě),所以運(yùn)行時(shí)系統(tǒng)調(diào)用繼承的父類(lèi)Father的父類(lèi)Grandfather的smoke()方法。 注意:因?yàn)樽宇?lèi)通過(guò)繼承具備了父類(lèi)的所有屬性(私有屬性除外),所以,凡是要求使用父類(lèi)對(duì)象的地方,都可以用子類(lèi)對(duì)象來(lái)代替。 對(duì)子類(lèi)的一個(gè)實(shí)例,運(yùn)行時(shí)系統(tǒng)到底調(diào)用哪一個(gè)方法呢?如果子類(lèi)重寫(xiě)了父類(lèi)的方法,則調(diào)用子類(lèi)的方法;如果子類(lèi)未重寫(xiě)父類(lèi)的方法,則調(diào)用父類(lèi)的方法。因此,父類(lèi)對(duì)象可以通過(guò)引用子類(lèi)的實(shí)例調(diào)用子類(lèi)的方法。,9.4 必備知識(shí),3036,改錯(cuò): 下面關(guān)于多態(tài)定義有哪些錯(cuò)誤? 父類(lèi)Grandfather中有如下方法: int smoke() System.out.println(“Grandfather的方法smoke():“); return i+j; 子類(lèi)Father中定義了方法: int smoke(int i) System.out.println(“Father的方法smoke():“); return i+j; 提示:有1個(gè)錯(cuò)誤。,9.4 必備知識(shí),3136,9.4.3 最終類(lèi)和抽象類(lèi) 1.最終類(lèi) 當(dāng)一個(gè)類(lèi)的定義使用了final關(guān)鍵字時(shí),該類(lèi)稱為最終類(lèi)。最終類(lèi)不能有子類(lèi),也就是不能被繼承。一般,用來(lái)完成某種標(biāo)準(zhǔn)功能的類(lèi),例如,系統(tǒng)類(lèi)String、Byte和Double,或定義已經(jīng)很完美,不需要生成子類(lèi)的類(lèi),通常定義為最終類(lèi)。 最終類(lèi)的聲明格式: final class 類(lèi)名 2.抽象類(lèi) 當(dāng)一個(gè)類(lèi)的定義使用了abstract 關(guān)鍵字時(shí),該類(lèi)稱為抽象類(lèi)。抽象類(lèi)是供子類(lèi)繼承卻不能創(chuàng)建實(shí)例的類(lèi)。抽象類(lèi)中可以聲明只有方法頭沒(méi)有方法體的抽象方法,方法體由子類(lèi)實(shí)現(xiàn)。抽象類(lèi)提供了方法聲明與方法實(shí)現(xiàn)分離的機(jī)制,使各子類(lèi)表現(xiàn)出共同的行為模式。抽象方法在不同的子類(lèi)中表現(xiàn)出多態(tài)性。 抽象類(lèi)的聲明格式: public abstract class 類(lèi)名 ,9.4 必備知識(shí),3236,在面向?qū)ο蟪绦蛟O(shè)計(jì)時(shí),抽象類(lèi)一般用于現(xiàn)實(shí)世界抽象的概念,例如,食物,水果、交通工具等,我們看不到他們的實(shí)例,只能看到他們子類(lèi),例如米飯、蘋(píng)果、飛機(jī)等子類(lèi)的實(shí)例。 Java中的java.lang.Number類(lèi)是抽象類(lèi),沒(méi)有實(shí)例,它是integer和float具體數(shù)字類(lèi)型的抽象父類(lèi)。 例如,有計(jì)算機(jī)類(lèi)Computer和筆記本電腦類(lèi)Notebook兩個(gè)類(lèi)。Computer為抽象類(lèi),Notebook為其
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版苗圃苗木線上線下銷(xiāo)售渠道合作協(xié)議4篇
- 2025年度個(gè)人房產(chǎn)抵押貸款還款協(xié)議書(shū)模板4篇
- 2025年度航空航天模具研發(fā)制造合同4篇
- 二零二五版豪華車(chē)型購(gòu)車(chē)指標(biāo)使用權(quán)租賃協(xié)議3篇
- 2025年物業(yè)廣告位租賃與環(huán)保理念推廣合作協(xié)議3篇
- 2025版企業(yè)內(nèi)部員工技能培訓(xùn)學(xué)員協(xié)議3篇
- 2025年環(huán)保打印機(jī)購(gòu)銷(xiāo)合同綠色環(huán)保版4篇
- 個(gè)人招標(biāo)工作心得:2024年實(shí)踐與思考3篇
- 二零二五年度航空器租賃合同租賃期限與維護(hù)保養(yǎng)責(zé)任4篇
- 2025年農(nóng)業(yè)大棚租賃與智能灌溉系統(tǒng)安裝合同4篇
- 開(kāi)展課外讀物負(fù)面清單管理的具體實(shí)施舉措方案
- 2025年云南中煙工業(yè)限責(zé)任公司招聘420人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025-2030年中國(guó)洗衣液市場(chǎng)未來(lái)發(fā)展趨勢(shì)及前景調(diào)研分析報(bào)告
- 2024解析:第三章物態(tài)變化-基礎(chǔ)練(解析版)
- 2023年江蘇省南京市中考化學(xué)真題
- 供電副所長(zhǎng)述職報(bào)告
- 校園欺凌問(wèn)題成因及對(duì)策分析研究論文
- 技術(shù)支持資料投標(biāo)書(shū)
- 老年人意外事件與與預(yù)防
- 預(yù)防艾滋病、梅毒和乙肝母嬰傳播轉(zhuǎn)介服務(wù)制度
- 《高速鐵路客運(yùn)安全與應(yīng)急處理》課程標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論