Java是一種可以撰寫(xiě)跨平臺(tái)應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言码荔。Java 技術(shù)具有卓越的通用性瞎颗、高效性典徊、平臺(tái)移植性和安全性,廣泛應(yīng)用于PC纽哥、數(shù)據(jù)中心、游戲控制臺(tái)栖秕、科學(xué)超級(jí)計(jì)算機(jī)春塌、移動(dòng)電話(huà)和互聯(lián)網(wǎng),同時(shí)擁有全球最大的開(kāi)發(fā)者專(zhuān)業(yè)社群簇捍。
給你學(xué)習(xí)路線:html-css-js-jq-javase-數(shù)據(jù)庫(kù)-jsp-servlet-Struts2-hibernate-mybatis-spring4-springmvc-ssh-ssm
繼承的概念
繼承是java面向?qū)ο缶幊碳夹g(shù)的一塊基石只壳,因?yàn)樗试S創(chuàng)建分等級(jí)層次的類(lèi)。
繼承就是子類(lèi)繼承父類(lèi)的特征和行為暑塑,使得子類(lèi)對(duì)象(實(shí)例)具有父類(lèi)的實(shí)例域和方法吼句,或子類(lèi)從父類(lèi)繼承方法,使得子類(lèi)具有父類(lèi)相同的行為事格。
生活中的繼承:
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 七六零惕艳,二五零,五四一 】驹愚,無(wú)論你是大牛還是小白远搪,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具逢捺,很多干貨和技術(shù)資料分享谁鳍!
兔子和羊?qū)儆谑巢輨?dòng)物類(lèi),獅子和豹屬于食肉動(dòng)物類(lèi)。
食草動(dòng)物和食肉動(dòng)物又是屬于動(dòng)物類(lèi)倘潜。
所以繼承需要符合的關(guān)系是:is-a余佛,父類(lèi)更通用,子類(lèi)更具體窍荧。
雖然食草動(dòng)物和食肉動(dòng)物都是屬于動(dòng)物辉巡,但是兩者的屬性和行為上有差別,所以子類(lèi)會(huì)具有父類(lèi)的一般特性也會(huì)具有自身的特性蕊退。
類(lèi)的繼承格式
在 Java 中通過(guò) extends 關(guān)鍵字可以申明一個(gè)類(lèi)是從另外一個(gè)類(lèi)繼承而來(lái)的郊楣,一般形式如下:
類(lèi)的繼承格式
class 父類(lèi) {}class 子類(lèi) extends 父類(lèi) {}
為什么需要繼承
接下來(lái)我們通過(guò)實(shí)例來(lái)說(shuō)明這個(gè)需求。
開(kāi)發(fā)動(dòng)物類(lèi)瓤荔,其中動(dòng)物分別為企鵝以及老鼠净蚤,要求如下:
企鵝:屬性(姓名,id)输硝,方法(吃今瀑,睡,自我介紹)
老鼠:屬性(姓名点把,id)橘荠,方法(吃,睡郎逃,自我介紹)
企鵝類(lèi):
老鼠類(lèi):
從這兩段代碼可以看出來(lái)哥童,代碼存在重復(fù)了,導(dǎo)致后果就是代碼量大且臃腫褒翰,而且維護(hù)性不高(維護(hù)性主要是后期需要修改的時(shí)候贮懈,就需要修改很多的代碼,容易出錯(cuò))优训,所以要從根本上解決這兩段代碼的問(wèn)題朵你,就需要繼承,將兩段代碼中相同的部分提取出來(lái)組成 一個(gè)父類(lèi):
公共父類(lèi):
這個(gè)Animal類(lèi)就可以作為一個(gè)父類(lèi)揣非,然后企鵝類(lèi)和老鼠類(lèi)繼承這個(gè)類(lèi)之后抡医,就具有父類(lèi)當(dāng)中的屬性和方法,子類(lèi)就不會(huì)存在重復(fù)的代碼妆兑,維護(hù)性也提高魂拦,代碼也更加簡(jiǎn)潔毛仪,提高代碼的復(fù)用性(復(fù)用性主要是可以多次使用搁嗓,不用再多次寫(xiě)同樣的代碼)繼承之后的代碼:
企鵝類(lèi):
老鼠類(lèi):
繼承的特性
子類(lèi)擁有父類(lèi)非private的屬性,方法箱靴。
子類(lèi)可以擁有自己的屬性和方法腺逛,即子類(lèi)可以對(duì)父類(lèi)進(jìn)行擴(kuò)展。
子類(lèi)可以用自己的方式實(shí)現(xiàn)父類(lèi)的方法衡怀。
Java的繼承是單繼承棍矛,但是可以多重繼承安疗,單繼承就是一個(gè)子類(lèi)只能繼承一個(gè)父類(lèi),多重繼承就是够委,例如A類(lèi)繼承B類(lèi)荐类,B類(lèi)繼承C類(lèi),所以按照關(guān)系就是C類(lèi)是B類(lèi)的父類(lèi)茁帽,B類(lèi)是A類(lèi)的父類(lèi)玉罐,這是java繼承區(qū)別于C++繼承的一個(gè)特性。
提高了類(lèi)之間的耦合性(繼承的缺點(diǎn)潘拨,耦合度高就會(huì)造成代碼之間的聯(lián)系)吊输。
繼承關(guān)鍵字
繼承可以使用 extends 和 implements 這兩個(gè)關(guān)鍵字來(lái)實(shí)現(xiàn)繼承,而且所有的類(lèi)都是繼承于 java.lang.Object铁追,當(dāng)一個(gè)類(lèi)沒(méi)有繼承的兩個(gè)關(guān)鍵字季蚂,則默認(rèn)繼承object(這個(gè)類(lèi)在 java.lang 包中,所以不需要 import)祖先類(lèi)琅束。
extends關(guān)鍵字
在 Java 中扭屁,類(lèi)的繼承是單一繼承,也就是說(shuō)涩禀,一個(gè)子類(lèi)只能擁有一個(gè)父類(lèi)疯搅,所以 extends 只能繼承一個(gè)類(lèi)。
extends 關(guān)鍵字
implements關(guān)鍵字
使用 implements 關(guān)鍵字可以變相的使java具有多繼承的特性埋泵,使用范圍為類(lèi)繼承接口的情況幔欧,可以同時(shí)繼承多個(gè)接口(接口跟接口之間采用逗號(hào)分隔)。
super 與 this 關(guān)鍵字
super關(guān)鍵字:我們可以通過(guò)super關(guān)鍵字來(lái)實(shí)現(xiàn)對(duì)父類(lèi)成員的訪問(wèn)丽声,用來(lái)引用當(dāng)前對(duì)象的父類(lèi)礁蔗。
this關(guān)鍵字:指向自己的引用。
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 七六零雁社,二五零浴井,五四一 】,無(wú)論你是大牛還是小白霉撵,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)磺浙!裙內(nèi)有開(kāi)發(fā)工具,很多干貨和技術(shù)資料分享徒坡!
輸出結(jié)果為:
super.i = 50, this.i = 100
final關(guān)鍵字
final 關(guān)鍵字聲明類(lèi)可以把類(lèi)定義為不能繼承的撕氧,即最終類(lèi);或者用于修飾方法喇完,該方法不能被子類(lèi)重寫(xiě):
聲明類(lèi):
final class 類(lèi)名 {//類(lèi)體}
聲明方法:
修飾符(public/private/default/protected) final 返回值類(lèi)型 方法名(){//方法體}
注:實(shí)例變量也可以被定義為 final伦泥,被定義為 final 的變量不能被修改。被聲明為 final 類(lèi)的方法自動(dòng)地聲明為 final,但是實(shí)例變量并不是 final
構(gòu)造器
子類(lèi)不能繼承父類(lèi)的構(gòu)造器(構(gòu)造方法或者構(gòu)造函數(shù))不脯,但是父類(lèi)的構(gòu)造器帶有參數(shù)的府怯,則必須在子類(lèi)的構(gòu)造器中顯式地通過(guò)super關(guān)鍵字調(diào)用父類(lèi)的構(gòu)造器并配以適當(dāng)?shù)膮?shù)列表。
如果父類(lèi)有無(wú)參構(gòu)造器防楷,則在子類(lèi)的構(gòu)造器中用super調(diào)用父類(lèi)構(gòu)造器不是必須的牺丙,如果沒(méi)有使用super關(guān)鍵字,系統(tǒng)會(huì)自動(dòng)調(diào)用父類(lèi)的無(wú)參構(gòu)造器复局。
java 中若要在子類(lèi)調(diào)用父類(lèi)的方法赘被,需使用關(guān)鍵字super。
面向?qū)ο缶幊獭^承和多態(tài)
1肖揣、為什么使用繼承
從已有的類(lèi)派生出新的類(lèi)民假,稱(chēng)為繼承。
在不同的類(lèi)中也可能會(huì)有共同的特征和動(dòng)作龙优,可以把這些共同的特征和動(dòng)作放在一個(gè)類(lèi)中羊异,讓其它類(lèi)共享。
因此可以定義一個(gè)通用類(lèi)彤断,然后將其擴(kuò)展為其它多個(gè)特定類(lèi)野舶,這些特定類(lèi)繼承通用類(lèi)中的特征和動(dòng)作。
繼承是 Java 中實(shí)現(xiàn)軟件重用的重要手段宰衙,避免重復(fù)平道,易于維護(hù),易于理解供炼。
2一屋、父類(lèi)和子類(lèi)
如果類(lèi) B 從類(lèi) A 派生,或者說(shuō)類(lèi) B 擴(kuò)展自類(lèi) A袋哼,或者說(shuō)類(lèi) B 繼承類(lèi) A冀墨,
則稱(chēng)類(lèi) A 為"父類(lèi)",也稱(chēng)為超類(lèi)涛贯、基類(lèi)诽嘉;
稱(chēng)類(lèi) B 為"子類(lèi)",也稱(chēng)為次類(lèi)弟翘、擴(kuò)展類(lèi)虫腋、派生類(lèi)。
子類(lèi)從它的父類(lèi)中繼承可訪問(wèn)的數(shù)據(jù)域和方法稀余,也可以添加新的數(shù)據(jù)域和新的方法悦冀。
定義繼承的語(yǔ)法:
修飾符 class 子類(lèi)名 extends 父類(lèi)名
例如:Shape 類(lèi)是父類(lèi),其子類(lèi)可以有 Circle 類(lèi)滚躯、Rectangle 類(lèi)雏门、Triangle 類(lèi),等等掸掏。
繼承的注意點(diǎn):
3茁影、super 關(guān)鍵字
super 表示使用它的類(lèi)的父類(lèi)。super 可用于:
調(diào)用父類(lèi)的構(gòu)造方法語(yǔ)法:
super(); 或 super(參數(shù)列表);
注意:super 語(yǔ)句必須是子類(lèi)構(gòu)造方法的第一條語(yǔ)句丧凤。不能在子類(lèi)中使用父類(lèi)構(gòu)造方法名來(lái)調(diào)用父類(lèi)構(gòu)造方法募闲。 父類(lèi)的構(gòu)造方法不被子類(lèi)繼承。調(diào)用父類(lèi)的構(gòu)造方法的唯一途徑是使用 super 關(guān)鍵字愿待,如果子類(lèi)中沒(méi)顯式調(diào)用浩螺,則編譯器自動(dòng)將 super(); 作為子類(lèi)構(gòu)造方法的第一條語(yǔ)句。這會(huì)形成一個(gè)構(gòu)造方法鏈仍侥。
靜態(tài)方法中不能使用 super 關(guān)鍵字要出。
調(diào)用父類(lèi)的方法語(yǔ)法:
super.方法名(參數(shù)列表);
如果是繼承的方法,是沒(méi)有必要使用 super 來(lái)調(diào)用农渊,直接即可調(diào)用患蹂。但如果子類(lèi)覆蓋或重寫(xiě)了父類(lèi)的方法,則只有使用 super 才能在子類(lèi)中調(diào)用父類(lèi)中的被重寫(xiě)的方法砸紊。
4传于、this 關(guān)鍵字
this 關(guān)鍵字表示當(dāng)前對(duì)象∽硗纾可用于:
調(diào)用當(dāng)前類(lèi)的構(gòu)造方法沼溜,并且必須是方法的第一條語(yǔ)句。如:this(); 調(diào)用默認(rèn)構(gòu)造方法游添。this(參數(shù)); 調(diào)用帶參構(gòu)造方法系草。
限定當(dāng)前對(duì)象的數(shù)據(jù)域變量。一般用于方法內(nèi)的局部變量與對(duì)象的數(shù)據(jù)域變量同名的情況唆涝。如 this.num = num悄但。this.num 表示當(dāng)前對(duì)象的數(shù)據(jù)域變量 num,而 num 表示方法中的局部變量石抡。
調(diào)用父類(lèi)的構(gòu)造方法檐嚣;
調(diào)用父類(lèi)的方法(子類(lèi)覆蓋了父類(lèi)的方法時(shí));
訪問(wèn)父類(lèi)的數(shù)據(jù)域(可以這樣用但沒(méi)有必要這樣用)啰扛。
子類(lèi)不是父類(lèi)的子集嚎京,子類(lèi)一般比父類(lèi)包含更多的數(shù)據(jù)域和方法。
父類(lèi)中的 private 數(shù)據(jù)域在子類(lèi)中是不可見(jiàn)的隐解,因此在子類(lèi)中不能直接使用它們鞍帝。
繼承是為"是一個(gè)"的關(guān)系建模的,父類(lèi)和其子類(lèi)間必須存在"是一個(gè)"的關(guān)系煞茫,否則不能用繼承帕涌。
小編推薦一個(gè)學(xué)Java的學(xué)習(xí)裙【 七六零摄凡,二五零,五四一 】蚓曼,無(wú)論你是大牛還是小白亲澡,是想轉(zhuǎn)行還是想入行都可以來(lái)了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開(kāi)發(fā)工具纫版,很多干貨和技術(shù)資料分享床绪!
但也并不是所有"是一個(gè)"的關(guān)系都應(yīng)該用繼承。例如其弊,正方形是一個(gè)矩形癞己,但不能讓 Square 類(lèi)來(lái)繼承 Rectangle 類(lèi),因?yàn)檎叫尾荒軓木匦螖U(kuò)展得到任何東西梭伐。正確的繼承關(guān)系是 Square 類(lèi)繼承 Shape 類(lèi)
Java 只允許單一繼承(即一個(gè)子類(lèi)只能有一個(gè)直接父類(lèi))痹雅,C++ 可以多重繼承(即一個(gè)子類(lèi)有多個(gè)直接父類(lèi))。