更新時(shí)間:2019-12-23 14:01:53 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽3242次
Java 是面向?qū)ο蟮母呒?jí)編程語(yǔ)言,類和對(duì)象是 Java 程序的構(gòu)成核心。圍繞著 Java 類和 Java 對(duì)象,有三大基本特性:封裝是 Java 類的編寫規(guī)范、繼承是類與類之間聯(lián)系的一種形式、而多態(tài)為系統(tǒng)組件或模塊之間解耦提供了解決方案。
本文主要圍繞這三大特性介紹一下 Java 面向?qū)ο?、組件解耦的核心思想。

1、面向?qū)ο笏枷?/strong>
面向?qū)ο缶幊淌钱?dāng)今主流的程序設(shè)計(jì)思想,已經(jīng)取代了過(guò)程化程序開發(fā)技術(shù),Java 是完全面向?qū)ο缶幊陶Z(yǔ)言,所以必須熟悉面向?qū)ο蟛拍軌蚓帉?Java 程序。
面向?qū)ο蟮某绦蚝诵氖怯蓪?duì)象組成的,每個(gè)對(duì)象包含著對(duì)用戶公開的特定功能和隱藏的實(shí)現(xiàn)部分。程序中的很多對(duì)象來(lái)自 JDK 標(biāo)準(zhǔn)庫(kù),而更多的類需要我們程序員自定義。
從理論上講,只要對(duì)象能夠?qū)崿F(xiàn)業(yè)務(wù)功能,其具體的實(shí)現(xiàn)細(xì)節(jié)不必特別關(guān)心。
面向?qū)ο笥幸韵绿攸c(diǎn):
(1)面向?qū)ο笫且环N常見的思想,比較符合人們的思考習(xí)慣;
(2)面向?qū)ο罂梢詫?fù)雜的業(yè)務(wù)邏輯簡(jiǎn)單化,增強(qiáng)代碼復(fù)用性;
(3)面向?qū)ο缶哂谐橄?、封裝、繼承、多態(tài)等特性。
面向?qū)ο蟮木幊陶Z(yǔ)言主要有:C++、Java、C#等。
2、類和對(duì)象的關(guān)系
類:
對(duì)某類事物的普遍一致性特征、功能的抽象、描述和封裝,是構(gòu)造對(duì)象的模版或藍(lán)圖,用 Java 編寫的代碼都會(huì)在某些類的內(nèi)部。類之間主要有:依賴、聚合、繼承等關(guān)系。
對(duì)象:
使用 new 關(guān)鍵字或反射技術(shù)創(chuàng)建的某個(gè)類的實(shí)例。同一個(gè)類的所有對(duì)象,都具有相似的數(shù)據(jù)(比如人的年齡、性別)和行為(比如人的吃飯、睡覺(jué)),但是每個(gè)對(duì)象都保存著自己獨(dú)特的狀態(tài),對(duì)象狀態(tài)會(huì)隨著程序的運(yùn)行而發(fā)生改變,需要注意狀態(tài)的變化必須通過(guò)調(diào)用方法來(lái)改變,這就是封裝的基本原則。
3、封裝思想
核心思想就是“隱藏細(xì)節(jié)”、“數(shù)據(jù)安全”:將對(duì)象不需要讓外界訪問(wèn)的成員變量和方法私有化,只提供符合開發(fā)者意愿的公有方法來(lái)訪問(wèn)這些數(shù)據(jù)和邏輯,保證了數(shù)據(jù)的安全和程序的穩(wěn)定。
具體的實(shí)現(xiàn)方式就是:
使用 private 修飾符把成員變量設(shè)置為私有,防止外部程序直接隨意調(diào)用或修改成員變量,然后對(duì)外提供 public 的 set 和 get 方法按照開發(fā)者的意愿(可以編寫一些業(yè)務(wù)邏輯代碼,雖然很少這樣做)設(shè)置和獲取成員變量的值。
也可以把只在本類內(nèi)部使用的方法使用 private,這就是封裝的思想,是面向?qū)ο笞罨镜拈_發(fā)規(guī)范之一。
在此,我們有必要說(shuō)一下 Java 的訪問(wèn)權(quán)限修飾關(guān)鍵字。Java 中主要有 private、protected、public 和 默認(rèn)訪問(wèn)權(quán)限 四種:
public 修飾符,具有最大的訪問(wèn)權(quán)限,可以訪問(wèn)任何一個(gè)在 CLASSPATH 下的類、接口、異常等。
protected 修飾符,主要作用就是用來(lái)保護(hù)子類,子類可以訪問(wèn)這些成員變量和方法,其余類不可以。
default 修飾符,主要是本包的類可以訪問(wèn)。
private 修飾符,訪問(wèn)權(quán)限僅限于本類內(nèi)部,在實(shí)際開發(fā)過(guò)程中,大多數(shù)的成員變量和方法都是使用 private 修飾的。

