行為規(guī)范了你能對對象發(fā)出的請求。你的CLASS,也就是對象,也就是MM,你把她設(shè)計(jì)出來了,而且你很BT,只給她設(shè)計(jì)了兩個(gè)行為:愛我()和MAKE愛與我()。那么她便不可能接受其它客戶端class(某個(gè)帥哥?)的請求,假如在某個(gè)class里,你寫成了MM.愛F4(),那么編譯器就會(huì)出錯(cuò)。 你理所當(dāng)然把MM的屬性設(shè)成美,你不希望別人來改變這個(gè)事實(shí),那么,你就要把這個(gè)屬性定義為PRivate,這樣MM便不會(huì)在第二天醒來成為傳說中的KL。這在第一章里標(biāo)題為:被隱藏的實(shí)施細(xì)節(jié)。一個(gè)屬性,有四種修飾符,public,private,protected,空(默認(rèn),friendly)。分別代表的意思是任何對象可以訪問,本對象內(nèi)部可以訪問,本對象(class)的繼續(xù)者可以訪問,同一個(gè)包(package)的其它對象可以訪問。 我們總是想盡可能地讓自己的代碼變的簡潔,這便需要重復(fù)運(yùn)用實(shí)現(xiàn)碼。java提供了這種方式,其途徑有兩種:組合和繼續(xù),假設(shè)有一個(gè)類為A,A有一個(gè)行為doSomething(),還有一個(gè)類B,不也想do something,那么你可以在B里產(chǎn)生一個(gè)方法doSomethingToo( A.doSomething(); )。這叫做組合。繼續(xù)是另外一種方法,你可以直接用要害詞extends,讓B繼續(xù)自A,那么你不用非凡額外表達(dá),B在外界看來也是有doSomething的能力的。那么我們要問,我們什么時(shí)候要組合,什么時(shí)候用繼續(xù)呢?BRUCE講,當(dāng)B is a A的時(shí)候我們用繼續(xù)。這不太好理解,我們再舉個(gè)MM的例子。MM具備吃飯(eatYou( 進(jìn)食;消化))的行為,MM衍生開來有好色的MM、愛打屁的MM等,但她們都是MM,也就是is a的關(guān)系,這個(gè)時(shí)候你要設(shè)計(jì)好色的MM的時(shí)候就用繼續(xù),用extends。而GG不是MM,但是GG is like a MM,因?yàn)镚G也可以吃飯。這個(gè)時(shí)候我們就不用再去寫eatYou()這個(gè)方法了,直接在GG這個(gè)類里寫eatYou( MM.eatYou(); )那么,GG也具備了進(jìn)食、消化的功能。其實(shí)我們要經(jīng)常用到組合,在程序里,用繼續(xù)的地方是比較少的。 在繼續(xù)當(dāng)中,有兩個(gè)非凡行為需要我們關(guān)注:覆寫(overriding)和重載(overloading)。現(xiàn)在你只需記住:假如base class和derive class的某個(gè)方法名稱相同,引數(shù)相同,則為覆寫(overriding),名稱相同,引數(shù)相同,則為重載(overloading)。
面向?qū)ο笠粋€(gè)顯著的優(yōu)點(diǎn)就是多形(多態(tài))性。我本來是不想在這第一部分寫代碼的,但是似乎這個(gè)問題用語言表達(dá)不夠直觀,所以就寫了個(gè)最簡單的能說明多形性的問題。看代碼先。。。 //Love.java class MM{ public void toSeeGG(){ System.out.println("xxx"); } }
class HaoseMM extends MM{ public void toSeeGG(){ System.out.println("誘惑GG!!!"); } }
class BenfenMM extends MM{ public void toSeeGG(){ System.out.println("好羞澀哦...."); } }
public class Love{ public static void loveGG(MM i){ i.toSeeGG(); } public static void main(String[] args){ MM mm1 = new HaoseMM(); MM mm2 = new BenfenMM(); loveGG(mm1); loveGG(mm2); } } 該代碼運(yùn)行的結(jié)果是: