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.屬性的覆寫(瞭解內容,不必深究)