Java面向?qū)ο蠡A(chǔ)知識之封裝,繼承,多態(tài)和抽象
一、封裝
封裝:是面向?qū)ο蠓椒ǖ闹匾瓌t,就是把對象的屬性和行為(數(shù)據(jù))結(jié)合為一個獨立的整體,并盡可能隱藏對象的內(nèi)部實現(xiàn)細節(jié),就是把不想告訴或者不該告訴別人的東西隱藏起來,把可以告訴別人的公開,別人只能用我提供的功能實現(xiàn)需求,而不知道是如何實現(xiàn)的。增加安全性
public class Person { private String name; private int gender; private int age; public String getName() { return name; } public String getGender() { return gender == 0 ? "man" : "woman"; } public void work() { if (18 <= age && age <= 50) { System.out.println(name + " is working very hard!"); } else { System.out.println(name + " can't work any more!"); } } }
以上 Person 類封裝 name、gender、age 等屬性,外界只能通過 get() 方法獲取一個 Person 對象的 name 屬性和 gender 屬性,而無法獲取 age 屬性,但是 age 屬性可以供 work() 方法使用。
注意到 gender 屬性使用 int 數(shù)據(jù)類型進行存儲,封裝使得用戶注意不到這種實現(xiàn)細節(jié)。并且在需要修改 gender 屬性使用的數(shù)據(jù)類型時,也可以在不影響客戶端代碼的情況下進行。
二、繼承
繼承:是面向?qū)ο笞铒@著的一個特性,繼承是從已有的類中派生出新的類稱為子類,子類繼承父類的數(shù)據(jù)屬性和行為,并能根據(jù)自己的需求擴展出新的行為,提高了代碼的復(fù)用性。
Animal animal = new Cat();
繼承應(yīng)該遵循里氏替換原則,子類對象必須能夠替換掉所有父類對象。
三、多態(tài)
多態(tài):指允許不同的對象對同一消息做出相應(yīng)。即同一消息可以根據(jù)發(fā)送對象的不同而采用多種不同的行為方式(發(fā)送消息就是函數(shù)調(diào)用)。封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的,在執(zhí)行期間判斷引用對象的實際類型,根據(jù)其實際的類型調(diào)用其相應(yīng)的方法。
多態(tài)分為編譯時多態(tài)和運行時多態(tài)。編譯時多態(tài)主要指方法的重載,運行時多態(tài)指程序中定義的對象引用所指向的具體類型在運行期間才確定。
//父類 public class Base { protected void show() {} } //子類 class Kid: Base { public void show() { System.out.println(" i am kid"); } }
public static void main( String[] args ) { Base base = new Kid(); base.show(); }
四、抽象
抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征。
例如蘋果、香蕉、生梨、葡萄、桃子等,它們共同的特性就是水果。得出水果概念的過程,就是一個抽象的過程。
要抽象,就必須進行比較,沒有比較就無法找到共同的部分。
共同特征是指那些能把一類事物與他類事物區(qū)分開來的特征,這些具有區(qū)分作用的特征又稱本質(zhì)特征。
因此抽取事物的共同特征就是抽取事物的本質(zhì)特征,舍棄不同特征。
所以抽象的過程也是一個裁剪的過程,不同的、非本質(zhì)性的特征全部裁剪掉了。
所謂的共同特征,是相對的,是指從某一個刻面看是共同的。
比如,對于汽車和大米,從買賣的角度看都是商品,都有價格,這是他們的共同的特征,而從其他方面來比較是,他們則是不同的。
所以在抽象時,同與不同,決定于從什么角度上來抽象。抽象的角度取決于分析問題的目的。
在軟件開發(fā)過程中,識別穩(wěn)定的需求、識別核心的需求、識別概念性的需求、設(shè)計系統(tǒng)的架構(gòu)、定義系統(tǒng)中構(gòu)件之間的接口關(guān)系等等都是抽象的過程,都是反應(yīng)系統(tǒng)的本質(zhì)特征的過程。
抽象的,才是穩(wěn)定的,才是永恒的。 抽象的反義詞是具體。人員往往會說:“你講的太抽象了,能不能講的具體一點?”
在開發(fā)語言中,有抽象類,有具體類,具體類可以繼承自抽象類,可以實例化。抽象類可以派生出眾多的不同的具體類。
所謂:“一生二,二生三,三生萬物”。系統(tǒng)的穩(wěn)定體現(xiàn)在抽象類,系統(tǒng)的變化體現(xiàn)在具體類。抽象類的層次要高于具體類。
系統(tǒng)因抽象而穩(wěn)定,因抽象而生動。
抽象用 abstract 關(guān)鍵字來修飾,用 abstract 修飾類時,此類就不能被實例化,從這里可以看出,抽象類就是為了繼承而存在的,
如果定義了一個抽象類而不去繼承它,那么等于白白創(chuàng)建了這個抽象類,因為你不能用它來做任何事情,用 abstract 修飾方法時,此方法就是抽象方法,抽象方法必須存在于抽象類中,抽象方法沒有方法體,
對于一個父類來說,如果它的某個方法在父類中實現(xiàn)出來沒有任何意義,必須根據(jù)子類的實際需求來進行不同的實現(xiàn),那么就可以將這個方法聲明為抽象方法,抽象方法的修飾符必須為 public 或者 protected ,因為用 private,則不能被子類繼承,子類便無法實現(xiàn)該方法,缺省情況下默認為 public 。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java字符串相關(guān)類StringBuffer的用法詳解
java.lang包下的StringBuffer類,代表著可變的字符序列,可以用來對字符串內(nèi)容進行增刪改操作。本文將通過示例詳細說說它的用法,感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-10-10springboot-rabbitmq-reply?消息直接回復(fù)模式詳情
這篇文章主要介紹了springboot-rabbitmq-reply消息直接回復(fù)模式詳情,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-09-09