Java 的訪問(wèn)控制是停留在編譯層的,只在編譯時(shí)進(jìn)行訪問(wèn)權(quán)限檢查,不會(huì)在類文件中留下痕跡。
通過(guò)反射機(jī)制,還是可以訪問(wèn)類的私有成員的。
4、繼承和類實(shí)例化過(guò)程
(1)在多個(gè)不同的類中抽取出共性的數(shù)據(jù)和邏輯,對(duì)這些共性的內(nèi)容進(jìn)行封裝一個(gè)新的類即父類(也叫做超類或基類),讓之前的類來(lái)繼承這個(gè)類,那些共性的內(nèi)容在子類中就不必重復(fù)定義,比如 BaseDAO、BaseAction 等。
* (2)Java 的繼承機(jī)制是單繼承,即一個(gè)類只能有一個(gè)直接父類。
* (3)如果子類和父類有同名成員變量和方法,子類可以使用 super 關(guān)鍵字調(diào)用父類的成員變量和方法,上述使用方式前提是成員在子類可見。
* 4)在調(diào)用子類構(gòu)造方法時(shí),會(huì)隱式的調(diào)用父類的構(gòu)造方法 super()。如果父類沒(méi)有無(wú)參構(gòu)造方法,為了避免編譯錯(cuò)誤,需要在子類構(gòu)造方法中顯式的調(diào)用父類的含參構(gòu)造方法。
(5)子類創(chuàng)建時(shí)調(diào)用父類構(gòu)造方法:子類需要使用父類的成員變量和方法,所以就要調(diào)用父類構(gòu)造方法來(lái)初始化,之后再進(jìn)行子類成員變量和方法的初始化。因此,構(gòu)造方法是無(wú)法覆蓋的。
* (6)當(dāng)子類需要擴(kuò)展父類的某個(gè)方法時(shí),可以覆蓋父類方法,但是子類方法訪問(wèn)權(quán)限必須大于或等于父類權(quán)限。
(7)繼承提高了程序的復(fù)用性、擴(kuò)展性,也是 Java 語(yǔ)言多態(tài)特征的前提。
(8)在實(shí)際開發(fā)、程序設(shè)計(jì)過(guò)程中,并非先有的父類,而是先有了子類中通用的數(shù)據(jù)和邏輯,然后再抽取封裝出來(lái)的父類。
我們簡(jiǎn)單了解下類的實(shí)例化過(guò)程
(1)JVM 讀取指定 classpath 路徑下的 class 文件,加載到內(nèi)存,如果有直接父類,也會(huì)加載父類;
(2)堆內(nèi)存分配空間;
(3)執(zhí)行父類、子類靜態(tài)代碼塊;
(4)對(duì)象屬性進(jìn)行默認(rèn)初始化;
(5)調(diào)用構(gòu)造方法;
(6)在構(gòu)造方法中,先調(diào)用父類構(gòu)造方法初始化父類數(shù)據(jù);
(7)初始化父類數(shù)據(jù)后,顯示初始化,執(zhí)行子類的構(gòu)造代碼塊;
(8)再進(jìn)行子類構(gòu)造方法的特定初始化;
(9)初始化完畢后,將地址賦值給引用
5、多態(tài)、反射和組件解耦
多態(tài)指允許不同類的對(duì)象對(duì)同一“消息”做出響應(yīng)。即同一消息可以根據(jù)發(fā)送對(duì)象的不同而采用多種不同的行為方式??梢杂糜谙愋椭g的耦合關(guān)系,Spring 的核心就是多態(tài)和面向接口編程。
(1)Java 中可以使用父類、接口變量引用子類、實(shí)現(xiàn)類對(duì)象;
(2)在這個(gè)過(guò)程中,會(huì)對(duì)子類、實(shí)現(xiàn)類對(duì)象做自動(dòng)類型提升,其特有功能就無(wú)法訪問(wèn)了,如果需要使用,可以做強(qiáng)制類型轉(zhuǎn)換。
Java 的反射技術(shù)和多態(tài)特性是框架開發(fā)組件解耦的核心,在這方面,Spring 的 IOC 和 DI 為我們提供了一個(gè)極好的學(xué)習(xí)范例,Spring 的 IOC 使用反射技術(shù)創(chuàng)建、管理對(duì)象,DI 使用多態(tài)技術(shù)為組件注入依賴對(duì)象。
在沒(méi)有學(xué)習(xí) Spring 之前,簡(jiǎn)單的解決方案是使用一個(gè) .properties 文件保存程序中使用的接口、實(shí)現(xiàn)類類型鍵值信息,然后在程序中使用一個(gè)全局 Properties 對(duì)象保存這些信息,并且使用反射技術(shù)把這些實(shí)現(xiàn)類初始化、提供一個(gè)靜態(tài)的方法獲取指定接口的實(shí)現(xiàn)類對(duì)象,在組件中就可以使用依賴對(duì)象的鍵獲取需要的對(duì)象。
這樣的方案帶來(lái)的好處就是:當(dāng)我們需要修改某個(gè)組件的實(shí)現(xiàn)方式時(shí),比如把之前 JDBC 的 DA 實(shí)現(xiàn)改為 Hibernate 實(shí)現(xiàn),只要把這些新的實(shí)現(xiàn)類放到 classpath 下,把 .properties 文件對(duì)應(yīng)接口的實(shí)現(xiàn)類類型改成新的 Hibernate 實(shí)現(xiàn)類,而不需要修改依賴組件的代碼。

以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java培訓(xùn)教程:面向?qū)ο驤ava技術(shù)教程”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)文章
零基礎(chǔ)怎么自學(xué)Java,完整版Java學(xué)習(xí)路線圖
你還在糾結(jié)學(xué)Java,是自學(xué)還是去培訓(xùn)班嗎
一個(gè)標(biāo)準(zhǔn)的Java程序員如何進(jìn)階?
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)