




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Chap5 繼承與多態(tài),繼承的基本概念,繼承是面向?qū)ο蟪绦蛟O(shè)計的一種重要手段,可以更有效的組織程序,明確類之間的關(guān)系,實(shí)現(xiàn)代碼重用 當(dāng)一個類獲取另一個類的所有非私有屬性作為自己的部分或全部成分時,就稱這兩個類之間具有繼承關(guān)系。 被繼承的類稱為父類或超類 繼承了父類或超類的所有數(shù)據(jù)和操作的類稱為子類。,一個父類可以有多個子類 比如電話卡類,Java中一個子類只能有一個父類 即單繼承 C+中一個子類可以有多個父類,即多重繼承 類繼承的方法:通過extends來實(shí)現(xiàn) 形式如:class subclass extends superclass subclass將繼承它的父類superclass的所有非
2、私有屬性作為自己的所有或部分成員。,說各個類的成員情況,默認(rèn)屬性均為公有的,域的繼承與隱藏,域的繼承 繼承父類的所有非私有域,減少程序的維護(hù)工作量 域的隱藏 在子類中重新定義一個與從父類繼承來的域 完全相同的變量。即子類中含有兩個同名的 變量。當(dāng)子類執(zhí)行繼承自父類的方法時,處 理的是繼承自父類的變量;當(dāng)子類執(zhí)行它自 己定義的方法時,處理的是它自己定義的變 量,而把繼承自父類的變量“隱藏”起來。,注意在域的隱藏情況下,繼承自父類的變量在子類中仍然占有一個內(nèi)存空間。,public class testhidefield public static void main(String args) su
3、bclass subc1=new subclass(); System.out.println(subc1.supergetvar();/輸出super System.out.println(subc1.subgetvar();/輸出sub System.out.println(subc1.supervar);/輸出sub class superclass String supervar=“super”; String supergetvar()return supervar; class subclass extends superclass String supervar=“sub”;/子
4、類中有兩個supervar String subgetvar() return supervar; ,方法的繼承和覆蓋,方法的繼承:子類繼承父類所有的非私有方法。 方法的覆蓋:與域的隱藏類似,子類中定義與父類中相同的方法。不同的是繼承自父類同名方法在子類中被覆蓋,在子類中沒有內(nèi)存存放。,public class testoverload public static void main(String args) subclass subc1=new subclass(); subc1.superprint(); class superclass void superprint() System.
5、out.println(“super method”); class subclass extends superclass void superprint()/父類的superprint()被覆蓋,不存在了 System.out.println(“sub method”); ,this 與super,this 表示的是當(dāng)前對象的一個引用??梢岳斫鉃閷ο蟮牧硪粋€名字。 super 用于在一個類中引用它的父類,即引用父類的成員。注意super代表的是當(dāng)前類的直接父類,而不是它的祖先類。 B是C的直接父類 A是C的祖先類,public class testthisandsuper public s
6、tatic void main(String args) phonecard200 pc200=new phonecard200(123,111); System.out.println(“父類的值”+pc200.getbalance(); System.out.println(“本類的值”+pc200.get200balance(); class phonecard double balance=100; class phonecard200 extends phonecard long cardnum; long password; double balance=200; phonecar
7、d200(long cardnum,long password) this.cardnum=cardnum; this.password=password; double getbalance()return super.balance; double get200balance()return this.balance;,多態(tài),多態(tài)是由封裝和繼承所引出的另一面向?qū)ο蟪绦蛟O(shè)計的特征。 所謂多態(tài),一般是指一個程序中同名的不同方法共存的情況。 在面向過程程序設(shè)計中一個程序中不允許有同名的過程或函數(shù) 面向?qū)ο笤O(shè)計中卻利用這種重名提高程序的抽象度和簡潔度 多態(tài)的實(shí)現(xiàn)方式:方法的覆蓋 方法的重載和對象引
8、用的多態(tài),方法的覆蓋,前面已經(jīng)講過,通過子類重新定義從父類那里繼承的方法實(shí)現(xiàn)。 要實(shí)現(xiàn)覆蓋,子類和父類定義的方法名要完全一致,包括修飾符和參數(shù)列表。 如何區(qū)分同名的方法呢? 由于兩個方法處在不同的類中,因此調(diào)用時只要指明是哪個類的方法即可。父類的對象調(diào)用的是父類的方法,子類的對象調(diào)用的是子類的方法。,方法的重載,重載,是在一個類中定義同名字的方法的情況。 存在的必要性:完成某個操作時,可能會遇到不同的情況,需要定義不同的具體內(nèi)容。 例如:print方法有: public void print(); public void print(boolean x); public void print(
9、char x); public void print(int x); public void print(float x); public void print(String x); 如何區(qū)分?通過方法的參數(shù)列表區(qū)分,包括參數(shù)的個數(shù)、類型和順序的不同來區(qū)分。,對象引用的多態(tài),類似與強(qiáng)制類型轉(zhuǎn)換。子類的對象可以做父類對象來使用。 例如:單位里有職工(Employee),職工中有少數(shù)人是管理者(Manager),有個別是單位領(lǐng)導(dǎo)(Leader) 于是這三個類可以形成以下關(guān)系:,class Empolyeedouble salary; class Manager extends Empolyeedo
10、uble allowance; class Leader extends Manager Employee emp1=new Employee(); Employee emp2=new Manager();/emp2是Employee類型的變量 Employee emp3=new Leader(); emp2.salary emp2.allowance 父類變量可以讓一個子類的對象做父類對象可以做的事情。也就是說,通過父類的變量不能讓子類對象做父類對象不能做的事情,即使子類對象有這樣的功能。,如果父類變量實(shí)際指向子類對象,可以使用類似強(qiáng)制類型轉(zhuǎn)換,將父類變量轉(zhuǎn)換為子類變量 Manager mg
11、r=(Manager)em2p; emp2.allowance 下面的情況是錯的: Employee emp=new Employee() Manager mgr=(Manager)emp,在對象引用的多態(tài)中,如何確定某個變量是父類的對象,還是子類的對象呢? 可以使用關(guān)系運(yùn)算符instanceof 例:Employee emp=new Employee() emp instanceof Employee /結(jié)果為true emp instanceof Manager /結(jié)果為false Employee emp2=new Manager() emp instanceof Employee /結(jié)
12、果為false emp instanceof Manager /結(jié)果為true,構(gòu)造函數(shù)的重載,在一個類中,可以根據(jù)需要,定義多個構(gòu)造函數(shù)。當(dāng)然,它們的參數(shù)列表應(yīng)不同。系統(tǒng)會根據(jù)創(chuàng)建對象時給出的實(shí)參判斷應(yīng)該調(diào)用哪個構(gòu)造函數(shù)。 如果不構(gòu)造任何構(gòu)造函數(shù),系統(tǒng)會默認(rèn)構(gòu)造一個空構(gòu)造函數(shù),不執(zhí)行任何具體操作。,類 phonecard200可以定義以下構(gòu)造函數(shù): phonecard200() phonecard200(long cn) cardnum=cn; phonecard200(long cn,long pw) cardnum=cn; password=pw phonecard200(long cn
13、,long pw,double b) cardnum=cn; password=pw ; balance=b; 創(chuàng)建一個對象: phonecard200 pc200=new phonecard200(1234,1234),可以使用this簡化定義, this(參數(shù)列表) 必須在第一句 phonecard200() phonecard200(long cn) this(); cardnum=cn; phonecard200(long cn,long pw) this(cn); password=pw phonecard200(long cn,long pw,double b) this(cn,p
14、w); balance=b; 但是不能顯示調(diào)用其他的構(gòu)造函數(shù): phonecard200(long cn,long pw,double b) phonecard200(cn,pw); balance=b;,調(diào)用父類的構(gòu)造函數(shù),嚴(yán)格說,父類和子類間的構(gòu)造函數(shù)不存在繼承關(guān)系,但是它們卻存在一定的關(guān)系。 如果子類沒有定義任何構(gòu)造函數(shù),則創(chuàng)建子類對象時,調(diào)用父類無參數(shù)的構(gòu)造函數(shù) 如果子類定義了構(gòu)造函數(shù),則在創(chuàng)建子類對象時,系統(tǒng)將首先隱含執(zhí)行無參數(shù)的構(gòu)造函數(shù),然后在執(zhí)行子類自己的構(gòu)造函數(shù) 如果在子類自己定義的構(gòu)造函數(shù)中,利用super顯示調(diào)用父類構(gòu)造函數(shù),系統(tǒng)將不再隱含執(zhí)行父類的無參數(shù)構(gòu)造函數(shù)。,cla
15、ss phonecard double balance; phonecard() System.out.println(this is from super); class phonecard201 extends phonecard,class phonecard200 extends phonecard double additoryfee; phonecard200() System.out.println(this is from sub); class phonecard300 extends phonecard double additoryfee; phonecard300(do
16、uble additoryfee) this.additoryfee=additoryfee; System.out.println(this is from sub); ,public class myphone public static void main(String args) System.out.println(子類沒有定義構(gòu)造函數(shù)); phonecard201 pc201=new phonecard201(); System.out.println(子類定義了無參數(shù)的構(gòu)造函數(shù)); phonecard200 pc200=new phonecard200(); System.out
17、.println(子類定義了含參數(shù)的構(gòu)造函數(shù)); phonecard300 pc300=new phonecard300(0.5); ,請你編程驗(yàn)證,子類的構(gòu)造函數(shù)中用super用父類的含參數(shù)構(gòu)造函數(shù)時,系統(tǒng)是否調(diào)用父類無參數(shù)構(gòu)造函數(shù)。,注意:super的顯示調(diào)用語句必須在子類構(gòu)造函數(shù)的第一句可執(zhí)行語句。 例:class num_phonecard double balance; num_ phonecard (double b) balance=b; class phonecard200 extends num_phonecard long cardnum, password; phonec
18、ard200(long cn,long pw, double b) super(b); cardnum=cn;password=pw; ,如何為用戶自定義類設(shè)計構(gòu)造函數(shù),不定義構(gòu)造函數(shù); 根據(jù)情況定義有一定功能的構(gòu)造函數(shù),即初始化變量或?qū)?shù)據(jù)做合法性檢查 利用重載技術(shù),定義多個構(gòu)造函數(shù),實(shí)現(xiàn)多層次的對象初始化。如:phonecard200 如果存在類間繼承關(guān)系,可以利用super調(diào)用父類的構(gòu)造函數(shù)。,對象初始化過程,分為三步 當(dāng)為對象分配內(nèi)存空間后,首先將屬性單元初始化。賦默認(rèn)值 執(zhí)行顯示初始化。類定義時付的初值。如:int i=9; 執(zhí)行構(gòu)造函數(shù)中的初始化,public class test
19、init3public static void main(String args) Manager mgr=new Manager(“王欣”,200f); System.out.println(); System.out.println(mgr.salary); System.out.println(mgr.married); System.out.println(mgr.allowance); class Employee String name; float salary; boolean married; Employee() salary=500; ,class Man
20、ager extends Employee float allowance; String post=“Mgr”; Manager(String n,float aa) name=n; allowance=aal; ,首先,隱含初始化4個屬性,name=null, salary=0.0,married=false,allowance=0.0,然后,執(zhí)行顯示的初始化, post=“Mgr”; 最后執(zhí)行構(gòu)造函數(shù)的初始化,先調(diào)用父類無參數(shù)構(gòu)造函數(shù),對salary=500 再執(zhí)行Manager類自己的構(gòu)造函數(shù) name=“王欣”,allowance=200,包及其使用,java應(yīng)用開發(fā)過程中,會定義和
21、使用很多的類,如何管理這些類是一個必須解決的問題。 在操作系統(tǒng)中,系統(tǒng)采用目錄(文件夾)來組織和管理文件。在一個文件夾中文件不能重名,但是不同文件夾中的文件可以重名。 類似地,java也采用了這樣的管理方式。不過我們將文件夾稱為“包”package,不同類的屬性可以重名,不同包的類可以重名。利用包虎賁名字空間以避免類名沖突。 包是一種松散的類的集合,他們通常一起完成某個任務(wù)。 包有兩種:一種是無名字包,一種是有名字包 無名包:其他程序不能使用無名包中的類 有名包:文件第一句聲明:package 包名; 其他程序可以使用其中的類。包名.類名 包名通常使用小寫字母;url的逆序,包的創(chuàng)建,在jav
22、a源程序的第一句聲明包名,以下兩種格式: package 包名;或 package 包名1.包名2. 例package abc; package abc.test; 創(chuàng)建一個包abc 創(chuàng)建abc包中的包test 一個abc文件夾 abc文件夾的子文件夾test,package abc; public class myabc public static void main(String args) testpackage tp=new testpackage(); tp.pnt(); class testpackage void pnt() System.out.println(this mes
23、sage is from testpackage); ,package abc; public class t2 public static void main(String args) System.out.println(this is from t2); testpackage tp=new testpackage(); tp.pnt(); ,myabc testpackage t2同一個包的類, 所以是互相可見的,可以不用import直接引用,如何編譯運(yùn)行,手工方式 Java開發(fā)過程中,源文件和類文件應(yīng)該分開存放在不同的目錄中。以下都假設(shè)在f:javasrc中存放源文件myabc 自動
24、方式 在編譯的同時自動完成包的創(chuàng)建和類的加入,手工方式,編譯:f: javac javasrcmyabc.java或者f:javasrcjavac myabc.java 編譯生成myabc.class 和testpackage.class 根據(jù)文件要求通常在源文件所在目錄的上一級目錄中新建以包名命名的文件夾 abc 將生成的字節(jié)碼文件拷貝到包文件夾 abc 運(yùn)行java程序 java 包名.主類名 f: java abc.myabc,自動方式,用javac -d編譯 自動創(chuàng)建包的目錄并加載類 如:f:javasrc javac -d 包所在目錄 源文件名 例如: f:javasrc javac
25、 -d f: myabc.java 或f: javac d f: javasrcmyabc.java f: javac d . javasrcmyabc.java -d . 表示當(dāng)前目錄 運(yùn)行:f:java abc.myabc,包的使用,包的指定 在一個類中,可以使用包名.類名使用包中的類 引入所需要的類 import 包名.類名; 引入整個包 import 包名.*; 包的定位 系統(tǒng)如何尋找包? 通過設(shè)置環(huán)境變量classpath,可以采用命令行方式,set classpath=.;f:workspace; classpath 告知java解釋器類文件在哪里,接口 interface,接口是
26、用來實(shí)現(xiàn)類間多重繼承的結(jié)構(gòu)。 由于JAVA是單重繼承,隨著子類的增加,越處在下層的子類的間接父類就越多,所繼承的方法就越來越多,造成子類成員的膨脹和難以管理。 為了實(shí)現(xiàn)從其他父類中繼承某些的操作,引入接口,實(shí)現(xiàn)了多重繼承,但是又不會帶來多重繼承的內(nèi)存開銷大等缺點(diǎn)。 public class myplet extends Applet implements ActionListener,接口的基本概念 所謂接口,就是一系列常量和方法協(xié)議的集合,它提供了多個類共同行為的接口,但不限制每個類如何實(shí)現(xiàn)這些方法。 方法協(xié)議:是指只有方法名和參數(shù)列表,而沒有方法體的一種說明格式。他只體現(xiàn)方法的說明,但不指
27、定方法體,真正的方法體是類來實(shí)現(xiàn)的。,接口的聲明 public interface 接口名 extends 父接口名列表 /大括號里是接口體 publicstaticfinal 域類型 域名=常量值 public abstractnative返回類型 方法名(參數(shù)列表)throw 異常列表 修飾符 public 和缺省類型,缺省情況下具有包訪問性,public可以被其他任何代碼所使用。 接口有繼承性,可以繼承多個父接口,繼承父接口的所有屬性和方法。,接口體的定義 由兩部分組成,一部分是接口的屬性,即常量,一部分是接口的方法的聲明。 接口的常量默認(rèn)類型為public final static,不
28、寫修飾符也是同樣效果 接口的方法隱含類型為public abstract,接口中只能給出抽象方法的方法名、返回值和參數(shù)列表,不能定義方法體。接口的方法體可以用其他語言書寫,此時方法可以有native修飾符 例子 interface performdail publicfinalstatic double balance; publicabstract double getbalance( ); ,接口,接口,類,實(shí)現(xiàn),實(shí)現(xiàn),接口與類存在的本質(zhì)區(qū)別 類有成員變量和方法,而接口只有常量和方法協(xié)議。 接口的方法協(xié)議與方法實(shí)體之間只起到一種界面的作用,它限定了方法實(shí)體中的參數(shù)類型一定要與方法協(xié)議中規(guī)定
29、的參數(shù)類型保持一致,除此之外,還要求方法名,參數(shù)個數(shù)及方法返回類型的一致性。 類與接口之間并不存在子類和父類的繼承關(guān)系,一個類可以實(shí)現(xiàn)多個接口,實(shí)現(xiàn)接口:接口只是定義了一些抽象方法,如果不具體實(shí)現(xiàn)就沒有任何意義。實(shí)現(xiàn)接口:某個類為接口中的抽象法書寫方法體。注意: 類在聲明部分,必須用implements指明要實(shí)現(xiàn)的接口名 格式:class xx implements f1,f2 接口中的方法已默認(rèn)是public 修飾符,所以在實(shí)現(xiàn)時必須顯示地使用public修飾,否則將被警告縮小了接口中定義的方法的訪問控制范圍 類在實(shí)現(xiàn)接口中的方法時,必須使用完全相同的方法名(覆蓋) 如果一個類是非抽象類,則必須實(shí)現(xiàn)所有抽象方法,包括從父類繼承的抽象方法和實(shí)現(xiàn)自接口中的抽象方法。如果一個類是抽象類,則可以不實(shí)現(xiàn)接口中的抽象方法,interface adddemo public int add(int x, int y); interface subdemopublic int sub(int x, int y);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國三足式袋卸料離心機(jī)數(shù)據(jù)監(jiān)測研究報告
- 深度解析教育科技行業(yè)未來發(fā)展方向
- 教育機(jī)構(gòu)如何利用游戲化平臺提高教學(xué)效果
- 企業(yè)培訓(xùn)中多媒體技術(shù)的應(yīng)用與創(chuàng)新-以智慧教室為例
- 新版培訓(xùn)課件模板圖片
- 碧桂園張家港拓客內(nèi)部培訓(xùn)89
- 全民健身設(shè)施補(bǔ)短板工程實(shí)施方案在城市老舊小區(qū)健身設(shè)施改造中的應(yīng)用研究
- 全球鈾礦資源市場前景與2025年核能產(chǎn)業(yè)綠色低碳發(fā)展戰(zhàn)略報告
- 公交優(yōu)先戰(zhàn)略在2025年城市交通擁堵治理中的可持續(xù)發(fā)展報告
- Carpetimycin-B-生命科學(xué)試劑-MCE
- 板式換熱器、半容積式換熱器換熱器面積計算表(自動計算)
- 直流屏檢修作業(yè)指導(dǎo)書
- 冷鐓機(jī) 質(zhì)量要求技術(shù)條件
- 《全國統(tǒng)一安裝工程預(yù)算定額》工程量計算規(guī)則
- translated-NCCN臨床實(shí)踐指南:非小細(xì)胞肺癌(中文版2022.V5)
- GB/T 8312-2002茶咖啡堿測定
- 通信線路工程施工組織設(shè)計方案【實(shí)用文檔】doc
- 護(hù)士注冊健康體檢表下載【可直接打印版本】
- 預(yù)計財務(wù)報表編制及分析課件
- Q∕SY 1347-2010 石油化工蒸汽透平式壓縮機(jī)組節(jié)能監(jiān)測方法
- 西門子順序功能圖語言S7-Graph的應(yīng)用
評論
0/150
提交評論