面向?qū)ο缶幊谈攀觯?br>
簡單的說,面向?qū)ο缶幊蹋∣bject Oriented Programming,簡稱OOP)描述的是對象之間的相互作用。
面向?qū)ο缶幊膛c面向過程編程的區(qū)別:
過程化程序設(shè)計(jì)先確定算法,再確定數(shù)據(jù)結(jié)構(gòu);面向?qū)ο缶幊滔却_定數(shù)據(jù)結(jié)構(gòu),再確定運(yùn)算。
面向過程編程的程序員,習(xí)慣于建立數(shù)據(jù)結(jié)構(gòu)存放數(shù)據(jù)并定義方法(函數(shù))來操作數(shù)據(jù);面向?qū)ο缶幊痰某绦騿T則構(gòu)造一個對象模型,將數(shù)據(jù)與方法組織在一起。
對象 對象的狀態(tài) 對象的行為:
我們可以把現(xiàn)實(shí)世界的事物抽象成對象。
對象一般都有兩個特征:狀態(tài)(state)和行為(behavior)。
軟件的對象概念是由現(xiàn)實(shí)世界對象抽象而來 。把現(xiàn)實(shí)世界對象的狀態(tài)保存在軟件對象的變量中;現(xiàn)實(shí)世界對象的行為通過軟件對象的方法(函數(shù))來實(shí)現(xiàn)。
類和對象:
把相似的對象劃歸成一個類。
在軟件中,類,就是一個模板,它定義了通用于一個特定種類的所有對象的狀態(tài)(變量)和行為(方法)。
類是創(chuàng)建對象的模板,對象是類的實(shí)例。
面向?qū)ο蟪绦蛟O(shè)計(jì):
從程序設(shè)計(jì)的角度看,類是面向?qū)ο蟪绦蛑凶罨镜某绦騿卧?。類?shí)質(zhì)上定義的是一種數(shù)據(jù)類型,這種數(shù)據(jù)類型就是對象類型 。所以我們可以使用類名稱來聲明對象變量。
聲明對象變量之后,還不能使用對象。必須用運(yùn)算符new創(chuàng)建對象實(shí)體之后,才能使用對象。
類的構(gòu)造方法:
構(gòu)造方法的名字和類名相同,并且沒有返回值。
構(gòu)造方法主要用于為類的對象定義初始化狀態(tài)。
我們不能直接調(diào)用構(gòu)造方法,必須通過new關(guān)鍵字來自動調(diào)用,從而創(chuàng)建類的實(shí)例。
Java的類都要求有構(gòu)造方法,如果沒有定義構(gòu)造方法,Java編譯器會為我們提供一個缺省的構(gòu)造方法,也就是不帶參數(shù)的構(gòu)造方法。
new關(guān)鍵字的作用:
為對象分配內(nèi)存空間。
引起對象構(gòu)造方法的調(diào)用。
為對象返回一個引用。
缺省構(gòu)造方法:
當(dāng)我們用缺省的構(gòu)造方法初始化對象時,系統(tǒng)用默認(rèn)值初始化對象的成員變量。
各種數(shù)據(jù)類型的默認(rèn)值為:
數(shù)值型 0
boolean false
char ‘\0’
對象 null
方法的重載(overload):
重載構(gòu)成的條件:方法的名稱相同,但參數(shù)類型或參數(shù)個數(shù)不同,才能構(gòu)成方法的重載。
特殊變量this:
this變量代表對象本身
當(dāng)類中有兩個同名變量,一個屬于類(類的成員變量),而另一個屬于某個特定的方法(方法中的局部變量),使用this區(qū)分成員變量和局部變量。
使用this簡化構(gòu)造函數(shù)的調(diào)用。
關(guān)于實(shí)例方法和實(shí)例數(shù)據(jù)成員的進(jìn)一步說明
一個類所有的實(shí)例(對象)調(diào)用的成員方法在內(nèi)存中只有一份拷貝,盡管在內(nèi)存中可能有多個對象,而數(shù)據(jù)成員在類的每個對象所在內(nèi)存中都存在著一份拷貝。this變量允許相同的實(shí)例方法為不同的對象工作。每當(dāng)調(diào)用一個實(shí)例方法時,this變量將被設(shè)置成引用該實(shí)例方法的特定的類對象。方法的代碼接著會與this所代表的對象的特定數(shù)據(jù)建立關(guān)聯(lián)。
關(guān)鍵字static:
靜態(tài)方法和靜態(tài)變量是屬于某一個類,而不屬于類的對象。
靜態(tài)方法和靜態(tài)變量的引用直接通過類名引用。
在靜態(tài)方法中不能調(diào)用非靜態(tài)的方法和引用非靜態(tài)的成員變量。反之,則可以。
可以用類的對象obj去調(diào)用靜態(tài)的方法method(),如:obj.method()。
常量的定義:
使用關(guān)鍵字final定義常量,例如:
final double PI=3.1415926;
作為一種約定,在定義常量時,通常采用大寫形式。
final常量可以在聲明的同時賦初值,也可以在構(gòu)造函數(shù)中賦初值。
為了節(jié)省內(nèi)存,我們通常將常量聲明為靜態(tài)的(static)。
類的繼承:
理解繼承是理解面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵。
在Java中,通過關(guān)鍵字extends繼承一個已有的類,被繼承的類稱為父類(超類,基類),新的類稱為子類(派生類)。
在Java中,不允許多繼承。
方法的覆蓋(override):
在子類中定義一個與父類同名、返回類型、參數(shù)類型均相同一個方法,稱為方法的覆蓋。
覆蓋發(fā)生在子類與父類之間。
特殊變量super:
特殊變量super,提供了對父類的訪問。
可以使用super訪問父類被子類隱藏的變量或覆蓋的方法。
每個子類構(gòu)造方法的第一條語句,都是隱含地調(diào)用super(),如果父類沒有這種形式的構(gòu)造函數(shù),那么在編譯的時候就會報(bào)錯。
多態(tài)性:
通過覆蓋父類的方法來實(shí)現(xiàn),在運(yùn)行時根據(jù)傳遞的對象引用,來調(diào)用相應(yīng)的方法。