java面向对象思想如何理解
生活随笔
收集整理的這篇文章主要介紹了
java面向对象思想如何理解
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Java 的核心是面向?qū)ο缶幊?. 所有的 java 程序都是面向?qū)ο蟮摹?
以前總聽老師說 c 語言是面向過程的, c++ 和 java 是面向?qū)ο蟮?#xff0c;這些糊涂老師卻從來不說明何為面向過程,何為面向?qū)ο?#xff0c;搞得我一直對(duì)此稀里糊涂。 最近看了不少的資料,在這里總結(jié)一下對(duì)此的心得體會(huì)。
所有的計(jì)算機(jī)程序都由兩類元素組成:代碼和數(shù)據(jù)。換句話說,程序還可以以它的代碼或是數(shù)據(jù)為核心進(jìn)行組織編寫。也就是說,一些程序圍繞 “ 正在發(fā)生什么 ” 編寫,而另一些程序則圍繞 “ 誰將被影響 ” 編寫。第一種方法被稱為面向過程 的模型( process-oriented model ),用它編寫的程序都具有線性執(zhí)行的特點(diǎn)。面向過程的模型可認(rèn)為是代碼作用于數(shù)據(jù),像 C 這樣的過程式語言采用這個(gè)模型是相當(dāng)成功的。第二種方式,也就是面向?qū)ο?的編程( object-oriented programming )。面向?qū)ο蟮木幊虈@它的數(shù)據(jù)(即對(duì)象)和為這個(gè)數(shù)據(jù)嚴(yán)格定義的接口來組織程序。面向?qū)ο蟮某绦驅(qū)嶋H上是用數(shù)據(jù)控制對(duì)代碼的訪問。
這樣說來很籠統(tǒng),也很簡單,下面具體說一下面向?qū)ο蟮木幊趟枷搿?
面向?qū)ο缶幊痰囊粋€(gè)實(shí)質(zhì)性的要素是抽象。那么何為抽象? 抽象與具體相對(duì)應(yīng)。 人們不會(huì)把一臺(tái)電腦想象成由幾萬個(gè)互相獨(dú)立的部分所組成的一套裝置,而是把電腦想成一個(gè)具有自己獨(dú)特行為的對(duì)象。這種抽象使人們可以很容易地用電腦上網(wǎng)打游戲,而不會(huì)因組成電腦各部分零件過于復(fù)雜而不知所措。他們可以忽略內(nèi)存、硬盤、 CPU 的工作細(xì)節(jié),將電腦作為一個(gè)整體來加以利用。在面向?qū)ο蟮挠?jì)算機(jī)世界中,這種細(xì)節(jié)程度就叫抽象。一個(gè)抽象的事物又可以把他細(xì)節(jié)化,例如一臺(tái)汽車有音響系統(tǒng),而音響系統(tǒng)由一臺(tái)收音機(jī)、一個(gè) CD 播放器、或許還有一臺(tái)磁帶放音機(jī)組成。我們可以這樣歸納,在現(xiàn)實(shí)生活中,為了減少必須處理的事情,我們是在某一程度的細(xì)節(jié)中生活的,這中細(xì)節(jié)程度叫抽象 。這種細(xì)節(jié)是相對(duì)的,沒有絕對(duì)的抽象也沒有絕對(duì)的具體正如前面所說,抽象與具體是相對(duì)應(yīng)的概念(有點(diǎn)像相對(duì)論了 ~~ )所以我們可以通過層級(jí)抽象對(duì)復(fù)雜的汽車(或任何另外復(fù)雜的系統(tǒng))進(jìn)行管理。(我們現(xiàn)在開始用這段話來承上啟下了)
復(fù)雜系統(tǒng)的分層抽象也能被用于計(jì)算機(jī)程序設(shè)計(jì)。傳統(tǒng)的面向過程程序的數(shù)據(jù)經(jīng)過抽象可用若干個(gè)組成對(duì)象表示,程序中的過程步驟可看成是在這些對(duì)象之間進(jìn)行消息收集。這樣,每一個(gè)對(duì)象都有它自己的獨(dú)特行為特征。你可以把這些對(duì)象當(dāng)作具體的實(shí)體,讓它們對(duì)告訴它們做什么事的消息作出反應(yīng)。這是面向?qū)ο缶幊痰谋举|(zhì)。
面向?qū)ο蟮母拍钍?Java 的核心,當(dāng)然了對(duì)程序員來講,重要的是要理解這些概念怎么轉(zhuǎn)化為程序。我想任何軟件都不可避免地要經(jīng)歷概念提出、成長、衰老這樣一個(gè)生命周期,而面向?qū)ο蟮某绦蛟O(shè)計(jì),可以使軟件在生命周期的每一個(gè)階段都處變不驚,有足夠的應(yīng)變能力。
所有面向?qū)ο蟮木幊陶Z言都提供幫助你實(shí)現(xiàn)面向?qū)ο竽P偷臋C(jī)制,這些機(jī)制是封裝,繼承及多態(tài)性。現(xiàn)在讓我們來看一下它們的概念。
封裝
封裝( Encapsulation )是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,該機(jī)制保證了程序和數(shù)據(jù)都不受外部干擾且不被誤用。封裝代碼的好處是每個(gè)人都知道怎么訪問它,但卻不必考慮它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也不必害怕使用不當(dāng)會(huì)帶來負(fù)面影響。 Java 封裝的基本單元是類。一個(gè)類( class )定義了將被一個(gè)對(duì)象集共享的結(jié)構(gòu)和行為(數(shù)據(jù)和代碼)。一個(gè)給定類的每個(gè)對(duì)象都包含這個(gè)類定義的行為和結(jié)構(gòu),好像它們是從同一個(gè)類的模子中鑄造出來似的。因?yàn)檫@個(gè)原因,對(duì)象有時(shí)被看作是類的實(shí)例。所以,類是一種邏輯結(jié)構(gòu),而對(duì)象是真正存在的物理實(shí)體。 當(dāng)創(chuàng)建一個(gè)類時(shí),你要指定組成那個(gè)類的代碼和數(shù)據(jù)。從總體上講,這些元素都被稱為該類的成員( members )。具體地說,類定義的數(shù)據(jù)稱為成員變量或?qū)嵗兞俊2僮鲾?shù)據(jù)的代碼稱為成員方法( member methods )或簡稱方法( methods )。 Java 程序員所稱的方法,就是 C/C++ 程序員所稱的函數(shù)( function )。在完全用 Java 編寫的程序中,方法定義如何使用成員變量。 既然類的目的是封裝復(fù)雜性,在類的內(nèi)部就應(yīng)該有隱藏實(shí)現(xiàn)復(fù)雜性機(jī)制。類中的每個(gè)方法或變量都可以被標(biāo)記為私有( private )或公共( public )。類的公共接口代表類的外部用戶需要知道或可以知道的每件事情;私有方法和數(shù)據(jù)僅能被一個(gè)類的成員代碼所訪問,其他任何不是類的成員的代碼都不能訪問私有的方法或變量。既然類的私有成員僅能被程序中的其他部分通過該類的公共方法訪問,那么就能保證不希望發(fā)生的事情就一定不會(huì)發(fā)生。當(dāng)然,公共接口應(yīng)該小心仔細(xì)設(shè)計(jì),不要過多暴露類的內(nèi)部內(nèi)容。
繼承
繼承( Inheritance )是一個(gè)對(duì)象獲得另一個(gè)對(duì)象的屬性的過程。繼承很重要,因?yàn)樗С至税磳臃诸惖母拍睢H缜懊嫣岬降?#xff0c;大多數(shù)知識(shí)都可以按層級(jí)(即從上到下)分類管理。使用了繼承,一個(gè)對(duì)象就只需定義使它在所屬類中獨(dú)一無二的屬性即可,因?yàn)樗梢詮乃母割惸莾豪^承所有的通用屬性。所以,可以這樣說,正是繼承機(jī)制使一個(gè)對(duì)象成為一個(gè)更具通用類的一個(gè)特定實(shí)例成為可能。 我們可以舉例來說,動(dòng)物——哺乳動(dòng)物——兔子這是一個(gè)層級(jí)結(jié)構(gòu)。我們說哺乳類動(dòng)物是動(dòng)物的子類( subclass ),而動(dòng)物是哺乳動(dòng)物的超類( super class )。 由于哺乳動(dòng)物類是需要更加精確定義的動(dòng)物,所以它可以從動(dòng)物類繼承所有的屬性。一個(gè)深度繼承的子類繼承了類層級(jí)中它的每個(gè)祖先的所有屬性。 繼承性與封裝性相互作用。如果一個(gè)給定的類封裝了一些屬性,那么它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向?qū)ο蟮某绦蛟趶?fù)雜性上呈線性而非幾何性增長的一個(gè)關(guān)鍵概念。新的子類繼承它的所有祖先的所有屬性。它不與系統(tǒng)中其余的多數(shù)代碼產(chǎn)生無法預(yù)料的相互作用。
多態(tài)性
多態(tài)性是允許一個(gè)接口被多個(gè)同類動(dòng)作使用的特性,具體使用哪個(gè)動(dòng)作與應(yīng)用場合有關(guān),下面我們以一個(gè)后進(jìn)先出型堆棧為例進(jìn)行說明。假設(shè)你有一個(gè)程序,需要 3 種不同類型的堆棧。一個(gè)堆棧用于整數(shù)值,一個(gè)用于浮點(diǎn)數(shù)值,一個(gè)用于字符。盡管堆棧中存儲(chǔ)的數(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)的動(dòng)作設(shè)計(jì)一個(gè)通用的接口。多態(tài)性允許同一個(gè)接口被同一類的多個(gè)動(dòng)作使用,這樣就降低了程序的復(fù)雜性。選擇應(yīng)用于每一種情形的特定的動(dòng)作 , 是編譯器的任務(wù),程序員無需手工進(jìn)行選擇。我們只需記住并且使用通用接口即可。
多態(tài)性、封裝性與繼承性相互作用
如果用得當(dāng),在由多態(tài)性、封裝性和繼承性共同組成的編程環(huán)境中可以寫出比面向過程模型環(huán)境更健壯、擴(kuò)展性更好的程序。精心設(shè)計(jì)的類層級(jí)結(jié)構(gòu)是重用你花時(shí)間和努力改進(jìn)并測(cè)試過的程序的基礎(chǔ),封裝可以使你在不破壞依賴于類公共接口的代碼基礎(chǔ)上對(duì)程序進(jìn)行升級(jí)遷移,多態(tài)性則有助于你編寫清楚、易懂、易讀、易修改的程序。 所有的 Java 程序都是面向?qū)ο蟮摹;蛘?#xff0c;更精確地說,每個(gè) Java 程序都具有封裝性、繼承性及多態(tài)性。你將看到, Java 提供的許多特性是它的內(nèi)置類庫的一部分,這個(gè)庫使封裝性、繼承性及多態(tài)性得到更廣泛應(yīng)用。
Java 的核心是面向?qū)ο缶幊?. 所有的 java 程序都是面向?qū)ο蟮摹?
以前總聽老師說 c 語言是面向過程的, c++ 和 java 是面向?qū)ο蟮?#xff0c;這些糊涂老師卻從來不說明何為面向過程,何為面向?qū)ο?#xff0c;搞得我一直對(duì)此稀里糊涂。 最近看了不少的資料,在這里總結(jié)一下對(duì)此的心得體會(huì)。
所有的計(jì)算機(jī)程序都由兩類元素組成:代碼和數(shù)據(jù)。換句話說,程序還可以以它的代碼或是數(shù)據(jù)為核心進(jìn)行組織編寫。也就是說,一些程序圍繞 “ 正在發(fā)生什么 ” 編寫,而另一些程序則圍繞 “ 誰將被影響 ” 編寫。第一種方法被稱為面向過程 的模型( process-oriented model ),用它編寫的程序都具有線性執(zhí)行的特點(diǎn)。面向過程的模型可認(rèn)為是代碼作用于數(shù)據(jù),像 C 這樣的過程式語言采用這個(gè)模型是相當(dāng)成功的。第二種方式,也就是面向?qū)ο?的編程( object-oriented programming )。面向?qū)ο蟮木幊虈@它的數(shù)據(jù)(即對(duì)象)和為這個(gè)數(shù)據(jù)嚴(yán)格定義的接口來組織程序。面向?qū)ο蟮某绦驅(qū)嶋H上是用數(shù)據(jù)控制對(duì)代碼的訪問。
這樣說來很籠統(tǒng),也很簡單,下面具體說一下面向?qū)ο蟮木幊趟枷搿?
面向?qū)ο缶幊痰囊粋€(gè)實(shí)質(zhì)性的要素是抽象。那么何為抽象? 抽象與具體相對(duì)應(yīng)。 人們不會(huì)把一臺(tái)電腦想象成由幾萬個(gè)互相獨(dú)立的部分所組成的一套裝置,而是把電腦想成一個(gè)具有自己獨(dú)特行為的對(duì)象。這種抽象使人們可以很容易地用電腦上網(wǎng)打游戲,而不會(huì)因組成電腦各部分零件過于復(fù)雜而不知所措。他們可以忽略內(nèi)存、硬盤、 CPU 的工作細(xì)節(jié),將電腦作為一個(gè)整體來加以利用。在面向?qū)ο蟮挠?jì)算機(jī)世界中,這種細(xì)節(jié)程度就叫抽象。一個(gè)抽象的事物又可以把他細(xì)節(jié)化,例如一臺(tái)汽車有音響系統(tǒng),而音響系統(tǒng)由一臺(tái)收音機(jī)、一個(gè) CD 播放器、或許還有一臺(tái)磁帶放音機(jī)組成。我們可以這樣歸納,在現(xiàn)實(shí)生活中,為了減少必須處理的事情,我們是在某一程度的細(xì)節(jié)中生活的,這中細(xì)節(jié)程度叫抽象 。這種細(xì)節(jié)是相對(duì)的,沒有絕對(duì)的抽象也沒有絕對(duì)的具體正如前面所說,抽象與具體是相對(duì)應(yīng)的概念(有點(diǎn)像相對(duì)論了 ~~ )所以我們可以通過層級(jí)抽象對(duì)復(fù)雜的汽車(或任何另外復(fù)雜的系統(tǒng))進(jìn)行管理。(我們現(xiàn)在開始用這段話來承上啟下了)
復(fù)雜系統(tǒng)的分層抽象也能被用于計(jì)算機(jī)程序設(shè)計(jì)。傳統(tǒng)的面向過程程序的數(shù)據(jù)經(jīng)過抽象可用若干個(gè)組成對(duì)象表示,程序中的過程步驟可看成是在這些對(duì)象之間進(jìn)行消息收集。這樣,每一個(gè)對(duì)象都有它自己的獨(dú)特行為特征。你可以把這些對(duì)象當(dāng)作具體的實(shí)體,讓它們對(duì)告訴它們做什么事的消息作出反應(yīng)。這是面向?qū)ο缶幊痰谋举|(zhì)。
面向?qū)ο蟮母拍钍?Java 的核心,當(dāng)然了對(duì)程序員來講,重要的是要理解這些概念怎么轉(zhuǎn)化為程序。我想任何軟件都不可避免地要經(jīng)歷概念提出、成長、衰老這樣一個(gè)生命周期,而面向?qū)ο蟮某绦蛟O(shè)計(jì),可以使軟件在生命周期的每一個(gè)階段都處變不驚,有足夠的應(yīng)變能力。
所有面向?qū)ο蟮木幊陶Z言都提供幫助你實(shí)現(xiàn)面向?qū)ο竽P偷臋C(jī)制,這些機(jī)制是封裝,繼承及多態(tài)性。現(xiàn)在讓我們來看一下它們的概念。
封裝
封裝( Encapsulation )是將代碼及其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,該機(jī)制保證了程序和數(shù)據(jù)都不受外部干擾且不被誤用。封裝代碼的好處是每個(gè)人都知道怎么訪問它,但卻不必考慮它的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),也不必害怕使用不當(dāng)會(huì)帶來負(fù)面影響。 Java 封裝的基本單元是類。一個(gè)類( class )定義了將被一個(gè)對(duì)象集共享的結(jié)構(gòu)和行為(數(shù)據(jù)和代碼)。一個(gè)給定類的每個(gè)對(duì)象都包含這個(gè)類定義的行為和結(jié)構(gòu),好像它們是從同一個(gè)類的模子中鑄造出來似的。因?yàn)檫@個(gè)原因,對(duì)象有時(shí)被看作是類的實(shí)例。所以,類是一種邏輯結(jié)構(gòu),而對(duì)象是真正存在的物理實(shí)體。 當(dāng)創(chuàng)建一個(gè)類時(shí),你要指定組成那個(gè)類的代碼和數(shù)據(jù)。從總體上講,這些元素都被稱為該類的成員( members )。具體地說,類定義的數(shù)據(jù)稱為成員變量或?qū)嵗兞俊2僮鲾?shù)據(jù)的代碼稱為成員方法( member methods )或簡稱方法( methods )。 Java 程序員所稱的方法,就是 C/C++ 程序員所稱的函數(shù)( function )。在完全用 Java 編寫的程序中,方法定義如何使用成員變量。 既然類的目的是封裝復(fù)雜性,在類的內(nèi)部就應(yīng)該有隱藏實(shí)現(xiàn)復(fù)雜性機(jī)制。類中的每個(gè)方法或變量都可以被標(biāo)記為私有( private )或公共( public )。類的公共接口代表類的外部用戶需要知道或可以知道的每件事情;私有方法和數(shù)據(jù)僅能被一個(gè)類的成員代碼所訪問,其他任何不是類的成員的代碼都不能訪問私有的方法或變量。既然類的私有成員僅能被程序中的其他部分通過該類的公共方法訪問,那么就能保證不希望發(fā)生的事情就一定不會(huì)發(fā)生。當(dāng)然,公共接口應(yīng)該小心仔細(xì)設(shè)計(jì),不要過多暴露類的內(nèi)部內(nèi)容。
繼承
繼承( Inheritance )是一個(gè)對(duì)象獲得另一個(gè)對(duì)象的屬性的過程。繼承很重要,因?yàn)樗С至税磳臃诸惖母拍睢H缜懊嫣岬降?#xff0c;大多數(shù)知識(shí)都可以按層級(jí)(即從上到下)分類管理。使用了繼承,一個(gè)對(duì)象就只需定義使它在所屬類中獨(dú)一無二的屬性即可,因?yàn)樗梢詮乃母割惸莾豪^承所有的通用屬性。所以,可以這樣說,正是繼承機(jī)制使一個(gè)對(duì)象成為一個(gè)更具通用類的一個(gè)特定實(shí)例成為可能。 我們可以舉例來說,動(dòng)物——哺乳動(dòng)物——兔子這是一個(gè)層級(jí)結(jié)構(gòu)。我們說哺乳類動(dòng)物是動(dòng)物的子類( subclass ),而動(dòng)物是哺乳動(dòng)物的超類( super class )。 由于哺乳動(dòng)物類是需要更加精確定義的動(dòng)物,所以它可以從動(dòng)物類繼承所有的屬性。一個(gè)深度繼承的子類繼承了類層級(jí)中它的每個(gè)祖先的所有屬性。 繼承性與封裝性相互作用。如果一個(gè)給定的類封裝了一些屬性,那么它的任何子類將具有同樣的屬性,而且還添加了子類自己特有的屬性。這是面向?qū)ο蟮某绦蛟趶?fù)雜性上呈線性而非幾何性增長的一個(gè)關(guān)鍵概念。新的子類繼承它的所有祖先的所有屬性。它不與系統(tǒng)中其余的多數(shù)代碼產(chǎn)生無法預(yù)料的相互作用。
多態(tài)性
多態(tài)性是允許一個(gè)接口被多個(gè)同類動(dòng)作使用的特性,具體使用哪個(gè)動(dòng)作與應(yīng)用場合有關(guān),下面我們以一個(gè)后進(jìn)先出型堆棧為例進(jìn)行說明。假設(shè)你有一個(gè)程序,需要 3 種不同類型的堆棧。一個(gè)堆棧用于整數(shù)值,一個(gè)用于浮點(diǎn)數(shù)值,一個(gè)用于字符。盡管堆棧中存儲(chǔ)的數(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)的動(dòng)作設(shè)計(jì)一個(gè)通用的接口。多態(tài)性允許同一個(gè)接口被同一類的多個(gè)動(dòng)作使用,這樣就降低了程序的復(fù)雜性。選擇應(yīng)用于每一種情形的特定的動(dòng)作 , 是編譯器的任務(wù),程序員無需手工進(jìn)行選擇。我們只需記住并且使用通用接口即可。
多態(tài)性、封裝性與繼承性相互作用
如果用得當(dāng),在由多態(tài)性、封裝性和繼承性共同組成的編程環(huán)境中可以寫出比面向過程模型環(huán)境更健壯、擴(kuò)展性更好的程序。精心設(shè)計(jì)的類層級(jí)結(jié)構(gòu)是重用你花時(shí)間和努力改進(jìn)并測(cè)試過的程序的基礎(chǔ),封裝可以使你在不破壞依賴于類公共接口的代碼基礎(chǔ)上對(duì)程序進(jìn)行升級(jí)遷移,多態(tài)性則有助于你編寫清楚、易懂、易讀、易修改的程序。 所有的 Java 程序都是面向?qū)ο蟮摹;蛘?#xff0c;更精確地說,每個(gè) Java 程序都具有封裝性、繼承性及多態(tài)性。你將看到, Java 提供的許多特性是它的內(nèi)置類庫的一部分,這個(gè)庫使封裝性、繼承性及多態(tài)性得到更廣泛應(yīng)用。
總結(jié)
以上是生活随笔為你收集整理的java面向对象思想如何理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 张亚勤:从信息化生存到互联网化生存 百度
- 下一篇: JAVA语言的特点