1. 程式人生 > >3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override

3.Java面向物件程式設計OOA/OOP/OOD/OOAD()/UML類圖、函數語言程式設計Scala(JVM)---類與物件、封裝繼承多型、構造方法、覆寫/重寫/override

一、緒論

1.面向物件程式設計正規化(C++、Java、Go)------能進行現實生活的抽象。

            每個物件都是一個類。類中包含屬性與方法。

  • OOA:面向物件分析
  • OOP:面向物件程式設計
  • OOD:面向物件設計 
  • OOAD()
  • UML類圖

2.面向過程程式設計正規化(C語言)

3.面向切口程式設計(EE-AOP)

4.面向介面程式設計---介面優先原則

5.函數語言程式設計---Scala(JVM),如:()->{}

二、面向物件的三大特徵:

1.封裝性:將客觀事物封裝成一個抽象的類。

                 每個類都有自己的屬性與方法,且每個類可以讓自己的屬性與方法只讓可信的類與物件操作,對不可信的進行資訊隱藏。

即:內部操作對外部而言不可見(保護性)。

2.繼承性:可以使用現有類的所有功能,並且在無需重新編寫原來的類的程式碼的情況下,可以進行功能上的擴充套件。(可重用)

3.多型性(*****):一個類例項的相同方法在不同情況下有不同的表現形式。

                 多型機制使得具有不同內部結構的物件可以共享相同的外部介面。(利用多型可以得到良好的設計)

三、類與物件

1.定義:

         類是共性的概念。物件是一個具體的、可以使用的事物。

         類是生產物件的。先有類,然後類new出一個物件,物件的所有屬性與方法一定在類中有完整定義。

2.使用:

①類定義順序:定義屬性--->定義構造方法--->定義普通方法

class 類名{

    屬性1;
    屬性2;
    ......

    (構造方法、普通方法)
    方法1(){}
    方法2(){}
    ......
}
//    注:類中的屬性與方法(不帶static關鍵字的)只能通過物件呼叫。

②物件

         類名    物件名   =  new   類名();

         物件記憶體分析:

              (1)棧記憶體(虛擬機器區域性變量表):存放區域性變數(各種基本資料型別、物件引用--物件名)

              (2)堆記憶體:儲存物件。new表示在堆上新分配的空間。

              (3)垃圾空間:沒有任何棧記憶體指向的堆記憶體空間。

四、private實現封裝------使用內部類

1.類的屬性與方法被private封裝後,只能在本類中使用,類外部不可見。此時要想訪問被封裝的屬性,必須提供getter與setter方法:

setter方法:主要進行屬性內容的設定與修改。

getter方法:主要進行屬性內容的取得。

2.類的設計原則:編寫類的時候,如果沒有額外說明,所有屬性(成員變數)必須用private封裝。

五、繼承(關鍵字extends):在已有基礎上進行功能上的擴充(可重用)

1.判斷兩個類之間能否使用繼承:Student  is  a   Person.

          子類(派生類)、父類(超類、基類)

2.繼承的限制:

       (1)子類物件例項化前,先呼叫構造方法產生父類物件,再呼叫子類構造方法例項化子類物件。

       (2)java的單繼承侷限

                          ①java只允許單繼承,不允許多繼承。

                          ②要想在java中實現類似的“多繼承”,要麼多層繼承,要麼使用內部類

                          ③繼承時,子類會繼承父類 的所有結構(包含私有域與其他屬性、方法)。

  • 顯示繼承:所有非私有操作屬於顯示繼承(可以直接呼叫)。
  • 隱式繼承:所有私有操作屬於隱式繼承(不可以直接呼叫,需要通過其他形式呼叫)。

六、多型

1.向上轉型(90%):用於引數統一化

父類  父類物件 = new  子類();

2.向下轉型(1%):當父類引用需要呼叫子類擴充方法時,才需要向下轉型

子類   子類物件 = (子類)父類物件;

                       注意:要發生向下轉型,必須先發生向上轉型。(認爹的過程)

Tips:①執行時異常-----ClassCastException(型別轉換異常)。

②引用名instanceof類:表示該引用是否能表示該類例項,返回true/false。

七、構造方法(類中屬性初始化)

1.三大特徵:

                   (1)構造方法名必須與類名相同

                   (2)沒有返回值型別宣告

                   (3)每個類中一定至少存在一個構造方法。如果沒有明確定義,系統會自動生成無參構造;如果在類中自定義了構造方法,系統不會再預設生成無參構造。

class Test{
    private String name;
    private int age;
    public Test(){}//無參構造
    public Test(String name){}//1個引數的構造方法
    public Test(String name,int age){}//2個引數的構造方法
}

2.構造方法的過載-------引數個數不同(無參構造->有參構造)

             如:上圖三個Test()構造方法的過載,僅僅是引數個數不同。

 

八、覆寫/重寫/override:如果子類定義了與父類完全相同(不算許可權)的方法或屬性時,這樣的操作就稱為覆寫

1.方法的覆寫(*******):方法覆寫不能出現private關鍵字​​​​​​​

             ①子類定義了與父類方法名、引數列表、返回值完全相同的方法。

             ②被覆寫的方法不能擁有比父類更為嚴格的訪問控制權限。

2.判斷呼叫的是父類方法or子類方法

             ①看new在哪兒(當前使用的物件是通過哪個類new的)

             ②呼叫的方法有沒有被子類覆寫。如果被覆寫,呼叫的一定是被覆寫後的方法。

                如:Person  stu = new   Student();//向上轉型,此時呼叫的是子類Student.

                 private < default(啥也不寫)---包訪問許可權   <  public

3.屬性的覆寫(瞭解內容,不必深究)