Java面向?qū)ο蠡A(chǔ)知識(shí)之封裝,繼承,多態(tài)和抽象
一、封裝
封裝:是面向?qū)ο蠓椒ǖ闹匾瓌t,就是把對(duì)象的屬性和行為(數(shù)據(jù))結(jié)合為一個(gè)獨(dú)立的整體,并盡可能隱藏對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),就是把不想告訴或者不該告訴別人的東西隱藏起來,把可以告訴別人的公開,別人只能用我提供的功能實(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 類封裝 name、gender、age 等屬性,外界只能通過 get() 方法獲取一個(gè) Person 對(duì)象的 name 屬性和 gender 屬性,而無法獲取 age 屬性,但是 age 屬性可以供 work() 方法使用。
注意到 gender 屬性使用 int 數(shù)據(jù)類型進(jìn)行存儲(chǔ),封裝使得用戶注意不到這種實(shí)現(xiàn)細(xì)節(jié)。并且在需要修改 gender 屬性使用的數(shù)據(jù)類型時(shí),也可以在不影響客戶端代碼的情況下進(jìn)行。
二、繼承
繼承:是面向?qū)ο笞铒@著的一個(gè)特性,繼承是從已有的類中派生出新的類稱為子類,子類繼承父類的數(shù)據(jù)屬性和行為,并能根據(jù)自己的需求擴(kuò)展出新的行為,提高了代碼的復(fù)用性。
Animal animal = new Cat();
繼承應(yīng)該遵循里氏替換原則,子類對(duì)象必須能夠替換掉所有父類對(duì)象。
三、多態(tài)
多態(tài):指允許不同的對(duì)象對(duì)同一消息做出相應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式(發(fā)送消息就是函數(shù)調(diào)用)。封裝和繼承幾乎都是為多態(tài)而準(zhǔn)備的,在執(zhí)行期間判斷引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際的類型調(diào)用其相應(yīng)的方法。
多態(tài)分為編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。編譯時(shí)多態(tài)主要指方法的重載,運(yùn)行時(shí)多態(tài)指程序中定義的對(duì)象引用所指向的具體類型在運(yùn)行期間才確定。
//父類
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ì)的特征。
例如蘋果、香蕉、生梨、葡萄、桃子等,它們共同的特性就是水果。得出水果概念的過程,就是一個(gè)抽象的過程。
要抽象,就必須進(jìn)行比較,沒有比較就無法找到共同的部分。
共同特征是指那些能把一類事物與他類事物區(qū)分開來的特征,這些具有區(qū)分作用的特征又稱本質(zhì)特征。
因此抽取事物的共同特征就是抽取事物的本質(zhì)特征,舍棄不同特征。
所以抽象的過程也是一個(gè)裁剪的過程,不同的、非本質(zhì)性的特征全部裁剪掉了。
所謂的共同特征,是相對(duì)的,是指從某一個(gè)刻面看是共同的。
比如,對(duì)于汽車和大米,從買賣的角度看都是商品,都有價(jià)格,這是他們的共同的特征,而從其他方面來比較是,他們則是不同的。
所以在抽象時(shí),同與不同,決定于從什么角度上來抽象。抽象的角度取決于分析問題的目的。
在軟件開發(fā)過程中,識(shí)別穩(wěn)定的需求、識(shí)別核心的需求、識(shí)別概念性的需求、設(shè)計(jì)系統(tǒng)的架構(gòu)、定義系統(tǒng)中構(gòu)件之間的接口關(guān)系等等都是抽象的過程,都是反應(yīng)系統(tǒng)的本質(zhì)特征的過程。
抽象的,才是穩(wěn)定的,才是永恒的。 抽象的反義詞是具體。人員往往會(huì)說:“你講的太抽象了,能不能講的具體一點(diǎn)?”
在開發(fā)語言中,有抽象類,有具體類,具體類可以繼承自抽象類,可以實(shí)例化。抽象類可以派生出眾多的不同的具體類。
所謂:“一生二,二生三,三生萬物”。系統(tǒng)的穩(wěn)定體現(xiàn)在抽象類,系統(tǒng)的變化體現(xiàn)在具體類。抽象類的層次要高于具體類。
系統(tǒng)因抽象而穩(wěn)定,因抽象而生動(dòng)。
抽象用 abstract 關(guān)鍵字來修飾,用 abstract 修飾類時(shí),此類就不能被實(shí)例化,從這里可以看出,抽象類就是為了繼承而存在的,
如果定義了一個(gè)抽象類而不去繼承它,那么等于白白創(chuàng)建了這個(gè)抽象類,因?yàn)槟悴荒苡盟鼇碜鋈魏问虑?,?abstract 修飾方法時(shí),此方法就是抽象方法,抽象方法必須存在于抽象類中,抽象方法沒有方法體,
對(duì)于一個(gè)父類來說,如果它的某個(gè)方法在父類中實(shí)現(xiàn)出來沒有任何意義,必須根據(jù)子類的實(shí)際需求來進(jìn)行不同的實(shí)現(xiàn),那么就可以將這個(gè)方法聲明為抽象方法,抽象方法的修飾符必須為 public 或者 protected ,因?yàn)橛?private,則不能被子類繼承,子類便無法實(shí)現(xiàn)該方法,缺省情況下默認(rèn)為 public 。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Java實(shí)現(xiàn)文件上傳的兩種方法(uploadify和Spring)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)文件上傳的兩種方法,uploadify和Spring實(shí)現(xiàn)文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決
這篇文章主要介紹了IDEA導(dǎo)入Springboot項(xiàng)目,注解和pom文件不識(shí)別的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Spring應(yīng)用拋出NoUniqueBeanDefinitionException異常的解決方案
這篇文章介紹了解決org.springframework.beans.factory.NoUniqueBeanDefinitionException異常的一些解決方案,從這些解決方案可以看出Spring框架的設(shè)計(jì)精妙,遇見此問題的朋友可以參考下該解決方案2021-06-06
Java實(shí)現(xiàn)XML文件學(xué)生通訊錄
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)XML文件學(xué)生通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
在Springboot中Mybatis與Mybatis-plus的區(qū)別詳解
MyBatis是一個(gè)優(yōu)秀的持久層框架,它對(duì)JDBC的操作數(shù)據(jù)庫的過程進(jìn)行封裝,MyBatisPlus (簡稱 MP)是一個(gè) MyBatis的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生,本文將給大家介紹了在Springboot中Mybatis與Mybatis-plus的區(qū)別2023-12-12
Springboot?接口需要接收參數(shù)類型是數(shù)組問題
這篇文章主要介紹了Springboot?接口需要接收參數(shù)類型是數(shù)組問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01

