- 相關(guān)推薦
Java語言面向?qū)ο蟮?大特征
Java是一種面向?qū)ο蟮目缙脚_(tái)編程語言,簡(jiǎn)單易用,功能強(qiáng)大。具有簡(jiǎn)單性、面向?qū)ο、分布式、健壯性、安全性、平臺(tái)的獨(dú)立與可移植性、多線程、動(dòng)態(tài)性等特點(diǎn),在這篇文章中,我們不討論Java的語言特征,我們來說說Java面向?qū)ο蟮乃拇筇匦裕悍庋b、抽象、繼承和多態(tài)。下面是小編精心整理的Java語言面向?qū)ο蟮?大特征,供大家參考借鑒,希望可以幫助到有需要的朋友。
1、封裝
封裝就是將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個(gè)有機(jī)的整體,也就是將數(shù)據(jù)與操作數(shù)據(jù)的源代碼進(jìn)行有機(jī)的結(jié)合,形成“類”,其中數(shù)據(jù)和函數(shù)都是類的成員。
在面向?qū)ο笳Z言中,封裝特性是由類來體現(xiàn)的,我們將現(xiàn)實(shí)生活中的一類實(shí)體定義成類,其中包括屬性和行為(在Java中就是方法),就好像人類,可以具有name,sex,age等屬性,同時(shí)也具有eat,sleep等行為,我們?cè)谛袨橹袑?shí)現(xiàn)一定的功能,也可操作屬性,這是面向?qū)ο蟮姆庋b特性.
封裝隱藏了類的內(nèi)部實(shí)現(xiàn)機(jī)制,可以在不影響使用的情況下改變類的內(nèi)部結(jié)構(gòu),同時(shí)也保護(hù)了數(shù)據(jù)。對(duì)外界而已它的內(nèi)部細(xì)節(jié)是隱藏的,暴露給外界的只是它的訪問方法。封裝的目的是增強(qiáng)安全性和簡(jiǎn)化編程,使用者不必了解具體的實(shí)現(xiàn)細(xì)節(jié),而只是要通過外部接口,一特定的訪問權(quán)限來使用類的成員。
封裝是保證軟件部件具有優(yōu)良的模塊性的基礎(chǔ),封裝的目標(biāo)就是要實(shí)現(xiàn)軟件部件的“高內(nèi)聚、低耦合”,防止程序相互依賴性而帶來的變動(dòng)影響。在面向?qū)ο蟮木幊陶Z言中,對(duì)象是封裝的最基本單位,面向?qū)ο蟮姆庋b比傳統(tǒng)語言的封裝更為清晰、更為有力。面向?qū)ο蟮姆庋b就是把描述一個(gè)對(duì)象的屬性和行為的代碼封裝在一個(gè)“模塊”中,也就是一個(gè)類中,屬性用變量定義,行為用方法進(jìn)行定義,方法可以直接訪問同一個(gè)對(duì)象中的屬性。
通常情況下,只要記住讓變量和訪問這個(gè)變量的方法放在一起,將一個(gè)類中的成員變量全部定義成私有的,只有這個(gè)類自己的方法才可以訪問到這些成員變量,這就基本上實(shí)現(xiàn)對(duì)象的封裝,就很容易找出要分配到這個(gè)類上的方法了,就基本上算是會(huì)面向?qū)ο蟮木幊塘恕0盐找粋(gè)原則:把對(duì)同一事物進(jìn)行操作的方法和相關(guān)的方法放在同一個(gè)類中,把方法和它操作的數(shù)據(jù)放在同一個(gè)類中。
例如,人要在黑板上畫圓,這一共涉及三個(gè)對(duì)象:人、黑板、圓,畫圓的方法要分配給哪個(gè)對(duì)象呢?由于畫圓需要使用到圓心和半徑,圓心和半徑顯然是圓的屬性,如果將它們?cè)陬愔卸x成了私有的成員變量,那么,畫圓的方法必須分配給圓,它才能訪問到圓心和半徑這兩個(gè)屬性,人以后只是調(diào)用圓的畫圓方法、表示給圓發(fā)給消息而已,畫圓這個(gè)方法不應(yīng)該分配在人這個(gè)對(duì)象上,這就是面向?qū)ο蟮姆庋b性,即將對(duì)象封裝成一個(gè)高度自治和相對(duì)封閉的個(gè)體,對(duì)象狀態(tài)(屬性)由這個(gè)對(duì)象自己的行為(方法)來讀取和改變。
一個(gè)更便于理解的例子就是,司機(jī)將火車剎住了,剎車的動(dòng)作是分配給司機(jī),還是分配給火車,顯然,應(yīng)該分配給火車,因?yàn)樗緳C(jī)自身是不可能有那么大的力氣將一個(gè)火車給停下來的,只有火車自己才能完成這一動(dòng)作,火車需要調(diào)用內(nèi)部的離合器和剎車片等多個(gè)器件協(xié)作才能完成剎車這個(gè)動(dòng)作,司機(jī)剎車的過程只是給火車發(fā)了一個(gè)消息,通知火車要執(zhí)行剎車動(dòng)作而已。
2、抽象
抽象就是將一類實(shí)體的共同特性抽象出來,封裝在一個(gè)抽象類中,所以抽象在面向?qū)ο笳Z言是由抽象類來體現(xiàn)的。簡(jiǎn)單來說,抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個(gè)類,這個(gè)類只考慮這些事物的相似和共性之處,并且會(huì)忽略與當(dāng)前主題和目標(biāo)無關(guān)的那些方面,將注意力集中在與當(dāng)前目標(biāo)有關(guān)的方面。
例如,看到一只螞蟻和大象,你能夠想象出它們的相同之處,那就是抽象。抽象類不能實(shí)例化,比如鳥就是一個(gè)抽象實(shí)體,因?yàn)槌橄髮?shí)體并不是一個(gè)真正的對(duì)象,它的屬性還不能完全描述一個(gè)對(duì)象,所以在語言中體現(xiàn)為抽象類不能實(shí)例化。抽象包括行為抽象和狀態(tài)抽象兩個(gè)方面。例如,定義一個(gè)Person類,如下:
Class Person {
String name;
int age;
}
人本來是很復(fù)雜的事物,有很多方面,但因?yàn)楫?dāng)前系統(tǒng)只需要了解人的姓名和年齡,所以上面定義的類中只包含姓名和年齡這兩個(gè)屬性,這就是一種抽像,使用抽象可以避免考慮一些與目標(biāo)無關(guān)的細(xì)節(jié)。我對(duì)抽象的理解就是不要用顯微鏡去看一個(gè)事物的所有方面,這樣涉及的內(nèi)容就太多了,而是要善于劃分問題的邊界,當(dāng)前系統(tǒng)需要什么,就只考慮什么。
3、繼承
在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容,并可以加入若干新的內(nèi)容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動(dòng)共享父類數(shù)據(jù)和方法的機(jī)制,這是類之間的一種關(guān)系,提高了軟件的可重用性和可擴(kuò)展性。
簡(jiǎn)單的說,繼承就是在一個(gè)現(xiàn)有類型的基礎(chǔ)上,通過增加新的方法或者重定義已有方法的方式,產(chǎn)生一個(gè)新的類型。我們?cè)谑褂肑AVA時(shí)編寫的每一個(gè)類都是在繼承,因?yàn)樵贘AVA語言中,java.lang.Object類是所有類最根本的基類(或者叫父類、超類),如果我們新定義的一個(gè)類沒有明確地指定繼承自哪個(gè)基類,那么JAVA就會(huì)默認(rèn)為它是繼承自O(shè)bject類的。
4、多態(tài)
多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。
因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。多態(tài)性增強(qiáng)了軟件的靈活性和擴(kuò)展性。可以說,多態(tài)就是通過傳遞給父類對(duì)象引用不同的子類對(duì)象從而表現(xiàn)出不同的行為,多態(tài)可為程序提供更好的可擴(kuò)展性,同樣也可以代碼重用。
例如,下面代碼中的UserDao是一個(gè)接口,它定義引用變量userDao指向的實(shí)例對(duì)象由daofactory.getDao在執(zhí)行的時(shí)候返回,有時(shí)候指向的是UserJdbcDao這個(gè)實(shí)現(xiàn),有時(shí)候指向的是UserHibernateDao這個(gè)實(shí)現(xiàn),這樣,不用修改源代碼,就可以改變userDao指向的具體類實(shí)現(xiàn),從而導(dǎo)致userDao.User方法調(diào)用的具體代碼也隨之改變,即有時(shí)候調(diào)用的是UserJdbcDao的User方法,有時(shí)候調(diào)用的是UserHibernateDao的User方法:
UserDao userDao =daofactory.getDao;
userDao.User(user);
程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量倒底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定。因?yàn)樵诔绦蜻\(yùn)行時(shí)才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實(shí)現(xiàn)上,從而導(dǎo)致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運(yùn)行時(shí)所綁定的具體代碼,讓程序可以選擇多個(gè)運(yùn)行狀態(tài),這就是多態(tài)性。
方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。重寫Overriding是父類與子類之間多態(tài)性的一種表現(xiàn),重載Overloading是一個(gè)類中多態(tài)性的一種表現(xiàn)。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫(Overriding)。子類的對(duì)象使用這個(gè)方法時(shí),將調(diào)用子類中的定義,對(duì)它而言,父類中的定義如同被“屏蔽”了。如果在一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的參數(shù)個(gè)數(shù)或有不同的參數(shù)類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。方法的重寫Overriding和重載Overloading是Java多態(tài)性的不同表現(xiàn)。
以上就是Java語言中面向?qū)ο蟮乃拇筇匦裕悍庋b、抽象、繼承和多態(tài),不知道有沒有讓你對(duì)Java語言有更深入的認(rèn)知。
【Java語言面向?qū)ο蟮?大特征】相關(guān)文章: