面向物件初相識
面向物件程式設計
在介紹面向物件程式設計之前,我們先來了解兩個非常重要、非常基礎的概念,那就是類(class)和物件(object)。
類就是擁有相等功能和相同的屬性的物件的集合 -- 抽象
物件就是類的例項 -- 具體
/** * 女朋友類 */ public class GirlFriend { /** * 姓名 */ private String name; /** * 年齡 */ private int age; /** * 性別 */ private String sex; public void eat(String value){ System.out.println("我的女朋友" + name + "喜歡吃"+value); } public void buy(String value){ System.out.println("我的女朋友" + name + "喜歡買"+value); } //省略get set... }
/**
* 女朋友物件
*/
//建立物件
GirlFriend girlFriend = new GirlFriend();
//為屬性賦值
girlFriend.setAge(18);
girlFriend.setName("寶寶");
girlFriend.setSex("女");
物件在記憶體中是真實存在的,可以儲存資料,物件是以"類"為模板建立的,"類"只有一個,"物件"可以建立多個 。
面向物件程式設計是一種程式設計方式。它以類或物件作為組織程式碼的基本單元,並將封裝、抽象、繼承、多型四個特性,作為程式碼設計和實現的基石 。
通俗的講,面共物件程式設計與技術無關,只是一種程式設計方式或者程式設計思想,當在程式設計時,首先靠清楚需要什麼,然後建立一個類,並設定需要的屬性及方法,使用時直接呼叫即可 。
面向過程程式設計
面向過程同樣是一種程式設計風格或程式設計思想,它以過程(可以理解為方法、函式、操作)作為組織程式碼的基本單元,以資料(可以理解為成員變數、屬性)與方法相分離為最主要的特點。面向過程風格是一種流程化的程式設計風格,通過拼接一組順序執行的方法來操作資料完成一項功能。
面向過程與面向物件區別
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了;面向物件是把構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
面向物件程式設計相比面向過程程式設計有哪些優勢?
- 對於大規模複雜程式的開發,程式的處理流程並非單一的一條主線,而是錯綜複雜的網狀結構。面向物件程式設計比起面向過程程式設計,更能應對這種複雜型別的程式開發。
- 面向物件程式設計相比面向過程程式設計,具有更加豐富的特性(封裝、抽象、繼承、多型)。利用這些特性編寫出來的程式碼,更加易擴充套件、易複用、易維護。
- 從程式語言跟機器打交道的方式的演進規律中,我們可以總結出:面向物件程式語言比起面向過程程式語言,更加人性化、更加高階、更加智慧。
四大特性
封裝
我們知道類中可以定義屬性和方法。當有些資訊不想讓別人看到或者隨便修改時,我們可以在類中暴露有限的訪問介面,授權外部僅能通過類提供的方法來訪問內部資訊或者資料。
在Java中提供了許可權修飾符private、default、protected、public來支援封裝這個特性。
封裝存在的意義:
- 隱藏資料資訊且保護資料不會被隨意修改,提高程式碼的可維護性;
- 暴露有限且必要的介面,提高類的易用性。
繼承
繼承是從已有的類中派生出新的類,新的類能吸收已有類的資料屬性和行為,並能擴充套件新的能力。比如槍是一個類,步槍、手槍、狙擊槍都有槍的屬性和能力,但是他們又有自己特有的能力。
繼承最大的一個好處就是程式碼複用。
子類在繼承一個類的同時,實現一個或者多個介面:一定要先繼承,後實現
Java 不支援多重繼承的原因
多重繼承有副作用:鑽石問題(菱形繼承)。 假設類 B 和類 C 繼承自類 A,且都重寫了類 A 中的同一個方法,而類 D 同時繼承了類 B 和類 C,那麼此時類 D 會繼承 B、C 的方法,那對於 B、C 重寫的 A 中的方法,類 D 會繼承哪一個呢?這裡就會產生歧義。
繼承的原理
在Java中,類是動態載入的,當第一次使用這個類的時候才會載入。在建子類物件前,如果父類沒有建立,JVM會先建立一個父類物件,並存儲在“子類物件空間內部”,這樣,子類物件就可以直接訪問它裡面的這個父類物件中的屬性。
抽象
抽象類是它的所有子類的公共屬性的集合,是包含一個或多個抽象方法的類。抽象類可以看作是對類的進一步抽象。
介面類講的是如何隱藏方法的具體實現,讓呼叫者只需要關心方法提供了哪些功能,並不需要知道這些功能是如何實現的。
抽象可以通過介面類或者抽象類來實現,但也並不需要特殊的語法機制來支援。
在Java語言中,用abstract 關鍵字來修飾的類為抽象類,用interface關鍵字來修飾的類為介面類。
抽象類特性
抽象類不允許被例項化,只能被繼承
抽象類可以包含屬性和方法
子類繼承抽象類,必須實現抽象類中所有的抽象方法
介面類特性
介面不能包含屬性(成員變數)
介面只能宣告方法,方法不能包含程式碼實現
類實現介面的時候,必須實現介面中宣告的所有方法
抽象類和介面的應用場景區別
為了解決程式碼複用問題,就用抽象類;
為了解決抽象而非程式碼複用問題,就用介面。
抽象存在的意義
- 提高程式碼的可擴充套件性、維護性,修改實現不需要改變定義,減少程式碼的改動範圍;
- 便於處理複雜的系統,能有效地過濾掉不必要關注的資訊。
多型
多型指同一個實體同時具有多種形式,即父類型別的引用指向了它的某個子類物件。
/**
* 多型的應用
*/
List<String> strArr = new ArrayList<>();
List<String> strLink = new LinkedList<>();
Java中可以通過繼承和介面來實現多型。
多型特點:
- 訪問成員變數:只能訪問父類的成員變數,不能訪問子類特有成員
- 呼叫相同方法:只能呼叫子類方法
多型存在的意義:
多型可以提高程式碼的擴充套件性和複用性,是很多設計模式、設計原則、程式設計技巧的程式碼實現基礎。