在java面向对象编程中_谈一谈你对封装_继承_多态概念的理解_Java新职篇:面向对象编程的3个原则是什么?...
原標(biāo)題:Java新職篇:面向?qū)ο缶幊痰?個(gè)原則是什么?
所有面向?qū)ο蟮木幊陶Z言都提供幫助你實(shí)現(xiàn)面向?qū)ο竽P偷臋C(jī)制,這些機(jī)制是封裝,繼承及多態(tài)性。現(xiàn)在讓我們來看一下它們的概念。
封裝
封裝(Encapsulation)是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,該機(jī)制保證了程序和數(shù)據(jù)都不受外部干擾且不被誤用。理解封裝性的一個(gè)方法就是把它想成一個(gè)黑匣子,它可以阻止在外部定義的代碼隨意訪問內(nèi)部代碼和數(shù)據(jù)。對黑匣子內(nèi)代碼和數(shù)據(jù)的訪問通過一個(gè)適當(dāng)定義的接口嚴(yán)格控制。如果想與現(xiàn)實(shí)生活中的某個(gè)事物作對比,可考慮汽車上的自動傳送。自動傳送中包含了有關(guān)引擎的數(shù)百比特的信息,例如你正在以什么樣的加速度前進(jìn),你行駛路面的坡度如何,以及目前的檔位。作為用戶,你影響這個(gè)復(fù)雜封裝的方法僅有一個(gè):移動檔位傳動桿。例如,你不能通過使用拐彎信號或擋風(fēng)玻璃擦拭器影響傳動。所以檔位傳動桿是把你和傳動連接起來的惟一接口。此外,傳動對象內(nèi)的任何操作都不會影響到外部對象,例如,檔位傳動裝置不會打開車前燈!因?yàn)樽詣觽鲃颖环庋b起來了,所以任何一家汽車制造商都可以選擇一種適合自己的方式來實(shí)現(xiàn)它。然而,從司機(jī)的觀點(diǎn)來看,它們的用途都是一樣的。與此相同的觀點(diǎn)能被用于編程。封裝代碼的好處是每個(gè)人都知道怎么訪問它,但卻不必考慮它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也不必害怕使用不當(dāng)會帶來負(fù)面影響。
Java封裝的基本單元是類。盡管類將在以后章節(jié)詳細(xì)介紹。現(xiàn)在仍有必要對它作一下簡單的討論。一個(gè)類(class)定義了將被一個(gè)對象集共享的結(jié)構(gòu)和行為(數(shù)據(jù)和代碼)。
一個(gè)給定類的每個(gè)對象都包含這個(gè)類定義的行為和結(jié)構(gòu),好像它們是從同一個(gè)類的模子中鑄造出來似的。因?yàn)檫@個(gè)原因,對象有時(shí)被看作是類的實(shí)例(instances of a class)。所以,類是一種邏輯結(jié)構(gòu),而對象是真正存在的物理實(shí)體。
當(dāng)創(chuàng)建一個(gè)類時(shí),你要指定組成那個(gè)類的代碼和數(shù)據(jù)。從總體上講,這些元素都被稱為該類的成員(members)。具體地說,類定義的數(shù)據(jù)稱為成員變量(member variables)或?qū)嵗兞?instance variables)。操作數(shù)據(jù)的代碼稱為成員方(member methods)或簡稱方法(methods)。如果你對C/C++熟悉,可以這樣理解:Java程序員所稱的方法,就是C/C++程序員所稱的函數(shù)(function)。在完全用Java編寫的程序中,方法定義如何使用成員變量。這意味著一個(gè)類的行為和接口是通過方法來定義的,類這些方法對它的實(shí)例數(shù)據(jù)進(jìn)行操作。
既然類的目的是封裝復(fù)雜性,在類的內(nèi)部就應(yīng)該有隱藏實(shí)現(xiàn)復(fù)雜性機(jī)制。類中的每個(gè)方法或變量都可以被標(biāo)記為私有(private)或公共(public)。類的公共接口代表類的外部用戶需要知道或可以知道的每件事情;私有方法和數(shù)據(jù)僅能被一個(gè)類的成員代碼所訪問,其他任何不是類的成員的代碼都不能訪問私有的方法或變量。既然類的私有成員僅能被程序中的其他部分通過該類的公共方法訪問,那么你就能保證不希望發(fā)生的事情就一定不會發(fā)生。當(dāng)然,公共接口應(yīng)該小心仔細(xì)設(shè)計(jì),不要過多暴露類的內(nèi)部內(nèi)容

