继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
這篇博客將會涉及到:
- 繼承的概念和實現(xiàn)
- super關(guān)鍵字
- 方法重寫—Override
- Object常見方法
繼承的概念:
生活中,繼承的概念隨處可見,繼承需要符合的關(guān)系:is-a;父類更通用、子類更特殊更具體。就比如說:動物是一個類,那么它的子類可以是:食草動物、食肉動物。
- 對于java語言來說,繼承背后的思想就是基于已存在的類來構(gòu)建新類,當(dāng)從已存在類繼承時,就重用了它的方法和屬性,還可以添加新的方法和屬性來定制新類以應(yīng)付需求。約定: 從其他類導(dǎo)出的類叫做子類,被導(dǎo)出的類叫做父類。在java中,除了Object類之外,所有類都是子類,都只有唯一父類。就是在創(chuàng)建類的時候,如果不寫類繼承自哪一個類,系統(tǒng)會默認(rèn)的認(rèn)為是Object的子類,通過下圖方法可查看,一個類繼承的父類:
- 繼承在OOP中不可或缺(不寫繼承自哪一個類會默認(rèn)繼承Object類),創(chuàng)建一個類時總是在繼承,繼承的意義: 代碼重用、體現(xiàn)不同的抽象層次。父子類關(guān)系: 父類更抽象,更一般、子類更具體,更特殊。
- 在java語言中,用extends 關(guān)鍵字來表示一個類繼承了另外一個類,如下:
- extends使用示例:
super關(guān)鍵字:
super關(guān)鍵字的特點:
- super和this關(guān)鍵字的特點類似;super代表的是父類對象的引用
- 當(dāng)子父類的成員出現(xiàn)同名時,可以通過super來區(qū)分
- 子類構(gòu)造方法中,通過super關(guān)鍵字調(diào)用父類的構(gòu)造方法
- 在子類構(gòu)造方法中默認(rèn)都是調(diào)用了父類的構(gòu)造方法super()這個是無參數(shù)的,當(dāng)想調(diào)用父類的構(gòu)造方法是有參數(shù)的時候就要自己在子類的第一行輸入super(參數(shù))來調(diào)用父類的構(gòu)造方法。
- 強(qiáng)調(diào): 當(dāng)構(gòu)造一個子類對象的時候一定會先調(diào)用父類的構(gòu)造方法來初始化父類的字段。調(diào)用父類構(gòu)造方法的語句必須是子類構(gòu)造方法中的第一條指令。
- 注意: 子類只能調(diào)用父類的構(gòu)造方法來初始化參數(shù),當(dāng)然也可以在自己的構(gòu)造方法中添加一些父類構(gòu)造方法沒有的語句
- java繼承之私有權(quán)限:父類的私有屬性和私有方法不會被子類繼承,但是可以通過父類的公有方法來間接訪問父類的私有屬性
Object常見方法:
- java中,所有的類都可以直接或間接繼承自java.lang.Object類,可以說Object是java中所有類的祖先即根類。
- java任何類中都繼承了Object類中的方法,主要有:toString()、equals()、hashcode()、clone()、getClass()、finalize()
- String toString(): 返回該對象的字符串描述信息。默認(rèn)輸出格式是:類名[字段值,字段值…]。只要對象與一個字符串通過“+”連接,系統(tǒng)就會自動調(diào)用toString獲得對象的字符串描述符。常被改寫:可以根據(jù)用戶的需求對其進(jìn)行重寫。
- Boolean equals(): OBject類原始功能是實現(xiàn)判斷兩個對象是否具有相同的引用,要求判斷兩個對象狀態(tài)的相等性。
繼承學(xué)習(xí)綜合練習(xí):
class Wapon {String name;void WaponAttack(){System.out.println("武器攻擊"); }} class K98 extends Wapon {void WaponAttack()//重寫父類方法{System.out.println("98K攻擊");System.out.println("一擊斃命");} } class Dao extends Wapon {void WaponAttack()//重寫父類方法{System.out.println("砍刀攻擊");System.out.println("刀刀見血");} } class Play {String name;String level;Wapon wapon;int id;void attack(){System.out.println("玩家攻擊");wapon.WaponAttack();} } public class Main {public static void main(String[] args) {Play p1=new Play();p1.name="玩家一";p1.level="青銅";//p1.wapon =new Wapon();p1.wapon =new Dao();//多態(tài)p1.attack();//如果直接寫這句話,會出現(xiàn)空指針異常,要先給wapon賦值再使用System.out.println();p1.wapon =new K98();//多態(tài)p1.attack();//如果直接寫這句話,會出現(xiàn)空指針異常,要先給wapon賦值再使用} }java繼承的簡單工廠模式:
- 工廠模式之前在寫智能家居的代碼的時候用C語言加鏈表實現(xiàn)過,在用C語言實現(xiàn)時,就是構(gòu)建了連個鏈表分別代表指令工廠和控制工廠,然后將設(shè)備通過添加節(jié)點的方式插入到對應(yīng)的鏈表,在使用的時候,通過設(shè)備或者指令名稱進(jìn)行查找然后調(diào)用相關(guān)的函數(shù),實現(xiàn)起來比較繁瑣。
- 而在java中有了繼承的概念,就可以將那些結(jié)點看作是繼承自一個父類的子類,然后構(gòu)建一個查找的類對所需要的內(nèi)容進(jìn)行查找即可,查找到返回查找的對象的引用,然后就可以調(diào)用相關(guān)的方法。實現(xiàn)起來比較簡單。
抽象類:
Java中可以定義沒有方法體的方法,該方法由子類來具體實現(xiàn)。該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類。
- 抽象方法的特點:① 只有方法頭沒有方法體的方法稱為抽象方法。② 抽象方法用abstract來修飾。③ 抽象方法代表一種不確定的操作或者行為。④ 抽象方法不能被調(diào)用。⑤ 抽象類代表一種抽象的對象類型。 ⑥ 抽象類不能實例化 ⑦ 抽象類中可以有具體方法,可以沒有抽象方法。
模板方法模式(也是抽象類的一種使用方法):
定義: 一個模板方法用一些抽象的操作定義一個算法,而子類將重定義這些操作以提供具體行為。
意圖: 定義了一個操作中的一個算法框架,把一些步驟推遲到子類去實現(xiàn),模板方法讓子類不需要改變算法結(jié)構(gòu)。
具體的代碼示例:
abstract class Contrl //這個控制類只是做一個模板放到這里,因為每一個抽象方法實現(xiàn)不一樣 {abstract void initUsart();abstract void getComand();abstract void openCure();abstract void openLight();abstract void OpenTv();public void work() //這個方法里面是一系列的控制流程里面是抽象方法{initUsart();getComand();openCure();openLight();OpenTv();} } class STM32contrl extends Contrl //繼承自contrl這個類然后會讓我們實現(xiàn)父類這個抽象類的所有抽象方法 {void OpenTv() {// TODO Auto-generated method stubSystem.out.println("STM32 OpenTv");}void getComand() {// TODO Auto-generated method stubSystem.out.println("STM32 getComand");}void initUsart() {// TODO Auto-generated method stubSystem.out.println("STM32 initUsart");}void openCure() {// TODO Auto-generated method stubSystem.out.println("STM32 openCure");}void openLight() {// TODO Auto-generated method stubSystem.out.println("STM32 openLight");} } class C51contrl extends Contrl //繼承自contrl這個類然后會讓我們實現(xiàn)父類這個抽象類的所有抽象方法 {void OpenTv() {// TODO Auto-generated method stubSystem.out.println("C51 OpenTv");}void getComand() {// TODO Auto-generated method stubSystem.out.println("C51 getComand");}void initUsart() {// TODO Auto-generated method stubSystem.out.println("C51 initUsart");}void openCure() {// TODO Auto-generated method stubSystem.out.println("C51 openCure");}void openLight() {// TODO Auto-generated method stubSystem.out.println("C51 openLight");} } public class Main {public static void main(String[] args) {STM32contrl stm32=new STM32contrl();stm32.work();//STM32contrl這個類也繼承了Contrl的work方法,該方法是總的控制流程C51contrl c51=new C51contrl();c51.work();} }接口的概念和作用:
接口語法:interface 接口{ //公有靜態(tài)方法、抽象方法 }
接口的特點: ① 接口中只能存放靜態(tài)常量和抽象方法 ② java接口是對功能的拓展 ③ 通過實現(xiàn)接口,java類可以實現(xiàn)多實現(xiàn) ④ 一個類可以同時繼承(extends)一個父類并且實現(xiàn)(implement)多個接口 ⑤ 接口與接口之間可以使用extends實現(xiàn)繼承。
接口與抽象類的區(qū)別:
- 抽象類和具體實現(xiàn)之間是一個繼承關(guān)系,也就是如果采用抽象類的方式,則父類和子類在概念上應(yīng)該是相同的。
- 接口和實現(xiàn)類在概念上不要求相同,接口只是抽取相互之間沒有關(guān)系的類的共同特征,而不去關(guān)注類之間的關(guān)系,它可以使沒有層次關(guān)系的類具有相同的行為。
- 抽象類是對一組具有相同屬性和行為的邏輯上上有關(guān)系的事物的一種抽象,而接口則是對一組具有相同屬性和行為的邏輯上不相關(guān)的事物的一種抽象。
內(nèi)部類:
- 概念: 所謂的內(nèi)部類(Inner Class),顧名思義,就是將一個類定義在另一個類的內(nèi)部,內(nèi)部的類稱之為內(nèi)部類。
- 特點: ① 內(nèi)部類可以很好的實現(xiàn)隱藏,可以使用protected、private修飾符。② 內(nèi)部類可以直接訪問外部類所有成員包括私有成員。③ 外部類不能直接訪問內(nèi)部類的成員,必須首先建立內(nèi)部類對象才能訪問。
- 成員內(nèi)部類及應(yīng)用: ① 成員內(nèi)部類屬于外部類的實例成員,成員內(nèi)部類可以有public、private、default、protected權(quán)限修飾符。在成員內(nèi)部類中訪問外部類的成員方法和屬性,要使用“外部類名.this.成員方法”和“外部類名.this.成員屬性”的形式 。② 創(chuàng)建成員內(nèi)部類的實例使用“外部類名.內(nèi)部類名 實例=外部類實例名.new 內(nèi)部類 構(gòu)造方法(參數(shù))”的形式。
- 成員內(nèi)部類有以下限制: ① 成員內(nèi)部類不能與外部類重名 ② 不能在成員內(nèi)部類中定義static屬性,方法和類(static、final形式的常量定義除外),因為一個成員內(nèi)部類實例必然與一個外部類實例關(guān)聯(lián),static成員完全可以移到其外部類中去。
- 在一個java文件中只能有一個public類,如果有多個就要放在其他文件中
匿名內(nèi)部類及應(yīng)用:
- 內(nèi)部匿名類: 一個帶具體實現(xiàn)的父類或者父接口的匿名的子類對象。
- 匿名內(nèi)部類的特點: ① 匿名內(nèi)部類是沒有名稱的內(nèi)部類,沒辦法引用他們。必須在創(chuàng)建時,作為new語句的一部分來聲明并創(chuàng)建他們的實例。② 匿名內(nèi)部類必須繼承一個類(抽象的、非抽象的都可以)或者實現(xiàn)一個接口,所有的父類(或者父接口)是抽象類,則匿名內(nèi)部類必須實現(xiàn)其所有抽象的方法。
- 語法: 實例一個匿名內(nèi)部類----> new interface/superclass(){類體}這形式的new語句聲明一個新的匿名類,它對一個給定的類進(jìn)行擴(kuò)展,或者實現(xiàn)一個給定的接口,并同時創(chuàng)建該匿名類的一個新實例。
總結(jié)
以上是生活随笔為你收集整理的继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(86):Interage方
- 下一篇: 多态的概念、对象上下转型、多态的应用、异