1. 程式人生 > >Java 知識點整理-3.面向物件(多型、抽象類、介面)

Java 知識點整理-3.面向物件(多型、抽象類、介面)

1、多型概述:事物存在的多種形態。

2、多型前提:要有繼承關係;要有方法重寫;要有父類引用指向子類物件(父類名 識別符號 = new 子類名();)。

3、多型中的成員訪問特點:Ⅰ.成員變數:編譯看左邊(父類),執行看左邊(父類)。

4、多型中的成員訪問特點:Ⅱ.成員方法:編譯看左邊(父類),執行看右邊(子類)。編譯時看父類有沒有這個方法,執行時呼叫子類的這個方法。(動態繫結,這也是抽象類和介面例項化的關鍵)真正進棧的是子類的這個方法。如果父類沒有該方法,則編譯失敗。如果子類沒有該方法,則呼叫父類該方法,相當於子類繼承該方法。

5、Ⅱ.成員方法:編譯看左邊(父類),執行看右邊(子類)。編譯時看父類有沒有這個方法,執行時呼叫子類的這個方法。(動態繫結,這也是抽象類和介面例項化的關鍵)真正進棧的是子類的這個方法。如果父類沒有該方法,則編譯失敗。如果子類沒有該方法,則呼叫父類該方法,相當於子類繼承該方法。

6、多型中向上轉型:Person p = new SuperMan(); 父類 識別符號1 = new 子類(); 父類引用指向子類物件就是向上轉型。

7、多型中向下轉型:SuperMan sm = (SuperMan)p; 子類 識別符號2 = (子類)識別符號1; 引用資料型別先有向上轉型,才有向下轉型。變化的都是子類物件。

8、多型的好處:Ⅰ.提高了程式碼的維護性(繼承保證)。

9、多型的好處:Ⅱ.提高了程式碼的擴充套件性(由多型保證)。方法名(new 子類());  pubic static void 方法名(父類 形式引數){} 可以當作形式引數,可以接收任意子類物件。

開發時很少在建立物件的時候用父類引用指向子類物件,直接建立子類物件更方便,可以使用子類中的特有屬性和行為。當做引數的時候用多型最好,因為拓展性強。

10、 多型的弊端:不能使用子類的特有屬性和行為。

11、關鍵字 instanceof 判斷前邊的引用是否是後邊的資料型別。

12、抽象類概述:抽象就是看不懂的。

13、抽象類特點:Ⅰ.抽象類和抽象方法必須用abstract關鍵字修飾 abstract class 類名 {} public abstract void 方法名(); 無大括號,謹記!

14、抽象類特點:Ⅱ.抽象類不一定有抽象方法(可以沒有,全是成員方法,這樣做的目的是不讓其他類建立本類物件,交給子類完成),有抽象方法的類一定是抽象類或者是介面。

15、抽象類特點:Ⅲ.抽象類不能例項化,如果非要例項化,可以按照多型的方式,由具體的子類例項化。其實這也是多型的一種,抽象類多型。父類 識別符號 = new 子類(); 父類抽象方法保證編譯通過,子類成員方法保證正常執行。

16、Ⅳ.抽象類的子類:要麼是抽象類 abstract class 子類名 extends 父類名{} 要麼重寫抽象類中的所有抽象方法(強制)。

17、抽象類的成員特點:Ⅰ.成員變數:既可以是變數(資料型別 識別符號 = 顯示初始化值;),也可以是常量(final 資料型別 識別符號 = 顯示初始化值;)。abstract不能修飾成員變數。

18、抽象類的成員特點:Ⅱ.構造方法:有構造方法,用於子類訪問父類資料的初始化。

19、抽象類的成員特點:Ⅲ.成員方法:既可以是抽象的,子類必須強制重寫。也可以是非抽象的,子類直接繼承,就可以使用。

20、抽象類的成員方法特性:Ⅰ.抽象方法 對子類宣告一種規則,強制要求子類做的事情。

21、抽象類的成員方法特性:Ⅱ.非抽象方法:子類繼承的事情,提高程式碼複用性。

22、abstract不能與static共存(非法的修飾符組合。static修飾的方法可以用類名.呼叫,但被abstract修飾的方法沒有方法體,所以無意義)。

23、abstract不能與final共存(非法的修飾符組合。final修飾的方法不讓子類重寫,但被abstract修飾的方法強制子類重寫,所以他倆矛盾)。

24、abstract不能與private共存(非法的修飾符組合。private修飾的方法不讓子類訪問,abstract修飾的方法是為了讓子類看到並強制重寫,所以他倆也矛盾)。

25、介面概述:從狹義的角度講就是指java中的interface,從廣義的角度講對外提供規則的都是介面。介面編譯後生成的也是位元組碼檔案.class。

26、介面特點:Ⅰ.介面用關鍵字interface表示(interface 介面名 {public abstract void 方法名();})

27、介面特點:Ⅱ.類實現介面用implements表示(class 類名 implements 介面名 {public void 方法名(){}})

28、介面特點:Ⅲ.介面不能例項化,如果非要例項化,可以按照多型的方式來例項化(介面名 識別符號 = new 類名(); 識別符號.方法名();)。

29、介面特點:Ⅳ.介面的子類:可以是抽象類,但意義不大。可以是具體類,但要重寫介面中的所有方法(父類引用指向子類物件)。(推薦)

30、介面的成員特點:Ⅰ.成員變數:只能是常量,並且是靜態的並公開的(介面中定義的值是最終變數(即常量)只能訪問,不能改變)。預設修飾符:pubic static final (他們仨關鍵字無順序,可以互相換位置),建議自己手動給出。

31、介面的成員特點:Ⅱ.構造方法:介面沒有構造方法(不能定義非抽象方法,即帶有主體{}的方法)。如果一個類不寫繼承任何類,則預設繼承Object類。那才是親爹,介面是乾爹,即使沒有構造方法,子類構造方法的super():不會訪問他,所以不會出錯。

32、介面的成員特點:Ⅲ.成員方法:只能是抽象方法。預設修飾符:public abstract ,建議自己手動給出。

33、 靜態是指可以被類名.,介面名.直接呼叫的成員。

34、類與類的關係:繼承關係,只能單繼承,可以多層繼承。

35、類與介面的關係:Ⅰ.實現關係,可以單實現,也可以多實現。(class 類名 implements 介面1,介面2……{} 因為介面內的方法是抽象的,沒有方法體,不會有具體的方法實現。所以類多實現介面會重寫不同介面的同名方法,不會出問題 。

36、 類與介面的關係:Ⅱ.並且還可以在繼承一個類的同時實現多個介面。

37、介面與介面的關係:介面不能實現介面,只能是繼承關係,可以單繼承,也可以多繼承。

38、總結:一樣的是繼承(類與類,介面與介面),不一樣的是實現(類與介面)。介面的出現打破了單繼承的侷限性。

39、抽象類和介面的區別:Ⅰ.成員區別:ⅰ.抽象類:成員變數可以是變數,也可以是常量(final)。有構造方法。成員方法可以抽象,也可以非抽象。ⅱ.介面:成員變數只可以是常量。成員方法只可以是抽象方法。

40、抽象類和介面的區別:Ⅱ.關係區別:ⅰ.類與類:繼承,單繼承。ⅱ.類與介面:實現,單實現,多實現。ⅲ.介面與介面:繼承,單繼承,多繼承。

41、抽象類和介面的區別:Ⅲ.設計理念區別:ⅰ.抽象類 被繼承體現的是:“is a”的關係。抽象類中定義的是該繼承體系的共性功能。ⅱ.介面 被實現體現的是:“like a”的關係。介面中定義的是該繼承體系的擴充套件功能。