继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
生活随笔
收集整理的這篇文章主要介紹了
继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇博客將會涉及到:
- 繼承的概念和實現
- super關鍵字
- 方法重寫—Override
- Object常見方法
繼承的概念:
生活中,繼承的概念隨處可見,繼承需要符合的關系:is-a;父類更通用、子類更特殊更具體。就比如說:動物是一個類,那么它的子類可以是:食草動物、食肉動物。
- 對于java語言來說,繼承背后的思想就是基于已存在的類來構建新類,當從已存在類繼承時,就重用了它的方法和屬性,還可以添加新的方法和屬性來定制新類以應付需求。約定: 從其他類導出的類叫做子類,被導出的類叫做父類。在java中,除了Object類之外,所有類都是子類,都只有唯一父類。就是在創建類的時候,如果不寫類繼承自哪一個類,系統會默認的認為是Object的子類,通過下圖方法可查看,一個類繼承的父類:
- 繼承在OOP中不可或缺(不寫繼承自哪一個類會默認繼承Object類),創建一個類時總是在繼承,繼承的意義: 代碼重用、體現不同的抽象層次。父子類關系: 父類更抽象,更一般、子類更具體,更特殊。
- 在java語言中,用extends 關鍵字來表示一個類繼承了另外一個類,如下:
- extends使用示例:
super關鍵字:
super關鍵字的特點:
- super和this關鍵字的特點類似;super代表的是父類對象的引用
- 當子父類的成員出現同名時,可以通過super來區分
- 子類構造方法中,通過super關鍵字調用父類的構造方法
- 在子類構造方法中默認都是調用了父類的構造方法super()這個是無參數的,當想調用父類的構造方法是有參數的時候就要自己在子類的第一行輸入super(參數)來調用父類的構造方法。
- 強調: 當構造一個子類對象的時候一定會先調用父類的構造方法來初始化父類的字段。調用父類構造方法的語句必須是子類構造方法中的第一條指令。
- 注意: 子類只能調用父類的構造方法來初始化參數,當然也可以在自己的構造方法中添加一些父類構造方法沒有的語句
- java繼承之私有權限:父類的私有屬性和私有方法不會被子類繼承,但是可以通過父類的公有方法來間接訪問父類的私有屬性
Object常見方法:
- java中,所有的類都可以直接或間接繼承自java.lang.Object類,可以說Object是java中所有類的祖先即根類。
- java任何類中都繼承了Object類中的方法,主要有:toString()、equals()、hashcode()、clone()、getClass()、finalize()
- String toString(): 返回該對象的字符串描述信息。默認輸出格式是:類名[字段值,字段值…]。只要對象與一個字符串通過“+”連接,系統就會自動調用toString獲得對象的字符串描述符。常被改寫:可以根據用戶的需求對其進行重寫。
- Boolean equals(): OBject類原始功能是實現判斷兩個對象是否具有相同的引用,要求判斷兩個對象狀態的相等性。
繼承學習綜合練習:
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();//多態p1.attack();//如果直接寫這句話,會出現空指針異常,要先給wapon賦值再使用System.out.println();p1.wapon =new K98();//多態p1.attack();//如果直接寫這句話,會出現空指針異常,要先給wapon賦值再使用} }java繼承的簡單工廠模式:
- 工廠模式之前在寫智能家居的代碼的時候用C語言加鏈表實現過,在用C語言實現時,就是構建了連個鏈表分別代表指令工廠和控制工廠,然后將設備通過添加節點的方式插入到對應的鏈表,在使用的時候,通過設備或者指令名稱進行查找然后調用相關的函數,實現起來比較繁瑣。
- 而在java中有了繼承的概念,就可以將那些結點看作是繼承自一個父類的子類,然后構建一個查找的類對所需要的內容進行查找即可,查找到返回查找的對象的引用,然后就可以調用相關的方法。實現起來比較簡單。
抽象類:
Java中可以定義沒有方法體的方法,該方法由子類來具體實現。該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類。
- 抽象方法的特點:① 只有方法頭沒有方法體的方法稱為抽象方法。② 抽象方法用abstract來修飾。③ 抽象方法代表一種不確定的操作或者行為。④ 抽象方法不能被調用。⑤ 抽象類代表一種抽象的對象類型。 ⑥ 抽象類不能實例化 ⑦ 抽象類中可以有具體方法,可以沒有抽象方法。
模板方法模式(也是抽象類的一種使用方法):
定義: 一個模板方法用一些抽象的操作定義一個算法,而子類將重定義這些操作以提供具體行為。
意圖: 定義了一個操作中的一個算法框架,把一些步驟推遲到子類去實現,模板方法讓子類不需要改變算法結構。
具體的代碼示例:
abstract class Contrl //這個控制類只是做一個模板放到這里,因為每一個抽象方法實現不一樣 {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這個類然后會讓我們實現父類這個抽象類的所有抽象方法 {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這個類然后會讓我們實現父類這個抽象類的所有抽象方法 {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 接口{ //公有靜態方法、抽象方法 }
接口的特點: ① 接口中只能存放靜態常量和抽象方法 ② java接口是對功能的拓展 ③ 通過實現接口,java類可以實現多實現 ④ 一個類可以同時繼承(extends)一個父類并且實現(implement)多個接口 ⑤ 接口與接口之間可以使用extends實現繼承。
接口與抽象類的區別:
- 抽象類和具體實現之間是一個繼承關系,也就是如果采用抽象類的方式,則父類和子類在概念上應該是相同的。
- 接口和實現類在概念上不要求相同,接口只是抽取相互之間沒有關系的類的共同特征,而不去關注類之間的關系,它可以使沒有層次關系的類具有相同的行為。
- 抽象類是對一組具有相同屬性和行為的邏輯上上有關系的事物的一種抽象,而接口則是對一組具有相同屬性和行為的邏輯上不相關的事物的一種抽象。
內部類:
- 概念: 所謂的內部類(Inner Class),顧名思義,就是將一個類定義在另一個類的內部,內部的類稱之為內部類。
- 特點: ① 內部類可以很好的實現隱藏,可以使用protected、private修飾符。② 內部類可以直接訪問外部類所有成員包括私有成員。③ 外部類不能直接訪問內部類的成員,必須首先建立內部類對象才能訪問。
- 成員內部類及應用: ① 成員內部類屬于外部類的實例成員,成員內部類可以有public、private、default、protected權限修飾符。在成員內部類中訪問外部類的成員方法和屬性,要使用“外部類名.this.成員方法”和“外部類名.this.成員屬性”的形式 。② 創建成員內部類的實例使用“外部類名.內部類名 實例=外部類實例名.new 內部類 構造方法(參數)”的形式。
- 成員內部類有以下限制: ① 成員內部類不能與外部類重名 ② 不能在成員內部類中定義static屬性,方法和類(static、final形式的常量定義除外),因為一個成員內部類實例必然與一個外部類實例關聯,static成員完全可以移到其外部類中去。
- 在一個java文件中只能有一個public類,如果有多個就要放在其他文件中
匿名內部類及應用:
- 內部匿名類: 一個帶具體實現的父類或者父接口的匿名的子類對象。
- 匿名內部類的特點: ① 匿名內部類是沒有名稱的內部類,沒辦法引用他們。必須在創建時,作為new語句的一部分來聲明并創建他們的實例。② 匿名內部類必須繼承一個類(抽象的、非抽象的都可以)或者實現一個接口,所有的父類(或者父接口)是抽象類,則匿名內部類必須實現其所有抽象的方法。
- 語法: 實例一個匿名內部類----> new interface/superclass(){類體}這形式的new語句聲明一個新的匿名類,它對一個給定的類進行擴展,或者實現一個給定的接口,并同時創建該匿名類的一個新實例。
總結
以上是生活随笔為你收集整理的继承的概念和实现 、 super关键字 、 Object常见方法、抽象类、接口、模板方法模式、成员内部类、匿名内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(86):Interage方
- 下一篇: Linux内核驱动目录功能说明