java從入門到精通第6章_第1頁
java從入門到精通第6章_第2頁
java從入門到精通第6章_第3頁
java從入門到精通第6章_第4頁
java從入門到精通第6章_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第 6 章 繼承第 6 章繼承繼承是面象編程的重要特征之一。顧名思義,繼承就是在現(xiàn)有類的基礎(chǔ)上構(gòu)建新類以滿足新的要求。在繼承過程中,新的類繼承原來的方法和實(shí)例變量,并且能添加自己的方法和實(shí)例變量。在本章中主要講解的內(nèi)容包括派生類的創(chuàng)建使用、方法覆寫、抽象類的創(chuàng)建和使用、多態(tài)和動態(tài)綁定以及 Object 類。6.1派生類面象語言的一個(gè)重要特性就是繼承。繼承是指一些類,可以再進(jìn)一步這些類的子類,而子類具有父類已經(jīng)擁有的一些方法和屬性,這跟現(xiàn)實(shí)中的父子關(guān)系是十分相似的,所以面象把這種機(jī)制稱為繼承,子類也稱為派生類。6.1.1繼承的使用繼承是在已有類的基礎(chǔ)上構(gòu)建新的類。已有的類稱為超類、父類或基類,產(chǎn)

2、生的新類稱為子類或派生類。在動物種類中可以包括、大象和猴子等多種動物,這里通過這個(gè)為原型來學(xué)習(xí)繼承。例如,可以構(gòu)建一個(gè) Animal 類,如下所示。在 Animal 類中,有種類、名字、體重這些實(shí)例變量描述動物,以及呼吸、吃飯、睡覺這些方法表示動物的動作。下面在 Animal 的基礎(chǔ)上構(gòu)建一個(gè)類 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 類的所有實(shí)例變量和方法,還有自己

4、的獨(dú)有的字段tigerType、from 和方法 tigerRun。Tiger 類的使用如下所示??梢钥吹?Tiger 類繼承了Animal 類的所有屬性和方法,并有自己特有的屬性和方法。程序的運(yùn)行結(jié)果如下。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 ) /構(gòu)建一個(gè)Tiger 對象Tiger tiger = new Tiger();/對 tiger 的屬性進(jìn)行賦值 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 調(diào)用方法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子類對象的構(gòu)建在上一章中已經(jīng)學(xué)習(xí)了如何創(chuàng)建類的對象。繼承也是對類進(jìn)行操作。既然繼承可以這么方便的使用,子類對象的創(chuàng)建過程是怎么樣的呢?調(diào)用默認(rèn)構(gòu)造函數(shù)。示例如下。是從最頂層的基類開始往下一層層的程序的運(yùn)行結(jié)果如下。在程序中定義了 3 個(gè)類A、B、C,其中 B 繼承自 A,C 繼承自B,當(dāng)創(chuàng)建一個(gè) C 類的對象時(shí)候,會自動調(diào)用父類的無參構(gòu)造函數(shù)。如果想調(diào)用父類的有參構(gòu)造函數(shù),需要使用

8、super關(guān)鍵字,調(diào)用父類的構(gòu)造函數(shù)的語句要放在所在方法的第一個(gè)語句中。修改上面的程序如下。103 class A A()/A 類的無參構(gòu)造器System.out.pr ln(調(diào)用A 的構(gòu)造函數(shù));A(i) /A 類的有參構(gòu)造器System.out.pr ln(調(diào)用A 的有參構(gòu)造函數(shù));class B extends A /讓 B 類繼承A 類B() /B 類的無參構(gòu)造器System.out.pr ln(調(diào)用B 的構(gòu)造函數(shù));調(diào)用A 的構(gòu)造函數(shù)調(diào)用B 的構(gòu)造函數(shù)調(diào)用C 的構(gòu)造函數(shù)class A A() System.out.pr ln(調(diào)用A 的構(gòu)造函數(shù));/類B 繼承Aclass B ext

