1. 程式人生 > 其它 >面向物件思想的三大特徵

面向物件思想的三大特徵

技術標籤:java面向物件程式設計

面向物件思想的三大特徵

封裝性、繼承性、多型性

一、封裝性:

問題①:為什麼有封裝這個概念?

​ 當我們建立一個類的物件以後,我們可以通過“物件.屬性”的方式,對物件的屬性進行賦值。這裡,賦值操作要受到屬性的資料型別和儲存範圍的制約。除此之外,沒其他的制約條件。但是,我們在實際問題中,我們往往需要給屬性賦值加入額外的限制條件。這個條件就不能在屬性宣告時體現,我們只能通過方法進行限制條件的新增。

​ 所以避免使用者使用“物件.屬性”的方式對物件進行賦值,則需要將屬性宣告為私有的(private)。此處,針對於屬性就體現了封裝性。

​ *Ps 我自己的理解:

​ 例如我們在建立一個‘人’的類時,‘人’的屬性有姓名(name)、年齡(age)等等。

​ 名字是String型別,現在我只想把名字限制在八個字元以下,而用“物件.屬性”方式進行賦值的時候,隨心所欲,沒有辦法控制我想要的結果。如果這樣的話,只要任意建立人這個物件,都可以隨意給名字賦值。現在我想建立物件後,這個物件不能直接呼叫屬性賦值,而且需要滿足我的需求,這就只能把屬性的訪問許可權設定為私有的(private),這樣只有類中能夠訪問,再寫一個方法來給類的屬性賦值,並且再賦值前進行條件限制。這個方法就是我們學的setter。再寫另一個方法對類的屬性值進行讀取。這個方法就是我們學的getter。

​ 假設我們不對這個屬性進行訪問許可權的限制,那麼想一下,有些使用者對年齡(age)這個屬性進行賦值,輸入1000。這就不符合現實意義了,是個無效的資料。為了避免這樣的事情的發生,就出現了上述的getter和setter方法。

​ 有了這樣的方法,我們就要為這種思想起一個名字,然後就叫做封裝了。

public class People {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name)
{ this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }

問題②:為什麼要引入封裝性?

​ ^ 我們的程式設計追求“高內聚,低耦合”。

​ 高內聚:類的內部資料操作細節自己完成,不允許外部干涉。

​ 低耦合:僅對外暴漏少量的方法用於使用。

​ ^ 隱藏物件內部的複雜性,只對外公開簡單的介面。便於外部呼叫,從而提高系統的可擴充套件性、可維護性。通俗的說,把該隱藏的隱藏起來,把該暴露的暴露出來。這就是封裝性的設計思想。

問題③:封裝性思想具體的程式碼體現有哪些?

體現一:將類的屬性xxx私有(private),同時,提供公共的(public)方法來獲取(getXxx)和設定(setXxx)此屬性的值

體現二:不對外暴漏私有的方法

體現三:單例模式(將構造器私有化)

體現四:如果不希望類在包外被呼叫,可以將類設定為預設的