繼承
繼承(Inheritance)是一個(gè)對象獲得另一個(gè)對象的屬性的過程。繼承很重要,因?yàn)樗С至税磳臃诸惖母拍睢H缜懊嫣岬降?#xff0c;大多數(shù)知識都可以按層級(即從上到下)分類管理。
例如,尊貴的獵犬是狗類的一部分,狗又是哺乳動物類的一部分,哺乳動物類又是動物類的一部分。如果不使用層級的概念,我們就不得不分別定義每個(gè)動物的所有屬性。使用了繼承,一個(gè)對象就只需定義使它在所屬類中獨(dú)一無二的屬性即可,因?yàn)樗梢詮乃母割惸莾豪^承所有的通用屬性。所以,可以這樣說,正是繼承機(jī)制使一個(gè)對象成為一個(gè)更具通用類的一個(gè)特定實(shí)例成為可能。下面讓我們更具體地討論這個(gè)過程。
大多數(shù)人都認(rèn)為世界是由對象組成的,而對象又是按動物、哺乳動物和狗這樣的層級結(jié)構(gòu)相互聯(lián)系的。如果你想以一個(gè)抽象的方式描述動物,那么你可以通過大小、智力及骨胳系統(tǒng)的類型等屬性進(jìn)行描述。動物也具有確定的行為,它們也需要進(jìn)食、呼吸,并且睡覺。這種對屬性和行為的描述就是對動物類的定義。
如果你想描述一個(gè)更具體的動物類,比如哺乳動物,它們會有更具體的屬性,比如牙齒類型、乳腺類型等。我們說哺乳類動物是動物的子類(subclass),而動物是哺乳動物的超類(superclass)。

由于哺乳動物類是需要更加精確定義的動物,所以它可以從動物類繼承(inherit)所有的屬性。一個(gè)深度繼承的子類繼承了類層級(class hierarchy)中它的每個(gè)祖先的所有屬性。
繼承性與封裝性相互作用。如果一個(gè)給定的類封裝了一些屬性,那么它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向?qū)ο蟮某绦蛟趶?fù)雜性上呈線性而非幾何性增長的一個(gè)關(guān)鍵概念。新的子類繼承它的所有祖先的所有屬性。它不與系統(tǒng)中其余的多數(shù)代碼產(chǎn)生無法預(yù)料的相互作用。
多態(tài)性
多態(tài)性(Polymorphism,來自于希臘語,表示“多種形態(tài)”)是允許一個(gè)接口被多個(gè)同類動作使用的特性,具體使用哪個(gè)動作與應(yīng)用場合有關(guān),下面我們以一個(gè)后進(jìn)先出型堆棧為例進(jìn)行說明。假設(shè)你有一個(gè)程序,需要3種不同類型的堆棧。一個(gè)堆棧用于整數(shù)值,一個(gè)用于浮點(diǎn)數(shù)值,一個(gè)用于字符。盡管堆棧中存儲的數(shù)據(jù)類型不同,但實(shí)現(xiàn)每個(gè)棧的算法是一樣的。如果用一種非面向?qū)ο蟮恼Z言,你就要?jiǎng)?chuàng)建3個(gè)不同的堆棧程序,每個(gè)程序一個(gè)名字。但是,如果使用Java,由于它具有多態(tài)性,你就可以創(chuàng)建一個(gè)通用的堆棧程序集,它們共享相同的名稱。
多態(tài)性的概念經(jīng)常被說成是“一個(gè)接口,多種方法”。這意味著可以為一組相關(guān)的動作設(shè)計(jì)一個(gè)通用的接口。多態(tài)性允許同一個(gè)接口被必于同一類的多個(gè)動作使用,這樣就降低了程序的復(fù)雜性。選擇應(yīng)用于每一種情形的特定的動作(specific action)(即方法)是編譯器的任務(wù),程序員無需手工進(jìn)行選擇。你只需記住并且使用通用接口即可。
再拿狗作比喻,一條狗的嗅覺是多態(tài)的。如果狗聞到貓的氣味,它會在吠叫并且追著它跑。如果狗聞到食物的氣味,它將分泌唾液并向盛著食物的碗跑去。兩種狀況下是同一種嗅覺器官在工作,差別在于聞到了什么氣味,也就是有兩種不同類型的數(shù)據(jù)作用于狗的鼻子!在一個(gè)Java程序中使用方法時(shí),也可以采用這個(gè)通用的概念。返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的在java面向对象编程中_谈一谈你对封装_继承_多态概念的理解_Java新职篇:面向对象编程的3个原则是什么?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1920×1080是几k
- 下一篇: java奇数偶数数组_在Java数组中将