




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、本資料由-大學(xué)生創(chuàng)業(yè)|創(chuàng)業(yè)|創(chuàng)業(yè)網(wǎng)第4章 繼承和多態(tài)繼承是java語言的一個重要特性。本章主要介紹關(guān)于繼承的若干應(yīng)用。通過繼承,子類擁有父類的所有非私有成員。子類對繼承自父類的類成員重新進行定義,就稱為覆蓋。方法的重載是一個類中對自身已有的同名方法的重新定義。每個重載方法的參數(shù)的類型和(或)數(shù)量必須是不同的。用abstract修飾符修飾的類稱為抽象類,抽象類不能實例化為對象。如果一個類被final修飾符所修飾,說明這個類不可能有子類,這樣的類就稱為最終類。最終類不能被別的類繼承,它的方法也不能被覆蓋。接口用interface來聲明。接口中的域變量都是常量,方法都是沒有方法體的抽象方法,其方法的
2、真正實現(xiàn)在“繼承”這個接口的各個類中完成。一個類只能有一個父類,但是類可以同時實現(xiàn)若干個接口,從而實現(xiàn)了多重繼承。本章要點l 繼承和多態(tài)的概念、特點以及實現(xiàn)方法l 域的繼承與隱藏l 方法的繼承與覆蓋l 接口的實現(xiàn)本章難點l 繼承和多態(tài)的實現(xiàn)方法l 接口的實現(xiàn)學(xué)習(xí)目標l 理解繼承、多態(tài)、接口的概念l 掌握繼承、多態(tài)、接口在java中的實現(xiàn)。4.1 繼承和多態(tài)的概念4.1.1 繼承的概念繼承實際上是存在于面向?qū)ο蟪绦蛑械膬蓚€類之間的一種關(guān)系。當一個類a能夠獲取另一個類b中所有非私有的數(shù)據(jù)和操作的定義作為自己的部分或全部成分時,就稱這兩個類之間具有繼承關(guān)系。被繼承的類b稱為父類或超類,繼承了父類或超
3、類的數(shù)據(jù)和操作的類a稱為子類或衍生類,一個父類可以同時擁有多個子類。使用繼承具有以下的好處:降低了代碼編寫中的冗余度,更好地實現(xiàn)了代碼復(fù)用的功能,從而提高了程序編寫的效率,使得程序維護變得簡單、方便。現(xiàn)以汽車為例,汽車分為很多種,比如公共汽車、警車、私家車等。如果要實現(xiàn)對汽車的管理,就需要為每一種汽車創(chuàng)建一個類,而每一個類中都會具有所有汽車共有的屬性和方法,比如每個汽車類都會有顏色、車燈等屬性,都會有加速、剎車等方法,這樣勢必帶來代碼的重復(fù),維護起來也比較麻煩。如果我們將所有汽車共有的屬性和方法都抽象出來,構(gòu)建一個汽車類,讓各種汽車都繼承這個類,這樣在汽車這個類中所擁有的屬性就會衍生在它的子類
4、中,各種汽車都會具有汽車類所擁有的屬性和方法,我們就不用為每種汽車定義像顏色、車燈這樣的屬性,以及加速、剎車等相同的方法了。而且維護起來也比較容易了。這種結(jié)構(gòu)如圖4-1所示。汽車類顏色、車燈加速()、剎車()公共汽車警車私家車圖4-1 汽車類的繼承繼承分為單重繼承和多重繼承兩種類型,所謂單重繼承,是指任何一個類都只有一個單一的父類;而多重繼承是指一個類可以有一個以上的父類。采用單重繼承的程序結(jié)構(gòu)比較簡單,是單純的樹狀結(jié)構(gòu),掌握、控制起來相對容易;而支持多重繼承的程序,其結(jié)構(gòu)則是復(fù)雜的網(wǎng)狀,設(shè)計、實現(xiàn)都比較復(fù)雜。java語言僅支持類的單重繼承。4.1.2 多態(tài)的概念多態(tài)是面向?qū)ο蟪绦蛟O(shè)計的又一個
5、特殊特性。所謂多態(tài),是指一個程序中同名的不同方法共存的情況。面向?qū)ο蟮某绦蛑卸鄳B(tài)的情況有多種,可以通過子類對父類成員的覆蓋實現(xiàn)多態(tài),也可以利用在同一個類中同名方法的重載來實現(xiàn)多態(tài)。多態(tài)是指一個方法聲明的多個不同表現(xiàn)形式。在同一個類中或者不同的類中,同一個方法的多個不同實現(xiàn)。比如同樣是剎車這樣一個功能,在不同的汽車中所要做的操作可能是不一樣的,這樣我們在程序中就要為剎車這個方法名創(chuàng)建幾個不同的實現(xiàn),也就是說,剎車這個方法名可能會有幾個不同的方法體,這就是面向?qū)ο蟪绦蛟O(shè)計中多態(tài)的概念。 4.2 類的繼承4.2.1繼承的實現(xiàn)java中的繼承是通過extends關(guān)鍵字來實現(xiàn)的,在定義類時使用exten
6、ds關(guān)鍵字指明新定義類的父類,就在兩個類之間建立了繼承關(guān)系。其語法是:類修飾符 class 子類名 extends 父類名從上面的語法格式,我們可以看出比一般類的聲明多了“extends”關(guān)鍵字部分,通過該關(guān)鍵字來指明子類要繼承的父類。如果,父類和子類不在同一個包中,則需要使用“import”語句來引入父類所在的包。【例4_1】繼承的簡單示例。class fatherint f_a=0;void print()system.out.println ("f_a="+f_a);class son extends fatherint s_a=10;class exam4_1pub
7、lic static void main(string args) son s =new son(); s.print(); system.out.println ("f_a="+s.f_a); system.out.println ("s_a="+s.s_a); 在例子中可以看到,在子類的聲明中使用“extends”關(guān)鍵字指明一個被繼承的父類就可以實現(xiàn)類之間的繼承關(guān)系。son類中雖然并沒有定義f_a變量和print()方法,但是仍然可以訪問,這是因為它從父類中繼承過來的原因。子類son還定義了自己的變量s_a,這說明了子類可以擁有比父類更多的變量和方法
8、,也就是說子類擁有更強大的功能。程序的執(zhí)行結(jié)果如圖4-2所示。圖4-2 例4_1程序運行結(jié)果4.2.2 類成員的繼承新定義的子類可以從父類那里自動繼承所有非private的屬性和方法作為自己的成員。同時根據(jù)需要再加入一些自己的屬性或方法就產(chǎn)生了一個新的子類。可見父類的所有非私有成員實際是各子類都擁有集合的一部分,這樣做的好處是減少程序維護的工作量。從父類繼承來的成員,就成為了子類所有成員的一部分,子類可以使用它?!纠?_2】繼承的示例。class fatherprivate int f_a=0;private void print()system.out.println ("f_a=
9、"+f_a);class son extends fatherint s_a=10;class exam4_2public static void main(string args) son s =new son();/ s.print();/ system.out.println ("f_a="+s.f_a); system.out.println ("s_a="+s.s_a); 仍然如4.1的例子,但此時我們把父類中的變量f_a和方法print()修改為了private的作用域,此時在子類中就不能訪問這兩個成員了,因為子類不能繼承私有的父類
10、成員,程序中注釋掉的兩條語句是錯誤的讀者可自行檢驗。程序的運行結(jié)果如圖43所示。圖4-3 例4_2程序運行結(jié)果【例4_3】繼承的示例。class fatherprivate int f_a=0;void print()system.out.println ("f_a="+f_a);class son extends fatherint s_a=10;class exam4_3public static void main(string args) son s =new son(); s.print();/ system.out.println ("f_a=&quo
11、t;+s.f_a); system.out.println ("s_a="+s.s_a); 繼續(xù)對4.1的例子作修改,把把父類中的變量f_a修改為了private的作用域,但方法print()仍然保持默認作用域,此時可以看到在子類中直接訪問變量f_a會出現(xiàn)錯誤,但通過print()方法我們卻可以訪問到私有作用域的f_a變量,這又是因為什么呢?這是因為print()方法被子類繼承,print()方法和變量f_a 都是父類的成員,它們之間進行訪問是不存在問題的,利用公共的方法去訪問私有的成員,這正是面向?qū)ο蠓庋b特點的好處,它使得在類外不能直接訪問私有的屬性,但可以利用方法作為接
12、口對變量進行讀取操作,增強了程序的健壯性。程序的運行結(jié)果如圖4_4所示。圖4- 4 例4_3程序運行結(jié)果4.2.3 替代原理有了繼承特點,面向?qū)ο缶幊讨芯痛嬖诹艘粋€替代原理,用一句話講替代原理的內(nèi)容是:子類對象總可以看作一個父類對象。也就是說,在所有使用父類對象的地方,都可以使用一個子類對象來代替父類對象,也有人把這種原理稱為“is a”關(guān)系。比如在例4.1中,f_a變量和print()方法是父類的成員,應(yīng)該用父類的對象去訪問,但我們卻使用了子類的對象去訪問這兩個成員,這可以認為是一種簡單的替代,我們來看下面這個例子?!纠?_4】替代原理示例。class fatherprivate int f
13、_a=0;void print(father f)system.out.println ("f_a="+f.f_a);class son extends fatherclass exam4_4public static void main(string args)father f=new father();son s =new son();f.print(s);我們給print( )方法加上了參數(shù),這個參數(shù)是一個父類的引用,但我們調(diào)用時,卻給方法傳遞了一個子類的引用s,程序卻依然可以正常運行,這就是替代原理。程序的運行結(jié)果如圖4-5所示。圖4-5 例4_4程序運行結(jié)果4.3
14、 類成員的覆蓋4.3.1 覆蓋的用法在程序的設(shè)計過程中,我們通過繼承可以快速地將父類中已實現(xiàn)的非私有類成員應(yīng)用到自己定義的子類中。但是,不是所有繼承下來的類成員都是我們需要的,這時候我們就可以通過使用覆蓋的方式來解決這個問題。子類對繼承自父類的類成員重新進行定義,就稱為覆蓋。要進行覆蓋,就是在子類中對需要覆蓋的類成員以父類中相同的格式,再重新聲明定義一次,這樣就可以對繼承下來的類成員進行功能的重新實現(xiàn),從而達到程序設(shè)計的要求?!纠?_5】覆蓋的示例。class fatherint f_a=0;void print()system.out.println ("f_a="+f_
15、a);class son extends fatherint f_a=10;void print()system.out.println ("f_a="+f_a);class exam4_5public static void main(string args) son s =new son(); s.print(); system.out.println ("f_a="+s.f_a); 我們在子類中重新定義了print()方法和變量f_a,此時子類的print()方法覆蓋了父類的print()方法,子類中的變量f_a隱藏了父類中的變量f_a,在子類中再
16、去調(diào)用print()方法或者訪問變量f_a都是訪問的子類中的成員,因此此時只輸出的變量f_a都是子類中的變量f_a=10,而沒有輸出父類的變量f_a=0。程序運行結(jié)果如圖4-6所示。圖4-6 例4_5程序運行結(jié)果4.3.2 super參考如果要使用父類中被覆蓋的方法或被隱藏的變量,此時可以使用super參考。相對this來說,super表示的是當前類的直接父類對象,是當前對象的直接父類對象的引用。所謂直接父類是相對于當前類的其他“祖先”類而言的。例如,假設(shè)類a派生出子類b,b類又派生出自己的子類c,則b是c的直接父類,而a是c的祖先類。super代表的就是直接父類。這就使得我們可以比較簡便、直
17、觀地在子類中引用直接父類中的相應(yīng)屬性或方法?!纠?_6】super參考的示例。class fatherint f_a=0;void print()system.out.println ("f_a="+f_a);class son extends fatherint f_a=10;void print()super.print();system.out.println ("f_a="+super.f_a);class exam4_6public static void main(string args) son s =new son(); s.print(
18、); system.out.println ("f_a="+s.f_a); 程序中我們對子類的print()方法作以修改,在方法內(nèi)部我們首先使用了super關(guān)鍵字引用了父類的print()方法,輸出了父類的變量f_a,然后我們又通過super關(guān)鍵字直接引用了父類的變量f_a,最后才輸出了子類中的變量f_a。程序運行的結(jié)果如圖4-7所示。圖4-7 例4_6程序運行結(jié)果4.4 方法重載4.4.1 方法的重載在java 中,同一個類中多個同名方法之間構(gòu)成重載關(guān)系,在完成同一功能時,可能遇到不同的具體情況,所以需要定義含不同的具體內(nèi)容的方法,這些方法的具體實現(xiàn)代碼可能不一樣,但他們
19、的名稱相同,這些方法間構(gòu)成重載。例如,一個類需要具有打印的功能,而打印是一個很廣泛的概念,對應(yīng)的具體情況和操作有多種,如實數(shù)打印、整數(shù)打印、字符打印、分行打印等。為了使打印功能完整,在這個類中就可以定義若干個名字都叫print()的方法,每個方法用來完成一種不同于其他方法的具體打印操作,處理一種具體的打印情況,這些同名print()方法的關(guān)系就是重載關(guān)系。public void print (int i)public void print (float f)public void print ()當一個重載方法被調(diào)用時,java 用參數(shù)的類型、數(shù)量、參數(shù)的順序來表明實際調(diào)用的重載方法的版本。因
20、此,每個重載方法的參數(shù)的類型、數(shù)量或者參數(shù)的順序至少有一個是不同的,但不能通過方法的返回值類型來定義重載的方法?!纠?_7】方法重載的示例。class exam4_7int i=5;string s="hello"void print()system.out.println("i="+i+" s="+s);void print(int i)system.out.println ("i="+i);void print(string s)system.out.println ("s="+s);voi
21、d print(int i,string s)system.out.println("i="+i+" s="+s);void print(string s,int i)system.out.println("s="+s+" i="+i);/*int print(int i)return i;*/public static void main(string args) exam4_7 e =new exam4_7(); e.print(); e.print(10); e.print("java")
22、; e.print(10,"java"); e.print("java",10); 程序中一共定義了5個print()方法,這5個print()方法要么參數(shù)的個數(shù)不一樣,要么參數(shù)的類型不一樣,要么參數(shù)的順序不一樣,這5個方法間構(gòu)成方法的重載。但是被注釋掉的int print(int i)方法由于只是返回值類型與void print(int i)方法不一樣,不具備構(gòu)成重載的條件,不能夠構(gòu)成重載,因此編譯時會出錯,提示方法已經(jīng)被定義,讀者可自行測試。程序的運行結(jié)果如圖48所示。圖4-8 例4_7程序運行結(jié)果4.4.2 構(gòu)造函數(shù)的重載構(gòu)造函數(shù)間也可以構(gòu)成重載。
23、不同對象的創(chuàng)建很多時候就是通過構(gòu)造函數(shù)的重載來實現(xiàn)的。并且在構(gòu)造函數(shù)重載中我們還可以使用this關(guān)鍵字來指明重載的構(gòu)造函數(shù)。【例4_8】構(gòu)造函數(shù)的重載示例。class personstring name;int age;person()name="noname"age=1;person(string name)this();=name;person(int age)this();this.age=age;person(string name,int age)=name;this.age=age;void print()system.out
24、.println ("我的名字是"+name+",年齡是"+age);class exam4_8public static void main(string args) person p1=new person(); p1.print(); person p2=new person("小明"); p2.print(); person p3=new person(10); p3.print(); person p4=new person("小芳",11); p4.print(); 程序中創(chuàng)建了四個構(gòu)造函數(shù),四個構(gòu)造函
25、數(shù)構(gòu)成重載,通過不同的構(gòu)造函數(shù)可以創(chuàng)建出不同的對象,并且使用了this關(guān)鍵字來調(diào)用了已經(jīng)存在的構(gòu)造函數(shù),程序的運行結(jié)果如圖4-9所示。圖4-9 例4_8程序運行結(jié)果注意在使用this關(guān)鍵字來重載構(gòu)造函數(shù)時,this必須是構(gòu)造函數(shù)的第一個語句,且一個構(gòu)造函數(shù)中只能出現(xiàn)一次。類似的可以在構(gòu)造函數(shù)中使用super關(guān)鍵字來調(diào)用父類的構(gòu)造函數(shù)。4.4.3 多態(tài)面向?qū)ο缶幊痰牡谌筇卣鞣Q為多態(tài),是指一個方法聲明的多個不同表現(xiàn)形式。一個方法可以用不同的方式來解釋,多態(tài)通常被認為是一種方法在不同的類中可以有不同的實現(xiàn),甚至在同一類中仍可能有不同的定義及實現(xiàn)。比如前面講過的子類對父類方法的覆蓋以及同一個類中方法
26、的重載,這都是多態(tài)的表現(xiàn)形式。多態(tài)是指一個方法聲明的多種實現(xiàn)狀態(tài)。無論是方法重載還是方法覆蓋,都要求其方法的聲明要一致,不一樣的是在具體實現(xiàn)方法時,方法體的內(nèi)容不一樣,方法在調(diào)用時,必須通過傳入的參數(shù)的不同或者具體對象的不同,來確定究竟是調(diào)用方法的那一種實現(xiàn)形式。方法收到消息時,對象要予以響應(yīng),不同的對象收到同一消息可以產(chǎn)生完全不同的結(jié)果,一個名字有多個不同的實現(xiàn),以實現(xiàn)不同的功能,一名多用,方便名稱空間的簡化和記憶,方便代碼的抽象編程,這正是多態(tài)存在的意義。4.5抽象類和最終類 4.4.1 抽象類類是對對象的抽象,有時我們需要對類進行抽象,比如有些類具有共同的特性和功能,我們可以把這些共同的
27、東西抽象出來組織成一個類,讓其他類繼承這個類,這樣就可以簡化代碼的設(shè)計了。有些時候這些具有相同功能的類可能根本不相關(guān),功能的具體實現(xiàn)也有很大差別,做普通類的繼承不能達到我們的要求,此時就需要一種跟高級別的抽象,在java中使用抽象類來實現(xiàn)這種抽象。舉個例子而言,假設(shè)“鳥”是一個類,它代表了所有鳥的共同屬性及其動作,任何一只具體的鳥兒都同時是由“鳥”經(jīng)過特殊化形成的某個子類的對象,比如它可以派生出 “鴿子”、“燕子”、“麻雀”、“天鵝”等具體的鳥類。但是現(xiàn)實中并不會存在一只實實在在的鳥,它既不是鴿子,也不是燕子或麻雀,更不是天鵝,這只鳥僅僅是一只抽象的“鳥”,這就是抽象類的概念。有了“鳥”這個抽
28、象類,在描述和處理某一種具體的鳥時,就只需要簡單地描述出它與其他鳥類所不同的特殊之處,而不必再重復(fù)它與其它鳥類相同的特點。比如可以這樣描述“燕子”這種鳥“燕子是一種長著剪刀似的尾巴,喜在屋檐下筑窩的鳥”。這種組織方式使得所有的概念層次分明,描述方便簡單,符合人們的思維習(xí)慣。java中定義抽象類是出于相同的考慮。由于抽象類是它的所有子類的公共屬性的集合,所以使用抽象類的一大優(yōu)點就是可以充分利用這些公共屬性來提高開發(fā)和維護程序的效率。在java中,凡是用abstract修飾符修飾的類稱為抽象類。它和一般的類不同之處在于: 如果一個類中含有未實現(xiàn)的抽象方法,那么這個類就必須通過關(guān)鍵字abstract
29、進行標記聲明為抽象類。 抽象類中可以包含抽象方法,但不是一定要包含抽象方法。它也可以包含非抽象方法和域變量,就像一般類一樣。 抽象類是沒有具體對象的概念類,也就是說抽象類不能實例化為對象。 抽象類的子類必須為父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類。定義一個抽象類的格式如下: abstract class classname . /類的主體部分抽象方法是指使用abstract關(guān)鍵字修飾,沒有方法體的方法,其格式為:修飾符 abstract 返回值類型 方法名(參數(shù)列表);注意抽象方法是沒有方法體的,甚至連方法體的括號也沒有?!纠?_9】抽象類示例。abstract class bird
30、abstract void fly();class swallow extends birdvoid fly()system.out.println("燕子在飛翔!");class eagle extends birdvoid fly()system.out.println("老鷹在滑翔!");class exam4_9public static void main(string args)new swallow().fly();new eagle().fly();程序的運行結(jié)果如圖 4-10所示。圖4-10 例4_9程序運行結(jié)果4.4.2最終類如果一個
31、類被final修飾符所修飾和限定,說明這個類不可能有子類,這樣的類就稱為最終類。最終類不能被別的類繼承,它的方法也不能被覆蓋。被定義為final的類通常是一些有固定作用、用來完成某種標準功能的類。例如最常用的system類就是final類。將一個類定義成final類,使得這個類不能再派生子類,這樣其中的方法也就不能被覆蓋,避免了這個類被外界修改,增強了程序的健壯性、穩(wěn)定性。注意abstract和final修飾符不能同時修飾一個類,因為abstract類自身沒有具體對象,需要派生出子類后再創(chuàng)建子類的對象;而final類不可能有子類,這兩個修飾符恰好是矛盾的,所以abstract和final修飾符
32、不能同時修飾一個類。4.6 接口4.6.1 接口的定義java中的接口是對類的進一步抽象,是一種比抽象類更高一層次的抽象。有時一個類中被抽象的只剩下了抽象方法和一些常量,此時我們可以把這個類聲明為一個接口??梢哉f接口是一個完全抽象類。接口中只能定義常量和抽象方法,并且他們默認都具有public的修飾符。所以,接口定義的僅僅是實現(xiàn)某一特定功能的一組對外的規(guī)范,而并沒有真正的實現(xiàn)這個功能。這個功能的真正實現(xiàn)是在“繼承”這個接口的各個類中完成的,要由這些類來具體定義接口中各抽象方法的方法體。java中聲明接口的語法如下: public interface 接口名extends父接口名列表 /接口體
33、/常量域聲明 public static final 域類型 域名常量值; /抽象方法聲明 public abstract native 返回值 方法名(參數(shù)列表)throw 異常列表; interface是接口聲明的關(guān)鍵字,它引導(dǎo)著所定義的接口的名字,這個名字應(yīng)該符合java對標識符的規(guī)定。與類定義相仿,聲明接口時也需要給出訪問控制符,不同的是接口的訪問控制符只有public一個。用public修飾的接口是公共接口,可以被所有的類和接口使用,而沒有public修飾符的接口則只能被同一個包中的其他類和接口利用。與類相仿,接口也具有繼承性。定義一個接口時可以通過extends關(guān)鍵字聲明該新接口是
34、某個已經(jīng)存在的父接口的派生接口,它將繼承父接口的所有屬性和方法。與類的繼承不同的是一個接口可以有一個以上父接口,它們之間用逗號分隔,形成父接口列表。新接口將繼承所有父接口中的屬性和方法。接口體由兩個部分組成:一部分是對接口中域變量的聲明,另一部分是對接口中方法的聲明。接口中的所有域變量都必須是public static final,這是系統(tǒng)默認的規(guī)定,所以接口屬性也可以沒有任何修飾符,其效果完全相同。接口中的所有方法都必須是默認的public abstract,無論是否有修飾符顯式地限定它。在接口中只能給出這些抽象方法的方法名、返回值類型和參數(shù)列表,而不能定義方法體。定義接口可歸納為如下幾點:
35、 在java中接口是一種專門的類型。用interface關(guān)鍵字定義接口。 接口中只能定義抽象方法,不能有方法體,一定是public修飾的。 接口中可以定義變量,但實際上是static final修飾的常量。 接口中不能定義靜態(tài)方法。從語法規(guī)定可以看出,定義接口與定義類非常相似。實際上完全可以把接口理解成為由常量和抽象方法組成的特殊類。一個類只能有一個父類,但是類可以同時實現(xiàn)若干個接口。這種情況下如果把接口理解成特殊的類,那么這個類利用接口實際上就獲得了多個父類,即實現(xiàn)了多重繼承?!纠?_10】接口的示例。public interface exam4_10public static final
36、int x=10;int y=0;public void z();public abstract int getz();interface sub_interface extends exam4_10public static final int a=0;int b=10;public void c();public abstract int getc();4.6.2 接口的實現(xiàn)接口的聲明僅僅給出了抽象方法,相當于程序開發(fā)中的一組協(xié)議,而具體地實現(xiàn)接口所規(guī)定的功能,則需某個類為接口中的抽象方法定義實在的方法體,稱為實現(xiàn)這個接口。如果一個類要實現(xiàn)一個接口,那么這個類就提供了實現(xiàn)定義在接口中的所有
37、抽象方法的方法體。 一個類要實現(xiàn)一個接口其語法格式為:修飾符 class 類名 extends 父類名 implements 接口名列表/實現(xiàn)的接口中的方法體一個類要實現(xiàn)接口時,要注意以下幾個問題: 在類的聲明部分,用implements關(guān)鍵字聲明該類將要實現(xiàn)哪些接口。 如果實現(xiàn)某接口的類不是abstract抽象類,則必須為所有抽象方法定義方法體,而且方法頭部分應(yīng)該與接口中的定義完全一致。 如果實現(xiàn)某接口的的類是abstract的抽象類,則它可以不實現(xiàn)該接口所有的方法。但該抽象類的子類必須實現(xiàn)所有的抽象方法,否則它仍然是抽象類。接口的抽象方法的訪問限制符都已制定為public,所以類在實現(xiàn)方法
38、時,必須顯式地使用public修飾符,否則將出現(xiàn)縮小方法的訪問控制范圍的錯誤?!纠?_11】接口實現(xiàn)示例。interface animalvoid move();class bird implements animalpublic void move()system.out.println ("鳥在飛翔!");class beast implements animalpublic void move()system.out.println ("野獸在奔跑!");class fish implements animalpublic void move()s
39、ystem.out.println ("魚在游泳!");class exam4_11public static void main(string args) new bird().move(); new beast().move(); new fish().move(); 程序中我們對動物的運動作了抽象,抽象成了接口animal,然后分別用bird、beast、fish類實現(xiàn)了該接口,由于接口中只有一個抽象方法,因此在這些類里面也只實現(xiàn)了這一個抽象方法。程序的運行結(jié)果如圖4-11所示。圖4-11 例4_11程序運行結(jié)果4.7 案例繼承和多態(tài)實例在本節(jié)中,我們將描述一棵樹,并
40、通過繼承來描述一棵柳樹,程序如下所示。 class tree/樹的樹根 public void root() string ssite = "土壤中" string sfunction = "吸收養(yǎng)份" print("位置:"+ssite); print("功能:"+sfunction); /樹的樹干 public void bolo() string ssite = "地面" string sfunction = "傳遞養(yǎng)份" print("位置:"+s
41、site); print("功能:"+sfunction); /樹的樹枝 public void branch() string ssite = "樹干上" string sfunction = "傳遞養(yǎng)份" print("位置:"+ssite); print("功能:"+sfunction); /樹的葉子 public void leaf() string ssite = "樹梢" string sfunction = "光合作用" string sco
42、lor = "綠色" print("位置:"+ssite); print("功能:"+sfunction); print("顏色:"+scolor); /顯示信息 public void print(object opara) system.out.println(opara); /描述柳樹class osier extends tree /重載樹的樹 public void leaf() super.leaf(); string sshape = "長形" super.print("
43、形狀:"+sshape); /擴展樹的花 public void flower() print("哈哈,柳樹沒有花!"); public static void main(string args) osier o = new osier(); o.print("柳樹樹根:"); o.root(); o.print("柳樹樹干:"); o.bolo(); o.print("柳樹樹枝:"); o.branch(); o.print("柳樹樹葉:"); o.leaf(); o.print(&
44、quot;柳樹花:"); o.flower(); 程序中我們對樹作了抽象,對其抽象了四個方法,分別用來描述樹的根、干、枝、葉,并做了print()方法來進行顯示。然后我們繼承tree類,做了柳樹類osier,并重寫了父類中l(wèi)eaf()方法,實現(xiàn)了方法的覆蓋,并增加了flower()方法,增強了子類的功能,程序的運行結(jié)果如圖4-12所示。圖4-12 程序執(zhí)行結(jié)果小結(jié)java中的繼承通過extends關(guān)鍵字來實現(xiàn),它的具體語法是:類修飾符 class 子類名 extends 父類名通過繼承,子類擁有父類的所有非私有成員。子類對繼承自父類的類成員重新進行定義,就稱為覆蓋,要進行覆蓋,就是在子類中對需要覆蓋的類成員以父類中相同的格式,再重新聲明定義一次。在子類中引用直接父類中的相應(yīng)屬性或方法,可以使用super關(guān)鍵字。方法的重載是一個類中對自身已有的同名方法的重新定義。每個重載方法的參數(shù)的類型和(或)數(shù)量必須是不同的。構(gòu)造函數(shù)也可以重載,在重載的構(gòu)造函數(shù)內(nèi)部,可以使用關(guān)鍵字this作為一個方法調(diào)用,從一個構(gòu)造函數(shù)中調(diào)用另一個構(gòu)造函數(shù)。用abstract修飾符修飾的類稱為抽象類,抽象類不能實例化為對象。抽象類必須被繼承,子類為它們父類中的所有抽象方法提供實現(xiàn),否則它們也是抽象類。如果一個類被final修飾符所修飾
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同補充協(xié)議合同范本
- 單位房屋借用合同范本
- 勞動使用期合同范本
- 利用合同范本掙錢
- 上海徐匯金杯租車合同范本
- 監(jiān)控弱電維護合同范本
- 醫(yī)院電動車租售合同范本
- 備案的借住合同范本
- 單位之間借支合同范本
- 2003勞務(wù)合同范本
- 華為機器視覺好望系列產(chǎn)品介紹
- 質(zhì)量體系的職能架構(gòu)
- 《旅游經(jīng)濟學(xué)》全書PPT課件
- 中國醫(yī)院質(zhì)量安全管理 第3-5部分:醫(yī)療保障 消毒供應(yīng) T∕CHAS 10-3-5-2019
- 安全評價理論與方法第五章-事故樹分析評價法
- 幼兒園一日活動流程表
- 中國民俗知識競賽題(附答案和詳細解析)
- 最后一分鐘安全檢查
- 散裝水泥罐體標準資料
- 原發(fā)性肝癌臨床路徑最新版
- 2022年口腔醫(yī)學(xué)主治醫(yī)師(代碼353)考試題庫(匯總版)
評論
0/150
提交評論