9、ends A B() System.out.pr ln(調(diào)用B 的構(gòu)造函數(shù));/C 繼承Bclass C extends B C() System.out.pr ln(調(diào)用C 的構(gòu)造函數(shù));/通過該類演示對象的構(gòu)造過程 public class CallConstructor public s ic void main(String args) C c = new C();Java 從入門到精通給每個(gè)類都加上有參數(shù)的構(gòu)造函數(shù),在有參數(shù)的構(gòu)造函數(shù)中,通過 super 關(guān)鍵字調(diào)用其父類構(gòu)造函數(shù)。在 CallConstructor 中構(gòu)建兩個(gè)不同的對象,通過程序的輸出可以看出這兩個(gè)對象的構(gòu)建過程。程

10、序的執(zhí)行結(jié)果如下。在 C+中,一個(gè)類是可以有多個(gè)父類的,這樣會使語言變的非常復(fù)雜,而且多重繼承不是必須的。Java 改進(jìn)了C+的這一點(diǎn),不支持多繼承,一個(gè)類的直接父類只能有一個(gè)。6.1.3方法的覆寫方法覆寫(overload)與方法的重載非常相似,它在 Java 的繼承中也有很重要的應(yīng)用。寫程序可能會碰到下面的情況,在父類中已經(jīng)實(shí)現(xiàn)的方法可能不夠精確,不能滿足子類的需求。例如面的Animal 類中,breath 方法就過于簡單,對于魚類動物是用腮呼吸的,而對于哺乳動物則是用肺呼吸的,如何實(shí)現(xiàn)呢,Java 提供的方法覆寫就是解決這方面的問題。在下面的程序中首先定義了一個(gè)父類 Animal,然后定

11、義 Animal 的 3 個(gè)子類 Tiger、Fish和 Dog,在父類中提供了 3 個(gè)方法 eat、breath、sleep,在兩個(gè)子類 Tiger 和 Fish 中重新定義了 breath 方法,在 Dog 類中什么都沒做。在 OverloadDemo 中,創(chuàng)建了一個(gè) Fish 對象、一個(gè)Tiger 對象和一個(gè) Dog 對象,分別調(diào)用 breath 方法。104 class Animal String type;/種類調(diào)用A 的構(gòu)造函數(shù)調(diào)用B 的構(gòu)造函數(shù)調(diào)用C 的構(gòu)造函數(shù)調(diào)用A 的有參構(gòu)造函數(shù)調(diào)用B 的有參構(gòu)造函數(shù)調(diào)用C 的有參構(gòu)造函數(shù)/B 類的有參構(gòu)造器super(5);/調(diào)用父類的有參

