【JAVA中幾個易混淆關鍵詞的正確理解】
行為規范了你能對對象發出的請求。你的CLASS,也就是對象,也就是MM,你把她設計出來了,而且你很BT,只給她設計了兩個行為:愛我()和MAKE愛與我()。那么她便不可能接受其它客戶端class(某個帥哥?)的請求,如果在某個class里,你寫成了MM.愛F4(),那么編
行為規范了你能對對象發出的請求。你的CLASS,也就是對象,也就是MM,你把她設計出來了,而且你很BT,只給她設計了兩個行為:愛我()和MAKE愛與我()。那么她便不可能接受其它客戶端class(某個帥哥?)的請求,如果在某個class里,你寫成了MM.愛F4(),那么編譯器就會出錯。
你理所當然把MM的屬性設成美,你不希望別人來改變這個事實,那么,你就要把這個屬性定義為private,這樣MM便不會在第二天醒來成為傳說中的KL。這在第一章里標題為:被隱藏的實施細節。一個屬性,有四種修飾符,public,private,protected,空(默認,friendly)。分別代表的意思是任何對象可以訪問,本對象內部可以訪問,本對象(class)的繼承者可以訪問,同一個包(package)的其它對象可以訪問。
我們總是想盡可能地讓自己的代碼變的簡潔,這便需要重復運用實現碼。JAVA提供了這種方式,其途徑有兩種:組合和繼承,假設有一個類為A,A有一個行為doSomething(),還有一個類B,不也想dosomething,那么你可以在B里產生一個方法doSomethingToo( A.doSomething(); )。這叫做組合。繼承是另外一種方法,你可以直接用關鍵詞extends,讓B繼承自A,那么你不用特殊額外表達,B在外界看來也是有doSomething的能力的。那么我們要問,我們什么時候要組合,什么時候用繼承呢?BRUCE講,當Bis a A的時候我們用繼承。這不太好理解,我們再舉個MM的例子。MM具備吃飯(eatYou( 進食;消化))的行為,MM衍生開來有好色的MM、愛打屁的MM等,但她們都是MM,也就是isa的關系,這個時候你要設計好色的MM的時候就用繼承,用extends。而GG不是MM,但是GG is like a MM,因為GG也可以吃飯。這個時候我們就不用再去寫eatYou()這個方法了,直接在GG這個類里寫eatYou(MM.eatYou(); )那么,GG也具備了進食、消化的功能。其實我們要常常用到組合,在程序里,用繼承的地方是比較少的。
在繼承當中,有兩個特殊行為需要我們關注:覆寫(overriding)和重載(overloading)?,F在你只需記?。喝绻鸼aseclass和derive class的某個方法名稱相同,引數相同,則為覆寫(overriding),名稱相同,引數相同,則為重載(overloading)。
面向對象一個顯著的優點就是多形(多態)性。我本來是不想在這第一部分寫代碼的,但是似乎這個問題用語言表達不夠直觀,所以就寫了個最簡單的能說明多形性的問題??创a先。。。
//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);
}
}
該代碼運行的結果是:
誘惑GG!!!
好羞澀哦....
我們看到由MM衍生出來有好色MM(HaoseMM),本分MM(BenMM),MM們都可能會看到帥哥,但是好色MM和本分MM看帥哥的眼神是不一樣的,如程序中定義。在愛(Love)這個類里,我們定義一個方法loveGG,我們給它傳遞一個參數,是基類(baseclass)MM,然后toSeeGG()。通過本文最開頭的描訴,我們知道,HaoseMM和BenMM與MM的關系是is a的關系,所以我們在用到loveGG(mm1)和loveGG(mm2)時候編譯器不會出錯。我們看到,程序自動各自執行了haoseMM和BenfenMM的toSeeGG(),而不是打印出“xxx”。這就是多形性。之所以會如此神奇,是因為JAVA運行時環境提供了動態綁定技術。動態綁定會讓你產生的MM在JAVA運行時環境里按照你的指示分別作出行為。OK,我們不需要知道動態綁定是怎么運做的,我們只要知道這是什么,因為我們還在第一章。上溯造型(upcasting)這個概念也在這里被提出來了。在loveGG(MMi)這個方法里,方法接受的是MM,可是loveGG也接受HaoseMM和BenfenMM,這個特性就叫上溯造型。
我們在上面的程序中看到了一句沒有用的代碼,就是在MM類里的System.out.println("xxx");。沒有人關心基類MM是怎么看帥哥,因為它只是一個模版,所以我們干脆就不要這句代碼,而且我們連{}也不要了,直接改寫這個方法為publicabstract void toSeeGG();,那么這個方法稱做抽象方法(abstract method)?;怣M對我們來說沒有實現的必要,于是我們把classMM{...}改寫為abstract class MM{...},那么這個類叫做抽象類(abstract class)。我們不禁要問,那么抽象類能不能含有非抽象的函數呢。答曰:可以。但是這在實際中沒有什么用處,唯一用到的地方是:1,main()函數,用來
測試你的類;2,考試中。那么我們還要問,子類可以不覆寫父類中抽象方法行不行?答曰:如果子類也是abstract,那么可以,否則不行。
比抽象類做的更徹底的是接口(注意,這里的接口是JAVA中真正意義的接口,非上文一開始的接口,也既行為)。接口被設計出來的目的就是要讓你繼承的。等………,這是第一章,只讓大家知道一些概念就行了,上面我們說的太多了。
BRUCE是個徹底的NN大師,我們接下來看到他把JAVA的低效率問題說的是那么的理所當然,以至于我們看完后情不自禁也要說:
恩,JAVA就應該這樣做,讓
C++見鬼去吧。面向對象,于是所有東東都是對象,有對象便有對象的產生和毀滅。程序運行的時候,對象產生在內存中。內存分配有三種策略,分別是靜態的,棧式的(stack),和堆式的(heap)。
C++使用前兩種策略,JAVA僅使用后者。兩者有什么區別呢?喜歡尋根究底的朋友請參考本站JSP/JAVA分壇的“棧存儲(stack)和堆存儲(heap)的區別”,我們只要記住,后者在內存中的尋址要花更長的時間,因此JAVA的效率低。但是JAVA提供了根據heap特點產生的垃圾回收機制。垃圾回收機制完成這樣的任務,當你的對象不在使用的時候它會自動察覺并消滅。你不用再擔心發生內存泄露了。而這是每個C++
程序員最頭疼的事情。所以,你選擇吧,是要
安全還是要效率。
原文轉自:http://www.anti-gravitydesign.com
- 評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
-
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97
|