第四章繼承和多態(tài)-計(jì)算機(jī)系主頁(yè)_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第四章 繼承和多態(tài),,繼承和多態(tài),4.1繼承基礎(chǔ)4.2構(gòu)造器的調(diào)用順序4.3 繼承還是組合?4.4 Object類4.5 toString方法4.6 對(duì)象的比較,4.1繼承基礎(chǔ),類與類之間還有一種父與子的關(guān)系,子類繼承父類方法與屬性,這個(gè)我們就稱之為繼承 子類擁有父類的一些公有的屬性和方法,并且子類可能也會(huì)有自己的方法和屬性 除了添加父類中沒有的新方法外子類還可以通過重寫父類的方法來重定義自己的行為方式,繼承基礎(chǔ),重寫與重

2、載不同,重載需要不同的參數(shù)來區(qū)別相同方法名的方法,重寫是發(fā)生在子類與父類上,重寫父類方法必須與父類的方法名同名同參并且同返回值 。當(dāng)訪問修飾符為private時(shí),表明該方法不能被重寫,同樣當(dāng)方法具有final關(guān)鍵字時(shí)該方法不能被重寫 。子類雖然重寫了父類的某個(gè)方法,但仍然需要用到父類的這個(gè)方法,這時(shí)使用super關(guān)鍵字仍然可以調(diào)用父類的方法 。程序4.1 TestExtends.java示例繼承機(jī)制,,程序4.2 TestOst

