2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、rich.javapublic class TestOstrich { public static void main(String[] args) { Bird ostrich1 =new Ostrich(); //向上轉型 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!");}}輸出結果:Bird Flying!,Static方法不能重寫,Bird類派生了鴕鳥Ostrich類 ,以上程序聲明了一個Bird類型的鴕鳥對象,象基本類型數(shù)據(jù)的

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

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

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

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

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

10、7 TestEquals.java,4.7多態(tài),4.7.1向上轉型(upcasting)4.7.2動態(tài)綁定4.7.3構造器中多態(tài)方法的行為4.7.4向下轉型,4.7多態(tài),多態(tài)是和繼承密切相關的,正因為有繼承,才會有多態(tài)出現(xiàn)。多態(tài)從字面上的意思應該是多種形態(tài)。更進一步,延伸到繼承里來,那么多態(tài)就應該是具有相同的操作不同的行為的一種特征。,4.7.1向上轉型(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向上轉型(upcasting),在start()方法中,通過傳入的參數(shù)類型不同,表現(xiàn)出來的行為也會不同。但是傳入后的參數(shù)都統(tǒng)一轉型為Shape這個基類型,這里就表現(xiàn)為向上轉型。 由導出類到基類,從繼承圖上面我們可以看出是向上移動的,因此我們一般稱之為“向上轉型”。向上轉型是從

14、一個較具體的類型轉換為一個較抽象的類型的過程,所以說是安全的。在導出類中至少包含了基類的方法。在向上轉型的過程中,由于在導出類中可能含有基類中沒有的方法。類接口會丟失一些方法,4.7.2動態(tài)綁定,將一個方法調用同一個方法主體關聯(lián)起來被稱之為綁定,若在程序執(zhí)行前綁定就被稱為前期綁定。 后期綁定也被稱為動態(tài)綁定,編譯器始終都不會知道對象的類型,只有當方法在運行期間被調用時方法的調用機制就能找到正確的方法體。,4.7.3構造器中多態(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);} },最后的輸出結果是:this is a shapedraw Circle0draw Circle100 不是我們希望的結果。,4.7.3構造器中多態(tài)方法的行為,I、在其他任何事物發(fā)生之前,將分配

18、給對象的存儲空間初始化為二進制的零。II、如前所述的那樣調用基類構造器。因此我們會發(fā)現(xiàn),雖然在基類的構造器中調用了其子類的draw方法,而里面的i值還并沒有被初始化,但由于步驟1的原因,i的值被置為0。III、按照聲明順序調用成員的初始化方法。IV、調用子類的構造器主體。,4.7.4向下轉型,由于向上轉型會丟失一些具體的類型的信息,因此我們考慮用向下轉型的方式,也就是和向下轉型相反的方向轉型。,4.7.4向下轉型,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();//向下轉型 (C)a2.h();//異常 }},4.7.4向下轉型,類B、類C和類D有共同的父類 。類D和基類A看作是一種純粹的“is-a”的關系 。類B和類C中我們對基類進行了擴展,類B、C和A是is-like-a的關系。將他們向上轉型后,他們特有的方法和屬性就會丟失,

溫馨提示

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

評論

0/150

提交評論