本篇內(nèi)容主要講解“java繼承多態(tài)和抽象類接口知識(shí)點(diǎn)總結(jié)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“java繼承多態(tài)和抽象類接口知識(shí)點(diǎn)總結(jié)”吧!
網(wǎng)站設(shè)計(jì)、網(wǎng)站制作介紹好的網(wǎng)站是理念、設(shè)計(jì)和技術(shù)的結(jié)合。成都創(chuàng)新互聯(lián)公司擁有的網(wǎng)站設(shè)計(jì)理念、多方位的設(shè)計(jì)風(fēng)格、經(jīng)驗(yàn)豐富的設(shè)計(jì)團(tuán)隊(duì)。提供PC端+手機(jī)端網(wǎng)站建設(shè),用營(yíng)銷思維進(jìn)行網(wǎng)站設(shè)計(jì)、采用先進(jìn)技術(shù)開源代碼、注重用戶體驗(yàn)與SEO基礎(chǔ),將技術(shù)與創(chuàng)意整合到網(wǎng)站之中,以契合客戶的方式做到創(chuàng)意性的視覺(jué)化效果。
通過(guò)擴(kuò)展一個(gè)已有的類,并繼承該類的屬性和行為,來(lái)創(chuàng)建一個(gè)新的類。已有的稱為父類,新的類稱為子類(父類派生子類,子類繼承父類)。
(1)繼承的優(yōu)點(diǎn):
①代碼的可重用性;
②父類的屬性的方法可用于子類;
③子類可擴(kuò)展父類的屬性和方法;
④設(shè)計(jì)應(yīng)用程序變得更加簡(jiǎn)單。
(2)關(guān)鍵字“is a”用于判斷父類和子類的繼承關(guān)系是否正確。
(3)Java中繼承的實(shí)現(xiàn):
public class 子類 extends 父類{}
(4)繼承的單根性:在Java中一個(gè)類只能有一個(gè)父類;
傳遞性:一個(gè)Java類可以父類,父類也可以有父類。
(5)所有類的根類:
Object類,又叫基類或超類。
Object類是每個(gè)Java類的父類,要么是直接的父類,要么就是間接的父類。
Object類中的三個(gè)重要方法:
① public boolean equals(Object x):檢測(cè)兩個(gè)對(duì)象是否相等。
該方法經(jīng)常被重寫。若兩個(gè)對(duì)象通過(guò)該方法判斷是相等的,那么兩個(gè)對(duì)象的 hashCode()方法應(yīng)該產(chǎn)生相同的哈希碼
② public String toString:該方法返回對(duì)象的字符串表示。
用字符串來(lái)表示對(duì)象有助于調(diào)試或測(cè)試。
③ protected void finalize() throws Throwale:
該方法在對(duì)象將要被垃圾回收時(shí)調(diào)用。
(6)方法重寫:
子類可以重寫從父類繼承的方法,從而允許子類添加或者改變父類中方法的行為。
該行為方法生在子類中,對(duì)父類方法重寫。
子類重寫父類方法時(shí),必須遵循如下規(guī)則:
①子類的方法的返回值類型、方法名和形式參數(shù)列表必須和父類中的是相同的;
②訪問(wèn)修飾符必須不小于父類中的訪問(wèn)修飾符;
③子類中重寫拋出的異常不能比父類中拋出的異常多。
(7)super 關(guān)鍵字:
子類想要給繼承的方法添加行為,但并不完全替換父類的方法。
(默認(rèn)情況下,子類構(gòu)造器會(huì)調(diào)用父類的無(wú)參構(gòu)造方法)
(8)final 關(guān)鍵字:
當(dāng)不希望一個(gè)類被繼承是則在class前加上關(guān)鍵字final。
final關(guān)鍵字可以出現(xiàn)在返回值類型之前的任意位置,習(xí)慣上是放在訪問(wèn)修飾符之后。
①final類:一個(gè)類可以聲明為最終類的。最終類不能被繼承。
②final方法:一個(gè)方法可以聲明為最終的。最終方法不能被重寫。
補(bǔ)充:父類的構(gòu)造方法不能被繼承。
可用super( , , )來(lái)調(diào)用構(gòu)造器,用super調(diào)用父類方法。
(9)abstract關(guān)鍵字:
使用關(guān)鍵字abstract可以聲明一個(gè)抽象類。
該關(guān)鍵字可以出現(xiàn)在類聲明時(shí)class關(guān)鍵字前的任何地方。
當(dāng)類沒(méi)有實(shí)例化必要時(shí),可將該類改為抽象類。
(10)抽象方法:
①?zèng)]有方法主體;
②必須出現(xiàn)在抽象類中;
③在子類中必須被重寫,除非子類也是抽象類。
更多繼承多態(tài)java技術(shù)知識(shí)理解請(qǐng)查看《java多態(tài)案例分析--深入人心的理解》
(1) ①接口中全都是抽象方法,不能被實(shí)例化;
②類不能繼承接口,只能“實(shí)現(xiàn)”接口所定義的方法;
(2)接口與類
相似之處:
①接口可以有任意數(shù)量的方法;
②接口保存以“ .Java ”為后綴名的文件,接口名需要與文件名匹配;
③接口編譯后是后綴名為“ .class ”的字節(jié)碼文件;
④在包中的接口,其相應(yīng)的字節(jié)碼文件必須放置在和包名稱相匹配的一個(gè)目錄結(jié)構(gòu)中。
不同之處:
①接口不能被實(shí)例化;
②接口不包含任何構(gòu)造器;
③接口中所有的方法都是抽象的;
④接口中不能包含實(shí)例成員變量。
唯一可以出現(xiàn)在接口中的成員變量必須是同時(shí)聲明為static和final,即公有靜態(tài)常量;
⑤接口不能被一個(gè)類繼承,只能被一個(gè)類實(shí)現(xiàn);
⑥一個(gè)接口能夠繼承多個(gè)接口。
(3)接口具有以下性質(zhì):
①接口默認(rèn)是抽象的;
②接口的中每一個(gè)方法默認(rèn)也是抽象的;
③接口中的方法默認(rèn)訪問(wèn)級(jí)為public。
(4)接口使用原則:
①使用接口解決多繼承;
②使用接口為外部類添加功能;
③以面向?qū)ο蟮慕嵌瓤紤],量一個(gè)類與生俱來(lái)的特征和行為和依賴于外部的可選特征和行為分離。
(5)類實(shí)現(xiàn)接口有2個(gè)選擇:
①實(shí)現(xiàn)接口中所定義的所有方法;
②聲明自己為抽象類。
使用關(guān)鍵字implements類實(shí)現(xiàn)接口,該關(guān)鍵字放在類聲明的extends部分之后
eg:
public class 類名 extends 父類名 implements 接口名
一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,接口之間用逗號(hào)分隔。
implements 與 is a 都是繼承關(guān)系。
(6)使用接口的好處:
①將設(shè)計(jì)和實(shí)現(xiàn)分離,對(duì)外隱藏了實(shí)現(xiàn);
②面向接口編程是OOP的核心。
1)抽象類可以提供成員方法的實(shí)現(xiàn)細(xì)節(jié)。
而接口中只能存在public abstract 方法;
2)抽象類中的成員變量可以是各種類型的。
而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法。
而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;
4)一個(gè)類只能繼承一個(gè)抽象類。
而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。
1)抽象類是對(duì)一種事物的抽象,即對(duì)類抽象,而接口是對(duì)行為的抽象。抽象類是對(duì)整個(gè)類整體進(jìn)行抽象,包括屬性、行為,但是接口卻是對(duì)類局部(行為)進(jìn)行抽象。舉個(gè)簡(jiǎn)單的例子,飛機(jī)和鳥是不同類的事物,但是它們都有一個(gè)共性,就是都會(huì)飛。那么在設(shè)計(jì)的時(shí)候,可以將飛機(jī)設(shè)計(jì)為一個(gè)類Airplane,將鳥設(shè)計(jì)為一個(gè)類Bird,但是不能將 飛行 這個(gè)特性也設(shè)計(jì)為類,因此它只是一個(gè)行為特性,并不是對(duì)一類事物的抽象描述。此時(shí)可以將 飛行 設(shè)計(jì)為一個(gè)接口Fly,包含方法fly( ),然后Airplane和Bird分別根據(jù)自己的需要實(shí)現(xiàn)Fly這個(gè)接口。然后至于有不同種類的飛機(jī),比如戰(zhàn)斗機(jī)、民用飛機(jī)等直接繼承Airplane即可,對(duì)于鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這里可以看出,繼承是一個(gè) "是不是"的關(guān)系,而 接口 實(shí)現(xiàn)則是 "有沒(méi)有"的關(guān)系。如果一個(gè)類繼承了某個(gè)抽象類,則子類必定是抽象類的種類,而接口實(shí)現(xiàn)則是有沒(méi)有、具備不具備的關(guān)系,比如鳥是否能飛(或者是否具備飛行這個(gè)特點(diǎn)),能飛行則可以實(shí)現(xiàn)這個(gè)接口,不能飛行就不實(shí)現(xiàn)這個(gè)接口。
2)設(shè)計(jì)層面不同,抽象類作為很多子類的父類,它是一種模板式設(shè)計(jì)。而接口是一種行為規(guī)范,它是一種輻射式設(shè)計(jì)。什么是模板式設(shè)計(jì)?最簡(jiǎn)單例子,大家都用過(guò)ppt里面的模板,如果用模板A設(shè)計(jì)了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A,如果它們的公共部分需要改動(dòng),則只需要改動(dòng)模板A就可以了,不需要重新對(duì)ppt B和ppt C進(jìn)行改動(dòng)。而輻射式設(shè)計(jì),比如某個(gè)電梯都裝了某種報(bào)警器,一旦要更新報(bào)警器,就必須全部更新。也就是說(shuō)對(duì)于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實(shí)現(xiàn),子類可以不進(jìn)行變更;而對(duì)于接口則不行,如果接口進(jìn)行了變更,則所有實(shí)現(xiàn)這個(gè)接口的類都必須進(jìn)行相應(yīng)的改動(dòng)。
有關(guān)java抽象類的更詳細(xì)文章請(qǐng)查看《兩分鐘教會(huì)你在java中定義一個(gè)抽象類屬性》、《我是類!超級(jí)無(wú)敵大帥哥花澤類的類!》
門和警報(bào)的例子:
門都有open( )和close( )兩個(gè)動(dòng)作.
此時(shí)我們可以定義通過(guò)抽象類和接口來(lái)定義這個(gè)抽象概念:
public abstract class Door { public abstract void open(); public abstract void close(); } |
或者:
public interface Door { public abstract void open(); public abstract void close(); } |
但是現(xiàn)在如果我們需要門具有報(bào)警alarm( )的功能,那么該如何實(shí)現(xiàn)?
下面提供兩種思路:
1) 將這三個(gè)功能都放在抽象類里面,但是這樣一來(lái)所有繼承于這個(gè)抽象類的子類都具備了報(bào)警功能,但是有的門并不一定具備報(bào)警功能;
2) 將這三個(gè)功能都放在接口里面,需要用到報(bào)警功能的類就需要實(shí)現(xiàn)這個(gè)接口中的open( )和close( ),也許這個(gè)類根本就不具備open( )和close( )這兩個(gè)功能,比如火災(zāi)報(bào)警器。
從這里可以看出, Door的open() 、close()和alarm()根本就屬于兩個(gè)不同范疇內(nèi)的行為,open()和close()屬于門本身固有的行為特性,而alarm()屬于延伸的附加行為。因此最好的解決辦法是單獨(dú)將報(bào)警設(shè)計(jì)為一個(gè)接口,包含alarm()行為,Door設(shè)計(jì)為單獨(dú)的一個(gè)抽象類,包含open和close兩種行為。再設(shè)計(jì)一個(gè)報(bào)警門繼承Door類和實(shí)現(xiàn)Alarm接口。
public interface Alram { public void alarm(); } public abstract class Door { public abstract void open(); public abstract void close(); } public class AlarmDoor extends Door implements Alram { @Override public void alarm() { // TODO Auto-generated method stub } @Override public void open() { // TODO Auto-generated method stub } @Override public void close() { // TODO Auto-generated method stub } } |
到此,相信大家對(duì)“java繼承多態(tài)和抽象類接口知識(shí)點(diǎn)總結(jié)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!