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