3、rich.javapublic class TestOstrich { public static void main(String[] args) { Bird ostrich1 =new Ostrich(); //向上轉(zhuǎn)型 ostrich1.fly(); }}class Bird {public static void fly(){System.out.println(&quo

4、t;Bird Flying!");}}class Ostrich extends Bird{public static void fly(){System.out.println("I can't fly!");}}輸出結(jié)果:Bird Flying!,Static方法不能重寫,Bird類派生了鴕鳥Ostrich類 ,以上程序聲明了一個(gè)Bird類型的鴕鳥對(duì)象,象基本類型數(shù)據(jù)的

5、自動(dòng)提升一樣,鴕鳥自動(dòng)提升為Bird類,這叫做向上轉(zhuǎn)型。 static方法是不會(huì)被重寫如TestOstrich.java所示:子類中定義了與父類同名的fly方法,父類的fly方法不會(huì)被重寫,而是被遮蔽因此得出結(jié)果鴕鳥會(huì)飛!,4.2構(gòu)造器的調(diào)用順序,子類在產(chǎn)生對(duì)象實(shí)例時(shí)首先會(huì)調(diào)用父類的構(gòu)造方法,如果沒有顯示的指定調(diào)用父類自定義的構(gòu)造方法,那么編譯器會(huì)調(diào)用默認(rèn)的父類構(gòu)造方法:super()。但是父類如果自定義了帶參數(shù)的構(gòu)造方法,就必須

6、在子類的構(gòu)造方法中指定調(diào)用它,否則會(huì)因找不到super()而報(bào)錯(cuò)。注意,如果需要顯示的調(diào)用父類構(gòu)造方法,必須將其寫在構(gòu)造方法里的第一行 。接著按聲明的順序調(diào)用成員初始化。最后調(diào)用本構(gòu)造方法的方法體 例:程序4.3 TestInheritanceConstructor.java,4.3 繼承還是組合?,判斷繼承關(guān)系的一條定律是看它是否符合is-a的定義 繼承打破了類的封裝子類繼承了父類的成員就意味著父類成員有所改變時(shí)子類必須隨之

7、變化,這削弱了子類的獨(dú)立性,增加了軟件維護(hù)的難度。繼承的層次不宜過多,設(shè)計(jì)時(shí)良好的繼承體系應(yīng)該保持在三層以內(nèi)。我們復(fù)用類時(shí)的指導(dǎo)原則是優(yōu)先選擇組合,例子:程序4.4 CallOffNumbers.java,4.4 Object類,Java中所有的類都是繼承自一個(gè)老祖宗,Object類,它們都是Object類的子類。如果一個(gè)類在聲明時(shí)沒有用extends關(guān)鍵字顯式的指定繼承自某個(gè)基類,則Java隱式的指定它的默認(rèn)基類為Object類。

8、這種強(qiáng)制的繼承模式叫做單根繼承模式。單根繼承使得Java簡(jiǎn)化了許多操作,基于單根繼承,所有的對(duì)象都可以像基本數(shù)據(jù)類型一樣向上轉(zhuǎn)型到根層次上而使其操作上一視同仁 單根繼承的優(yōu)勢(shì)還在于可以在Object類定義所有對(duì)象都通用的方法,所有類都會(huì)自動(dòng)繼承這些方法,4.5 toString方法,Object類定義了 public String toString()方法,返回值是String類型,每當(dāng)個(gè)對(duì)象都會(huì)有個(gè)toString方法,作用就是描

9、述對(duì)象的信息要想使用toString方法必須按自己的需求重寫這個(gè)方法,例子:程序4.6 TestToString.java,4.6 對(duì)象的比較,Java中比較兩個(gè)基本數(shù)據(jù)類型變量的值時(shí)很簡(jiǎn)單使用“==”操作符 Object類中的equals方法提供了對(duì)象內(nèi)容的比較方法同樣我們要是用這個(gè)方法必須重寫它 如果不重寫equals方法,將調(diào)用object類的eaquals方法。Object類的equals方法相當(dāng)于“==”例:程序4.

10、7 TestEquals.java,4.7多態(tài),4.7.1向上轉(zhuǎn)型(upcasting)4.7.2動(dòng)態(tài)綁定4.7.3構(gòu)造器中多態(tài)方法的行為4.7.4向下轉(zhuǎn)型,4.7多態(tài),多態(tài)是和繼承密切相關(guān)的,正因?yàn)橛欣^承,才會(huì)有多態(tài)出現(xiàn)。多態(tài)從字面上的意思應(yīng)該是多種形態(tài)。更進(jìn)一步,延伸到繼承里來,那么多態(tài)就應(yīng)該是具有相同的操作不同的行為的一種特征。,4.7.1向上轉(zhuǎn)型(upcasting),public class Shap

11、e{  void draw(){}  static void start(Shape s){   s.draw();  }  public static void main(String [] agrs){   start(new&#

12、160;Circle());   start(new Square());  }}class Circle extends Shape{  void draw(){System.out.println(“draw Circle”);} }class Square extends Sh

13、ape{  void draw(){System.out.println(“draw Square”);} },4.7.1向上轉(zhuǎn)型(upcasting),在start()方法中,通過傳入的參數(shù)類型不同,表現(xiàn)出來的行為也會(huì)不同。但是傳入后的參數(shù)都統(tǒng)一轉(zhuǎn)型為Shape這個(gè)基類型,這里就表現(xiàn)為向上轉(zhuǎn)型。 由導(dǎo)出類到基類,從繼承圖上面我們可以看出是向上移動(dòng)的,因此我們一般稱之為“向上轉(zhuǎn)型”。向上轉(zhuǎn)型是從

14、一個(gè)較具體的類型轉(zhuǎn)換為一個(gè)較抽象的類型的過程,所以說是安全的。在導(dǎo)出類中至少包含了基類的方法。在向上轉(zhuǎn)型的過程中,由于在導(dǎo)出類中可能含有基類中沒有的方法。類接口會(huì)丟失一些方法,4.7.2動(dòng)態(tài)綁定,將一個(gè)方法調(diào)用同一個(gè)方法主體關(guān)聯(lián)起來被稱之為綁定,若在程序執(zhí)行前綁定就被稱為前期綁定。 后期綁定也被稱為動(dòng)態(tài)綁定,編譯器始終都不會(huì)知道對(duì)象的類型,只有當(dāng)方法在運(yùn)行期間被調(diào)用時(shí)方法的調(diào)用機(jī)制就能找到正確的方法體。,4.7.3構(gòu)造器中多態(tài)方法的行

15、為,public class Shape3{  Shape3(){   System.out.println(“this is a shape”);   draw();  }  void draw(){}  public static v

16、oid main(String [] agrs){   Shape3 circle = new Circle();  }}class Circle extends Shape3{  int i = 100;  Circle(){

17、    draw();  }  void draw(){System.out.println(“draw Circle” + i);} },最后的輸出結(jié)果是:this is a shapedraw Circle0draw Circle100 不是我們希望的結(jié)果。,4.7.3構(gòu)造器中多態(tài)方法的行為,I、在其他任何事物發(fā)生之前,將分配

18、給對(duì)象的存儲(chǔ)空間初始化為二進(jìn)制的零。II、如前所述的那樣調(diào)用基類構(gòu)造器。因此我們會(huì)發(fā)現(xiàn),雖然在基類的構(gòu)造器中調(diào)用了其子類的draw方法,而里面的i值還并沒有被初始化,但由于步驟1的原因,i的值被置為0。III、按照聲明順序調(diào)用成員的初始化方法。IV、調(diào)用子類的構(gòu)造器主體。,4.7.4向下轉(zhuǎn)型,由于向上轉(zhuǎn)型會(huì)丟失一些具體的類型的信息,因此我們考慮用向下轉(zhuǎn)型的方式,也就是和向下轉(zhuǎn)型相反的方向轉(zhuǎn)型。,4.7.4向下轉(zhuǎn)型,class A

19、{ public void f() {}; public void g() {}; }class B extends A{ public void f() {}; public void g() {}; public void h() {}; }class C extends A{ public void f() {}; public void g() {}; p

20、ublic void u() {};}class D extends A{ public void f() {}; public void g() {}; },public class testRtti { public static void main(String[] args) { A a1 = new A(); A a2 = new B(); A a3 = new C

21、(); a1.f(); a2.g(); a3.g(); //a2.h(); (B)a2.h();//向下轉(zhuǎn)型 (C)a2.h();//異常 }},4.7.4向下轉(zhuǎn)型,類B、類C和類D有共同的父類 。類D和基類A看作是一種純粹的“is-a”的關(guān)系 。類B和類C中我們對(duì)基類進(jìn)行了擴(kuò)展,類B、C和A是is-like-a的關(guān)系。將他們向上轉(zhuǎn)型后,他們特有的方法和屬性就會(huì)丟失,

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論