12、構(gòu)造器 System.out.pr ln(調(diào)用 B 的有參構(gòu)造函數(shù));class C extends B /讓 C 類繼承B 類C() /C 類無參構(gòu)造器System.out.pr ln(調(diào)用 C 的構(gòu)造函數(shù));C(i)/C 類的有參構(gòu)造器super(5);/調(diào)用父類也就是 B 類的有慘構(gòu)造器System.out.pr ln(調(diào)用 C 的有參構(gòu)造函數(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、序的運(yùn)行結(jié)果如下。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;/定義獨(dú)有變量/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) 三個(gè)不同的對象 T

15、iger tiger=new Tiger(); Fish fish=new Fish(); Dog dog=new Dog();/都調(diào)用 breath 方法 tiger.breath(); fish.breath(); dog.breath();Java 從入門到精通方法被覆寫后如果又需要調(diào)用,可以使用 super 關(guān)鍵字來實(shí)現(xiàn),示例如下。在 Animal 的子類 Tiger 中,在 breath 方法中,使用語句 super.breath();調(diào)用父類的 breath方法。程序的運(yùn)行結(jié)果如下。super 關(guān)鍵字主要有以下兩個(gè)用途。在子類構(gòu)造函數(shù)中調(diào)用父類構(gòu)造函數(shù)。在子類中調(diào)用父類的方法。6.

16、1.4多態(tài)與動態(tài)綁定多態(tài)是面象語言的又一重要特性。多態(tài)是指同一個(gè)方法根據(jù)上下文使用不同的定義的能力。從這一點(diǎn)看,上一節(jié)講的方法覆寫以及前面的方法重載都可被看做是多態(tài)。但是 Java的多態(tài)的是跟動態(tài)綁定放在一起理解的。動態(tài)綁定是一種機(jī)制,通過這種機(jī)制,對一個(gè)已經(jīng)被重寫的方法的調(diào)用將會發(fā)生在運(yùn)行時(shí),而不是在編譯時(shí)。下面的程序演示了動態(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 關(guān)鍵字調(diào)用父類的 breath 方法super.breath();/調(diào)用動物類的呼吸方法 System.out.pr ln(是用肺呼吸的);public clasperDemopublic s ic void main(String args ) Tiger tiger=new Tiger(); tiger.breath();魚是用腮呼吸的動物呼吸第 6 章繼承Fish 如下。演

18、示程序如下。程序定義一個(gè)存放 Animal 對象的數(shù)組,animal 數(shù)組的 3 個(gè)元素分別存放一個(gè) Animal 對象、一個(gè) Tiger 對象、一個(gè) Fish 對象,然后對這 3 個(gè)對象調(diào)用 breath 方法。程序的執(zhí)行結(jié)果如下。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)的,定義一個(gè) Animal 對象,它既可以存放 Animal 對象,也可以存放 Animal 的子類 Tiger、Fish 的對象。存放在 Animal 數(shù)組中的 Tiger 對象和 Fish 對象在執(zhí)行breath 方法時(shí)會自動地調(diào)用

21、原來對象的方法而不是 Animal 的 breath 方法,這就是動態(tài)綁定。需要注意一點(diǎn)的是,通過數(shù)組元素方法的時(shí)候只能在 Animal 中定義的方法,對于 Tiger 類和 Fish 中定義的方法時(shí)卻不能調(diào)用,例如語句 animal2.swim();就是不正確的。當(dāng)需要這些方法時(shí)需要用到類型轉(zhuǎn)換,演示程序如下。主要看 move 方法,move 方法首先判斷 animal 對象是哪個(gè)類的對象,由判斷執(zhí)行不同的方法。在判斷過程使用了 instanceof 運(yùn)算符,它是用來判斷對象類型的一個(gè)運(yùn)算符。當(dāng)判斷出它的類型之后,再對其進(jìn)行類型轉(zhuǎn)換,得到原始類型后就可以調(diào)用它的類所特有的方法了。程序的運(yùn)行結(jié)

22、果如下。6.1.5final 關(guān)鍵字編寫程序時(shí)可能需要把類定義為不能繼承的,即最終類,或者是有的方法不希望被子類繼承,這時(shí)候就需要使用 final 關(guān)鍵字來。把類或方法為 final 類或 final 方法的方法很簡單,在類前面加上 final 關(guān)鍵字即可。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)/進(jìn)行對象類型的判斷 if(animal instanceof Tiger)(Tiger)animal).tigerRun(); else if(animal instanceof Fish) (Fish)animal).swim();else animal.sleep();動物呼吸是用肺呼吸的

