1. 程式人生 > 實用技巧 >面向物件初相識

面向物件初相識

面向物件程式設計

在介紹面向物件程式設計之前,我們先來了解兩個非常重要、非常基礎的概念,那就是類(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中可以通過繼承和介面來實現多型。

多型特點:

  • 訪問成員變數:只能訪問父類的成員變數,不能訪問子類特有成員
  • 呼叫相同方法:只能呼叫子類方法

多型存在的意義:

多型可以提高程式碼的擴充套件性和複用性,是很多設計模式、設計原則、程式設計技巧的程式碼實現基礎。