版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第 6 章 繼承第 6 章繼承繼承是面象編程的重要特征之一。顧名思義,繼承就是在現(xiàn)有類的基礎上構建新類以滿足新的要求。在繼承過程中,新的類繼承原來的方法和實例變量,并且能添加自己的方法和實例變量。在本章中主要講解的內容包括派生類的創(chuàng)建使用、方法覆寫、抽象類的創(chuàng)建和使用、多態(tài)和動態(tài)綁定以及 Object 類。6.1派生類面象語言的一個重要特性就是繼承。繼承是指一些類,可以再進一步這些類的子類,而子類具有父類已經(jīng)擁有的一些方法和屬性,這跟現(xiàn)實中的父子關系是十分相似的,所以面象把這種機制稱為繼承,子類也稱為派生類。6.1.1繼承的使用繼承是在已有類的基礎上構建新的類。已有的類稱為超類、父類或基類,產(chǎn)
2、生的新類稱為子類或派生類。在動物種類中可以包括、大象和猴子等多種動物,這里通過這個為原型來學習繼承。例如,可以構建一個 Animal 類,如下所示。在 Animal 類中,有種類、名字、體重這些實例變量描述動物,以及呼吸、吃飯、睡覺這些方法表示動物的動作。下面在 Animal 的基礎上構建一個類 Tiger 來表示。101 /Tiger 類繼承 Animal 類 class Tiger extends Animal String tigerType;String from; void tigerRun()System.out.pr ln(the tiger run);class AnimalS
3、tring type;/種類String name;/名字age;/weight;/體重void eat()/吃飯方法System.out.pr ln(anmal eat);void breath()/呼吸方法 System.out.pr ln(animal breath);void sleep()/睡覺方法 System.out.pr ln(animal sleep);Java 從入門到精通注意 Tiger 類的第一行class Tiger extends Animal,表示Tiger 類繼承自 Animal 類。通過繼承,新生成的類不僅繼承了 Animal 類的所有實例變量和方法,還有自己
4、的獨有的字段tigerType、from 和方法 tigerRun。Tiger 類的使用如下所示。可以看到 Tiger 類繼承了Animal 類的所有屬性和方法,并有自己特有的屬性和方法。程序的運行結果如下。102 Animal 屬性:種類=Tiger Animal 屬性:名字=huhu Animal 屬性: 12Animal 屬性:體重 120Tiger 屬性:種類=東北虎 Tiger 屬性:產(chǎn)地=長白山 Animal 方法:呼吸animal breath Animal 方法:吃飯 anmal eatAnimal 方法:睡覺animal sleep Tiger 方法:奔跑 the tiger
5、 runpublic class TigerDemo public s ic void main(String args ) /構建一個Tiger 對象Tiger tiger = new Tiger();/對 tiger 的屬性進行賦值 tiger.type = Tiger; =huhu; tiger.age=12; tiger.weight=120; tiger.tigerType=東北虎; tiger.from=長白山;/打印出屬性值System.out.pr ln(Animal 屬性:種類=+tiger.type); System.out.pr ln(Animal 屬
6、性:名字=+); System.out.pr ln(Animal 屬性: +tiger.age); System.out.pr ln(Animal 屬性:體重+tiger.weight); System.out.pr ln(Tiger 屬性:種類=+tiger.tigerType); System.out.pr ln(Tiger 屬性:產(chǎn)地=+tiger.from);/使用 tiger 調用方法System.out.pr ln(Animal 方法:呼吸); tiger.breath();System.out.pr ln(Animal 方法:吃飯); tiger.eat();
7、System.out.pr ln(Animal 方法:睡覺); tiger.sleep();System.out.pr ln(Tiger 方法:奔跑); tiger.tigerRun();第 6 章 繼承6.1.2子類對象的構建在上一章中已經(jīng)學習了如何創(chuàng)建類的對象。繼承也是對類進行操作。既然繼承可以這么方便的使用,子類對象的創(chuàng)建過程是怎么樣的呢?調用默認構造函數(shù)。示例如下。是從最頂層的基類開始往下一層層的程序的運行結果如下。在程序中定義了 3 個類A、B、C,其中 B 繼承自 A,C 繼承自B,當創(chuàng)建一個 C 類的對象時候,會自動調用父類的無參構造函數(shù)。如果想調用父類的有參構造函數(shù),需要使用
8、super關鍵字,調用父類的構造函數(shù)的語句要放在所在方法的第一個語句中。修改上面的程序如下。103 class A A()/A 類的無參構造器System.out.pr ln(調用A 的構造函數(shù));A(i) /A 類的有參構造器System.out.pr ln(調用A 的有參構造函數(shù));class B extends A /讓 B 類繼承A 類B() /B 類的無參構造器System.out.pr ln(調用B 的構造函數(shù));調用A 的構造函數(shù)調用B 的構造函數(shù)調用C 的構造函數(shù)class A A() System.out.pr ln(調用A 的構造函數(shù));/類B 繼承Aclass B ext
9、ends A B() System.out.pr ln(調用B 的構造函數(shù));/C 繼承Bclass C extends B C() System.out.pr ln(調用C 的構造函數(shù));/通過該類演示對象的構造過程 public class CallConstructor public s ic void main(String args) C c = new C();Java 從入門到精通給每個類都加上有參數(shù)的構造函數(shù),在有參數(shù)的構造函數(shù)中,通過 super 關鍵字調用其父類構造函數(shù)。在 CallConstructor 中構建兩個不同的對象,通過程序的輸出可以看出這兩個對象的構建過程。程
10、序的執(zhí)行結果如下。在 C+中,一個類是可以有多個父類的,這樣會使語言變的非常復雜,而且多重繼承不是必須的。Java 改進了C+的這一點,不支持多繼承,一個類的直接父類只能有一個。6.1.3方法的覆寫方法覆寫(overload)與方法的重載非常相似,它在 Java 的繼承中也有很重要的應用。寫程序可能會碰到下面的情況,在父類中已經(jīng)實現(xiàn)的方法可能不夠精確,不能滿足子類的需求。例如面的Animal 類中,breath 方法就過于簡單,對于魚類動物是用腮呼吸的,而對于哺乳動物則是用肺呼吸的,如何實現(xiàn)呢,Java 提供的方法覆寫就是解決這方面的問題。在下面的程序中首先定義了一個父類 Animal,然后定
11、義 Animal 的 3 個子類 Tiger、Fish和 Dog,在父類中提供了 3 個方法 eat、breath、sleep,在兩個子類 Tiger 和 Fish 中重新定義了 breath 方法,在 Dog 類中什么都沒做。在 OverloadDemo 中,創(chuàng)建了一個 Fish 對象、一個Tiger 對象和一個 Dog 對象,分別調用 breath 方法。104 class Animal String type;/種類調用A 的構造函數(shù)調用B 的構造函數(shù)調用C 的構造函數(shù)調用A 的有參構造函數(shù)調用B 的有參構造函數(shù)調用C 的有參構造函數(shù)/B 類的有參構造器super(5);/調用父類的有參
12、構造器 System.out.pr ln(調用 B 的有參構造函數(shù));class C extends B /讓 C 類繼承B 類C() /C 類無參構造器System.out.pr ln(調用 C 的構造函數(shù));C(i)/C 類的有參構造器super(5);/調用父類也就是 B 類的有慘構造器System.out.pr ln(調用 C 的有參構造函數(shù));public class CallConstructor2 public s ic void main(String args) C c = new C();/創(chuàng)建C 類對象C c0=new C(5);/創(chuàng)建C 類的具有參數(shù)對象第 6 章繼承程
13、序的運行結果如下。105 是用肺呼吸的String name;/名稱age;/nt weight;/體重void eat() /吃飯方法System.out.pr ln(動物愛吃飯);void breath() /呼吸方法System.out.pr ln(動物呼吸);void sleep() /睡覺方法System.out.pr ln(動物在睡覺);/Tiger 類繼承 Animal 類class Tiger extends Animal String tigerType;/種類String from;/定義獨有變量/Tiger 自己的方法void tigerRun() 的奔跑方法System
14、.out.pr ln(在奔跑);void breath()/繼承來的呼吸方法 System.out.pr ln(是用肺呼吸的);/Fish 繼承 Animal 類class Fish extends Animal String fishType;/Fish 自己的方法void swim()System.out.pr ln(魚在游泳);void breath()System.out.pr ln(魚是用腮呼吸的);class Dog extends Animalpublic class OverloadDemopublic s ic void main(String args) 三個不同的對象 T
15、iger tiger=new Tiger(); Fish fish=new Fish(); Dog dog=new Dog();/都調用 breath 方法 tiger.breath(); fish.breath(); dog.breath();Java 從入門到精通方法被覆寫后如果又需要調用,可以使用 super 關鍵字來實現(xiàn),示例如下。在 Animal 的子類 Tiger 中,在 breath 方法中,使用語句 super.breath();調用父類的 breath方法。程序的運行結果如下。super 關鍵字主要有以下兩個用途。在子類構造函數(shù)中調用父類構造函數(shù)。在子類中調用父類的方法。6.
16、1.4多態(tài)與動態(tài)綁定多態(tài)是面象語言的又一重要特性。多態(tài)是指同一個方法根據(jù)上下文使用不同的定義的能力。從這一點看,上一節(jié)講的方法覆寫以及前面的方法重載都可被看做是多態(tài)。但是 Java的多態(tài)的是跟動態(tài)綁定放在一起理解的。動態(tài)綁定是一種機制,通過這種機制,對一個已經(jīng)被重寫的方法的調用將會發(fā)生在運行時,而不是在編譯時。下面的程序演示了動態(tài)綁定,定義父類 Animal 和子類 Tiger 以及106 動物呼吸是用肺呼吸的class Animal String type; String name;age; weight;void eat() System.out.pr ln(動物愛吃飯);void bre
17、ath() System.out.pr ln(動物呼吸);class Tiger extends Animal String tigerType; String from;void breath()/通過 super 關鍵字調用父類的 breath 方法super.breath();/調用動物類的呼吸方法 System.out.pr ln(是用肺呼吸的);public clasperDemopublic s ic void main(String args ) Tiger tiger=new Tiger(); tiger.breath();魚是用腮呼吸的動物呼吸第 6 章繼承Fish 如下。演
18、示程序如下。程序定義一個存放 Animal 對象的數(shù)組,animal 數(shù)組的 3 個元素分別存放一個 Animal 對象、一個 Tiger 對象、一個 Fish 對象,然后對這 3 個對象調用 breath 方法。程序的執(zhí)行結果如下。107 public class DynamicMethodDemopublic s ic void main(String args )Animal animal=new Animal3;/創(chuàng)建不同的對象,但是都存入 Animal 的中animal0=new Animal(); animal1=new Tiger(); animal2=new Fish(); a
19、nimal0.breath();animal1.breath();animal2.breath();class Animal String type; String name;age; weight;void eat() System.out.pr ln(動物愛吃飯);void breath() System.out.pr ln(動物呼吸);void sleep() System.out.pr ln(動物在睡覺);class Tiger extends Animal String tigerType; String from;void tigerRun() System.out.pr ln(在
20、奔跑);void breath()System.out.pr ln(是用肺呼吸的);class Fish extends Animal String fishType;void swim()System.out.pr ln(魚在游泳);void breath()System.out.pr ln(魚是用腮呼吸的);Java 從入門到精通在 Java 中,對象是多態(tài)的,定義一個 Animal 對象,它既可以存放 Animal 對象,也可以存放 Animal 的子類 Tiger、Fish 的對象。存放在 Animal 數(shù)組中的 Tiger 對象和 Fish 對象在執(zhí)行breath 方法時會自動地調用
21、原來對象的方法而不是 Animal 的 breath 方法,這就是動態(tài)綁定。需要注意一點的是,通過數(shù)組元素方法的時候只能在 Animal 中定義的方法,對于 Tiger 類和 Fish 中定義的方法時卻不能調用,例如語句 animal2.swim();就是不正確的。當需要這些方法時需要用到類型轉換,演示程序如下。主要看 move 方法,move 方法首先判斷 animal 對象是哪個類的對象,由判斷執(zhí)行不同的方法。在判斷過程使用了 instanceof 運算符,它是用來判斷對象類型的一個運算符。當判斷出它的類型之后,再對其進行類型轉換,得到原始類型后就可以調用它的類所特有的方法了。程序的運行結
22、果如下。6.1.5final 關鍵字編寫程序時可能需要把類定義為不能繼承的,即最終類,或者是有的方法不希望被子類繼承,這時候就需要使用 final 關鍵字來。把類或方法為 final 類或 final 方法的方法很簡單,在類前面加上 final 關鍵字即可。108 final class 類名 extends 父類/類體動物在睡覺在奔跑魚在游泳public class DynamicMethodDemo2 public s ic void main(String args )Animal animal=new Animal3; animal0=new Animal(); animal1=new
23、 Tiger(); animal2=new Fish();DynamicMethodDemo2 dm=new DynamicMethodDemo2(); dm.move(animal0);dm.move(animal1);dm.move(animal2);void move(Animal animal)/進行對象類型的判斷 if(animal instanceof Tiger)(Tiger)animal).tigerRun(); else if(animal instanceof Fish) (Fish)animal).swim();else animal.sleep();動物呼吸是用肺呼吸的
24、魚是用腮呼吸的第 6 章 繼承方法也可以被為 final 的,形式如下。例如:需要注意的是,實例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 的類的方法自動地被為 final,但是它的實例變量并不是 final。6.2抽象類抽象類是指在類中定義方法,但是并不去實現(xiàn)它,而在它的子類中去具體的實現(xiàn)。定義的抽象方法不過是一個方法占位符。繼承抽象類的子類必須實現(xiàn)父類的抽象方法,除非子類也被定義成一個抽象類。6.2.1抽象類的定義對抽象類有了基本了解后,就來看一下如何定義抽象類。定義抽象類是通過 abstract 關鍵字實現(xiàn)的。抽象類的一般形式如下。抽象方
25、法的定義形式如下。修飾符 abstract 返回值類型 方法名();注意:在抽象類中的方法不一定是抽象方法,但是含有抽象方法的類必須被定義成抽象類。這里利用抽象類的方法對前面的 Animal、Tiger、Fish 類重新定義。109 /抽象類的abstract class Animal String type; String name;age; weight;void eat() System.out.pr ln(動物愛吃飯);abstract void breath(); void sleep() System.out.pr ln(動物在睡覺);修飾符 abstract 類名/類體publi
26、c final void run()/方法體修飾符 final 返回值類型 方法名()/方法體Java 從入門到精通程序把 Animal 定義為抽象類,里面的 breath 方法被定義為抽象方法,而后面定義的Animal 的子類 Tiger 和 Fish 都實現(xiàn)了breath 方法。6.2.2抽象類的使用定義完抽象類后,就可以使用它。但是抽象類和普通類不同,抽象類不可以實例化,如語句 Animal animal =new Animal();是無法通過編譯的,但是可以創(chuàng)建抽象類的對象變量,只是這個變量只能用來指向它的非抽象子類對象。示例如下。程序中定義了兩個 Animal 對象變量,一個存放 F
27、ish 對象,另一個存放 Tiger 對象,分別調用這兩個對象的breath 方法。由于根本不可能構建出 Animal 對象,所以存放的對象仍然是 Tiger 對象,它會動態(tài)綁定正確的方法進行調用。需要注意的是,盡管 animal 存放的是 Tiger 對象或是 Fish 對象,但是不能直接調用這些子類的方法,語句 animal.swim;和 animal2.tigerRun();都是不正確的。調用這項方法的時候仍然需要進行類型轉換,正確的使用方法如下。110 (Fish) animal1).swim(); (Tiger) animal2).tigerRun();public claseAbs
28、tractpublic s ic void main(String args)Animal animal1=new Fish(); animal1.breath();Animal animal2=new Tiger(); animal2.breath();/Tiger 繼承抽象類 Animal class Tiger extends Animal String tigerType; String from;void tigerRun() System.out.pr ln(在奔跑);void breath() System.out.pr ln(是用肺呼吸的);class Fish extends
29、 Animal String fishType;void swim() System.out.pr ln(魚在游泳);void breath() System.out.pr ln(魚是用腮呼吸的);第 6 章 繼承6.3Object 類Java 中存在一個非常特殊的類Object 類,它是所有類的祖先類。在 Java 中如果定義了一個類并沒有繼承任何類,那么它默認繼承 Object 類。而如果它繼承了一個類,則它的父類,甚至父類的父類必然是繼承自 Object 類,所以說任何類都是 Object 類的子類。6.3.1Object 對象由于 Object 類的特殊性,所以在實際開發(fā)中,經(jīng)常會使用
30、到它。在本節(jié)中就來簡單地介紹一下如何使用 Object 類和如何使用類中的兩個重要方法。定義一個 Object 對象,根據(jù)前面繼承的知識,它可以存放任何類型,示例如下。示例中用到的 Animal 類、Fish 類和 Tiger 類都在上一節(jié)中定義過了。可以把 3 個不同的對象放進 Object 數(shù)組中,但是放進去后對象的類型被丟棄了,取出后要進行類型轉換。當然類型轉換不像程序中這么簡單,可能要使用到類型判斷,即用 instanceof 運算符實現(xiàn)。6.3.2equals 方法和 toString 方法在 Object 類中也定義了一系列的方法,讀者可以閱讀 API 自己查看。其中比較重要的兩個
31、方法就是 equals()方法和 toString()方法。在 Object 類中equals 方法的定義形式如下。當且僅當兩個對象指向同一個對象的時候才會返回真值。程序要想進行詳細的判斷,必須自己進行 equals 方法的覆寫。面的內容中,介紹了 String 類 equals 方法的實現(xiàn)。111 publicequals(Object anObject) publicequals(Object obj) return (this = obj);public class Testpublic s ic void main(String args)/創(chuàng)建一個存放 Object 數(shù)據(jù)的數(shù)組 Ob
32、ject object=new Object3; Animal animal1 = new Fish(); Animal animal2 = new Tiger();/將上邊創(chuàng)建的對象存數(shù) Object 數(shù)組 object0=animal1; object1=animal2;object2=new String(String);/取出對象后需要進行類型轉換才能調用相應類型的方法 (Fish) object0).swim();Java 從入門到精通程序首先判斷兩個對象是否指向同一個對象,如果是的話當然返回 true,如果不是繼續(xù)判斷提供的對象是否是 String 類型,如果不是的話返回 fals
33、e,是的話再進一步判斷;取出兩個 String 類的每一個位置的字符進行判斷,如果有一個不等則返回 false。其實這是 equals 方法,這里模仿 String 的 equals 方法的實現(xiàn)提供一個 Animal 的 equals方法,其實這是一種比較標準的equals 方法編寫方式。編寫測試類如下。112 public class Testequals public s ic void main(String args) 三個對象Animal animal1 = new Fish(); Animal animal2 = new Tiger(); Animal animal3=new Fi
34、sh();/對對象屬性賦值 animal1.age=12; =dingding; animal1.type=dog; animal1.weight=12; animal2.age=12;publicequals(Object ob) bool = false;if (this = ob)bool= true; if (ob = null)bool= false;if (ob instanceof Animal) bool= (Animal) ob).age = this.age& (Animal) ob).name = & (Animal) ob).
35、type = this.type& (Animal) ob).weight = this.weight;return bool;if (this = anObject) return true;if (anObject instanceof String) String anotherString = (String)anObject; n = count;if (n = anotherString.count) char v1 = value;char v2 = anotherString.value; i = offset;j = anotherString.offset; while (n- != 0) if (v1i+ != v2j+) return false;return true;retu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年消防工程消防安全隱患排查與整改承接合同范本3篇
- 酒店設施融資租賃轉租賃協(xié)議
- 2025年度KTV特色主題裝飾設計制作合同3篇
- 古鎮(zhèn)區(qū)二手房交易協(xié)議
- 知識更新基金管理辦法
- 商務接待商務車租賃協(xié)議
- 2025版購貓合同:貓咪健康養(yǎng)護與領養(yǎng)指南3篇
- 智能醫(yī)療信息系統(tǒng)安裝協(xié)議
- 社區(qū)服務點管理原則
- 旅游景點建筑合同
- DZ∕T 0272-2015 礦產(chǎn)資源綜合利用技術指標及其計算方法(正式版)
- 生物入侵與生物安全智慧樹知到期末考試答案章節(jié)答案2024年浙江農(nóng)林大學
- 《公路工程集料試驗規(guī)程》JTG-3432-2024考核試題及答案文檔
- 常見的排序算法-冒泡排序 課件 2023-2024學年浙教版(2019)高中信息技術選修1
- 中學教師基本功培訓講座
- 糖尿病視網(wǎng)膜病變臨床診療指南(2022)解讀
- IQC來料檢驗單范本
- (正式版)YBT 6171-2024 鋼鐵企業(yè)鏈篦機-回轉窯球團工藝煙氣脫硝技術規(guī)范
- 2021-2022學年遼寧省大連市沙河口區(qū)中心小學部編版五年級上冊期末教學質量監(jiān)測語文試卷(原卷版)
- 育兒知識大全課件
- 《大學生心理健康教育》(第四版)知識點 第一章 心理健康:幸福人生的保障
評論
0/150
提交評論