24、魚是用腮呼吸的第 6 章 繼承方法也可以被為 final 的,形式如下。例如:需要注意的是,實(shí)例變量也可以被定義為 final,被定義為 final 的變量不能被修改。被聲明為 final 的類的方法自動地被為 final,但是它的實(shí)例變量并不是 final。6.2抽象類抽象類是指在類中定義方法,但是并不去實(shí)現(xiàn)它,而在它的子類中去具體的實(shí)現(xiàn)。定義的抽象方法不過是一個(gè)方法占位符。繼承抽象類的子類必須實(shí)現(xiàn)父類的抽象方法,除非子類也被定義成一個(gè)抽象類。6.2.1抽象類的定義對抽象類有了基本了解后,就來看一下如何定義抽象類。定義抽象類是通過 abstract 關(guān)鍵字實(shí)現(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 都實(shí)現(xiàn)了breath 方法。6.2.2抽象類的使用定義完抽象類后,就可以使用它。但是抽象類和普通類不同,抽象類不可以實(shí)例化,如語句 Animal animal =new Animal();是無法通過編譯的,但是可以創(chuàng)建抽象類的對象變量,只是這個(gè)變量只能用來指向它的非抽象子類對象。示例如下。程序中定義了兩個(gè) Animal 對象變量,一個(gè)存放 F

27、ish 對象,另一個(gè)存放 Tiger 對象,分別調(diào)用這兩個(gè)對象的breath 方法。由于根本不可能構(gòu)建出 Animal 對象,所以存放的對象仍然是 Tiger 對象,它會動態(tài)綁定正確的方法進(jìn)行調(diào)用。需要注意的是,盡管 animal 存放的是 Tiger 對象或是 Fish 對象,但是不能直接調(diào)用這些子類的方法,語句 animal.swim;和 animal2.tigerRun();都是不正確的。調(diào)用這項(xiàng)方法的時(shí)候仍然需要進(jìn)行類型轉(zhuǎn)換,正確的使用方法如下。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 中存在一個(gè)非常特殊的類Object 類,它是所有類的祖先類。在 Java 中如果定義了一個(gè)類并沒有繼承任何類,那么它默認(rèn)繼承 Object 類。而如果它繼承了一個(gè)類,則它的父類,甚至父類的父類必然是繼承自 Object 類,所以說任何類都是 Object 類的子類。6.3.1Object 對象由于 Object 類的特殊性,所以在實(shí)際開發(fā)中,經(jīng)常會使用

30、到它。在本節(jié)中就來簡單地介紹一下如何使用 Object 類和如何使用類中的兩個(gè)重要方法。定義一個(gè) Object 對象,根據(jù)前面繼承的知識,它可以存放任何類型,示例如下。示例中用到的 Animal 類、Fish 類和 Tiger 類都在上一節(jié)中定義過了??梢园?3 個(gè)不同的對象放進(jìn) Object 數(shù)組中,但是放進(jìn)去后對象的類型被丟棄了,取出后要進(jìn)行類型轉(zhuǎn)換。當(dāng)然類型轉(zhuǎn)換不像程序中這么簡單,可能要使用到類型判斷,即用 instanceof 運(yùn)算符實(shí)現(xiàn)。6.3.2equals 方法和 toString 方法在 Object 類中也定義了一系列的方法,讀者可以閱讀 API 自己查看。其中比較重要的兩個(gè)

31、方法就是 equals()方法和 toString()方法。在 Object 類中equals 方法的定義形式如下。當(dāng)且僅當(dāng)兩個(gè)對象指向同一個(gè)對象的時(shí)候才會返回真值。程序要想進(jìn)行詳細(xì)的判斷,必須自己進(jìn)行 equals 方法的覆寫。面的內(nèi)容中,介紹了 String 類 equals 方法的實(shí)現(xiàn)。111 publicequals(Object anObject) publicequals(Object obj) return (this = obj);public class Testpublic s ic void main(String args)/創(chuàng)建一個(gè)存放 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);/取出對象后需要進(jìn)行類型轉(zhuǎn)換才能調(diào)用相應(yīng)類型的方法 (Fish) object0).swim();Java 從入門到精通程序首先判斷兩個(gè)對象是否指向同一個(gè)對象,如果是的話當(dāng)然返回 true,如果不是繼續(xù)判斷提供的對象是否是 String 類型,如果不是的話返回 fals

33、e,是的話再進(jìn)一步判斷;取出兩個(gè) String 類的每一個(gè)位置的字符進(jìn)行判斷,如果有一個(gè)不等則返回 false。其實(shí)這是 equals 方法,這里模仿 String 的 equals 方法的實(shí)現(xiàn)提供一個(gè) Animal 的 equals方法,其實(shí)這是一種比較標(biāo)準(zhǔn)的equals 方法編寫方式。編寫測試類如下。112 public class Testequals public s ic void main(String args) 三個(gè)對象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)系上傳者。文件的所有權(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論