我的Java故事

  我的Java故事

     Java是個純美的語言,讓人對它有着難抑的情感,我也是。

     我喜歡神祕的東西,學過很多的語言,可要是你問我:“你學的第一門計算機語言是什麼”,我回答:“是Java”。

     記得是剛進大學沒幾天,學校的社團就開始了招新。當時,我心裏就想象過很多次大學的社團。那是一個思想、激情碰撞的地方,有人會站在講臺上給你講馬克思共產主義理想,衆人會爲一個觀點的分歧而爭論得面紅耳赤……大家都在尋找着心中的真理。

     在沒有準備的情況下,幾個人推開了我們寢室門,讓我們入會。其實,一聽是科技協會,真的覺得就是它。那天晚上,社團新會員大會,我和同寢室的同學一起去的。當時,帶上了筆記本的,因爲感覺社團的幹部定會有很重要的講話需要記下來。我們兩個沒敢坐前面,在中間的位置坐下。周圍的人都不認識,心裏只覺得這小子肯定很厲害。我們來得太早了,似乎早了半個多小時。看着臺上走來走去的人,好像是幹部,他們一定更厲害。總之,我感覺自己真的很崇拜這些人。他們在會上說的很多,我太有記得了,但是最重要的是他們要招新一屆社團幹部,並且希望大家自薦。說實話,當時大家可能都不太明白形勢,好像沒有人吱聲。所以,就改在會後交自薦書。我和同學都寫了自薦書,我沒有寫什麼,無非就寫自己高中的時候做過班委、學習還算努力、做事比較認真,也不曉得對不對。最後要走的時候,我們有點好奇或者迷糊,索性就去問那些幹部,問問他們需要什麼樣子的人吧。

     他問:“會彙編語言嗎?”。

     我說:“不會,信息技術課裏聽過。”。

     又問:“那你會Java語言嗎?”。

     我說:“不會,沒聽過。是什麼?”

     他講了一些我聽不懂的話……,我很白癡

     他問:“會Basic嗎?”。

     我說:“在我初三時買的小霸王的多媒體機上學習過QBASIC,那時沒看懂。高一的時候,信息技術課上也學了點,會寫循環程序。後來,偶也會在同學文曲星上玩。”。              

     他問:“那你還會點計算機方面其他什麼的?”

     我說:“在初2的時候,在通途建站家園上用過自助建站,接觸了點網站建設,知道用別人寫的網頁代碼。還有就是小學六年級就開始玩電腦遊戲,初2開始喜歡玩星際爭霸,高中由於學習,很少玩遊戲。現在喜歡CS”。

     他告訴我們,回去以後等待他們篩選自薦材料,我們便走了。在回去的路上,我們倆說了一路,我心裏卻一個勁的冒着一字“Java”。

     不知道爲什麼,後來這人打電話給我,問我願不願意協會活動部部長了。那段時間,我興奮了很幾個晚上,想着“一級社團”、“部長”。感覺天上掉餡兒餅,我什麼都不會嘛,怎麼在做幹部呢。那天晚上,我去了學校裏的一個小書店,轉着轉着,老闆問我:“同學你找什麼書?我可以給你推薦。”。

     當時,腦子裏很蒙,這裏這麼多書,那本適合我?可是,人家問我,我隨口就說:“Java”,心想:管它呢,說不定不是什麼神祕的東西,只是但願自己沒有出醜,如果他要是再問我些什麼,我可就答不出來了。

     老闆給我指向我旁邊的一個書架的一層,說:“這裏面有基本書還不錯,你可以看看。”。

     我走到那書架面前,我第一次見到了書上寫着的“Java”單詞。

     原來,他念Java

     我抽出了書名叫《Java簡明教程》的一本書,咖啡色的封皮,封面上一杯咖啡的圖畫,很優美。後來,我買了它,Java也就成了我學的第一門語言。     後來的事。我花了2個月看幾乎每段話都要琢磨的書,因爲我真的是第一次學習一門程序語言。因爲太難速度太慢,爲了能學快一點,我有的時候熄燈了還要繼續看下去,不少時候看得打瞌睡,可能是高三的後遺症。即便今天再回想,真的很佩服自己那麼執著。書上很多筆記,幾乎是在記錄自己的思考,有點笨的方法。

     今天,我再看了一次這本咖啡色書,又入了迷,我回憶起了關於我和Java的故事。

 

我把一些筆記抄到這裏。

 

 

語法基礎:

·變量的賦值與初始化,都是用賦值運算符“=”給變量賦值。對於整型變量來說,賦值可以用兩種方式起同樣效果。

     賦初值的形式。用兩條語句完成。先定義,在賦初值。

     初始化形式。用一條語句完成。在定義的同時,賦給變量以個初始值。在定義時,也可以初始化多個變量,用逗號隔開。但也不是所有變量在定義時都需要初始化,也可以其中某些變量值定義不初始話

     注意:上面兩種方法在定義常量或定義一個對象時,兩者的差別很大。

·可以在一個語句裏建立多個同一類型的變量,方法是在其後加上多個變量名,中間用逗號隔開。但不能以個語句中定義不同類型的變量。

·變量名與字符變量(char)不同。變量名只是指變量的名稱;而字符變量是一種數據,也有變量名。如

Int a=18

Char a='a'

a是字符型變量,它同時也可以說是一個變量名。指定了其爲字符變量類型,賦與了字符型常量。

·關鍵字final表示可以對變量賦值一次,且它的值一旦設定,便不再變化,即定義了一個常量。在Java中通常還是希望一個常量在某個類中的多個方法都是可用的,這種常量稱爲類常量。

·注意類常量定義在main方法的外部,則此常量也可以被這個類的其他方法使用。此外,如果同時被聲明爲public,那麼其它類中的方法也可以使用這常量。

·Java中整型的範圍與運行Java代碼的機器無關。能在所有的機器上都有相同的運行結果,也正因此不同類型的範圍是固定的。(這由於CC++

·注意在Java中沒有無符號類型。

·C/C++不同,Java中沒有long double長雙精度型。

·使用float類型的原因是,某些極少數的情況下,需要稍微快速單精度數據或者需要大量存儲這樣的數據。

·所有的浮點計算都符合IEEE754規範。此外,有三種特殊的浮點值(常量):

正無窮大(Double.POSITIVE_INFINITY

負無窮打(Double.NEGATIVE_INFINITY

非數字(Double.NaN)——所有的“非數字”都是獨特的,無法檢測儀個特定值與其是否相等。

If(x==Double.NaN) //始終不會爲True 

但是可以用If(Double.isNaN(x)) 方式來檢測一個數是否是“非數字”

·轉義字符:意思是將“/”後面的字符轉變成另外的意思。有些是控制字符,有些是表示字符的字符,有的還可以表示操作符。轉義字符後面的數字是Unicode字符集,而不是ASCII,這與C/C++不同。

·Unicode字符集:Unicode被設計用來處理世界上所有書面語言中的字符,它佔2個字節。因此,可允許使用65536個字符。目前,大約有35000個字符被使用。而ASCII碼只佔1個字節,可允許128個字符。而普遍使用的ISO8859-1擴展的ASCII碼集,也只能允許256個字符,它是Unicode的子集,更確切地說,它是Unicode編碼表中的前256個字符。

·C++/C中可以依據ASCII碼,使字符與整型數據相互賦值。而在Java中,只能給字符型數據賦與字符型常量。

·布爾類型數據不能被強制轉換。

·強制類型轉換又稱顯示轉換,其語法是在一個數值或變量前加上帶括號的類型名,但轉換一定要超出目標類型的範圍。

·自動類型轉換又稱隱式類型轉換:轉換總是轉換總是向着表達數據類型更強的方向,並且在運算中轉換總是逐個運算符進行的。

·遵守自動類型轉換的原則。兩個操作數:

只要有一個doble型,另一個轉換成double型;

否則,只要一個是float型,另一個轉換成float型;

否則,只要一個是long型,另一個轉換成long型;

否則,兩個操作數轉換成int型。

自動轉換的方向表:   char   short    int      long    

                                                                                    double

                                                                   float     

     轉換從表達能力低的類型表達能力強的類型不會有信息損失,但反之,則會損失一些精度。

·布爾邏輯運算的規則是:從左至右運算,先求出運算符左邊的表達式的值。||(或)運算中,如果爲true,則整個表達式的結果爲true,不必再對||運算符右邊的表達式運算;同樣,在&&(與)運算中,如果左邊表達式的值爲false,則不必對右邊的表達式求職,整個表達式的結果爲false。所以,可以利用此特點,產生高效的代碼。

     由於&&||比關係運算符優先級低,所以一般情況下,先作關係運算再作邏輯運算。若先進行邏輯運算,則需要用括號改變運算順序。   

·!”爲邏輯非運算符,改變表達式的真假值,即邏輯運算的“非”。它的優先級比“==”和“=”都低。

·while循環體應用花括號括起來,特別是在有一個以上的語句時。否則,while的範圍只到while後面第一條語句。這也說明如果只有一條語句,則可省略花括號。

·循環最先做的應該是循環變量初始化。

·數學表達式和常量。

     Math類包含了不同的數學函數靜態方法:

          計算一個數的平方更,使用sqrt()方法。如y=Math.sqrt(x)

Xa次方的求方算法,如doble y= Math.pow(x,a)

Math類提供了常用的三角函數方法:

     Math.sin     Math.cos     Math.tan     Math.atan     Math.atan2

Math類的求指函數和它的反函數——自然對數的方法:

     Math.exp     Math.log

此外,還有兩個常量:Math.PIMath.E

     Math類裏的函數利用計算機浮點單元的例程來達到最快的性能。如果得到安全可測的結果比最快的性能更重要的花,應該使用StaticMath方法,它從“自由分別數學庫”中實現其運算方則,保證了所有平臺都可以得到相同的結果。

 

類:

·Java要求每個類都有父類。

·在同一個源程序文件中不能出現兩個以上的public類,否則編譯器會提示錯誤,叫你將第二個public類方在另一個文件中。

·接口是消息傳遞的通道。通過接口,消息才能傳遞到處理方法中進行處理。一個類實現多個接口,用逗號分開。

·abstract說明的抽象類,只能被繼承,不能用它實例化一個對象。

·Java中自定義類實際是繼承JavaObject類的子類。

·protected修飾的變量和方法,只有在同一個包中的子類才能訪問,不同包的子類不能訪問。

 

包:

·包是體現Java面向對象編程特性中的封裝機制。同一個包中的類在默認情況下可以相互訪問。在默認情況下,系統會爲每一個.java源文件創建一個無名包,所有.java文件中定義的所有類都隸屬於這個無名包,之間可以相互引用非private的域或方法,但這個無名包中的類不能被其他包中的類所引用和複用。

·一個類引用其他的類,無非是繼承這個類或創建這個類的對象並使用它的域、調用它的方法。同一個包中的其他類,使用時在屬性或方法前加上類名作爲前綴;對於其他包中的類,則需要在類名前綴的前面加上包名前綴或用impor語句先將整個包加載到當前。

·當以個程序找不到它所需要使用的其他類的.class文件時,系統會自動到ClASSPATH環境變量所指明的路徑去尋找,可以DOS下使用SET CLASSPATH命令。對Java Application程序,還可以通過爲Java解釋器設置參數來指定類文件路徑。

接口:

·Java的接口與包類似,也是用來組織程序中各個類並調節它們之間的相互關係的一種結構。更準確地說,接口是用來實現多重繼承功能的結構。因爲JavaC++不同,只支持但以繼承機制,所以引入接口概念。

·Java的接口中屬性都是常量;方法都是沒有方法體的抽象方法,沒有定義具體具體操作,而需要在“繼承”這個接口的各個類中完成。因而,接口定義僅僅是實現某一特功能的一組功能的對外規範。在Java中通常把接口功能的“繼承”稱爲“實現”。interface是聲明接口的關鍵字,implements是實現接口的關鍵字。

·接口只有public一個訪問控制修飾符。使用public的是公共接口,而沒有使用public的是接口只能被捅一個包中的類和接口使用。

·接口也有繼承性,可以從其他接口extends方式繼承而來,一個接口可以有多個父接口。

·接口中的屬性都是publicfinalstatic屬性的,方法都是publicabstract屬性的,所以都可以省略,效果一樣。接口中的方法只能給出方法名,返回值和參數列表。

·Java接口中的方法可以由Java語言書寫,也可以由其他語言書寫。後一種方法可以由native修飾符修飾。

·非抽象類中不能存在抽象方法。因此,非抽象的類都必須實現所繼承接口中的所有方法。如果是抽象類,則不必實現該接口的所有方法,但該抽象類若有子類是非抽象的,則該子類必須要有抽象父類所實現接口中的所有抽象方法實現的方法體。如果實現某接口抽象方法的時,方法頭不完全相同,則只會是重載了一個新方法,而不是實現。

·由於接口中的抽象方法的訪問限制符被指定爲public,所以類在實現必須顯示使用public修飾符,不能再省略。否則,回被警告爲縮小了接口中定義的方法的訪問控制範圍。

異常:

·異常定義:異常是一個在程序執行期間發生的事件,它中斷正在執行的程序的正常的指令流。有許多種異常,如程序錯誤、空指針、數組溢出等。

·Java使用異常爲方法異常中止和錯誤處理提供一個清晰接口。

·Java用面向對象的方法處理異常。每一種特定的運行錯誤都對應一種異常類,每一個異常事件由一個異常類的對象來代表。所有Java異常類都是系統類庫Exception的子類。

·異常在Java語言中是以類的實例的形式出現。當一個方法發生錯誤時,這個方法創建一個異常對象,並把它傳遞給運行時系統即拋出異常。異常對象包含了有關錯誤的信息,這些信息包括錯誤的類型、在程序發生錯誤時的狀態。

·Throwablejava.lang包中的一個類。它派生了兩個子類ErrorException

     Error由系統保留,如動態鏈接錯誤(LinkageError)、虛擬機錯誤等,由Java虛擬機生成並拋出,通常java虛擬機不對這類異常處理。而只有Exception類的後代纔可以被拋出,供應用程序使用。

     Exception類的子類有三個主要層次:

          Exception類直接派生而來的異常類,如AWTException類、ClassNotFoundException類等。

          I/O異常類。

          運行時異常類。

 

        

                         1.1 異常類的繼承結構圖

 

·非運行時異常是在Java運行時系統外的代碼中發生的異常,必須在程序中進行處理,否則編譯程序會指出錯誤。而運行時異常(也被稱爲被檢查的異常),在程序中可以不處理,儘管它可以被捕獲,而直接由運行時系統來處理。

·如果一個方法拋出異常且迴避處理,這個異常將在調用堆棧中向下傳遞,直到被異常處理器處理。如果找不到這個異常處理方法,那麼方法unCaughtException()方法會被當前進程的父進程ThreadGroup調用。

·異常類的構造函數的兩種形式:public Exception()public Exception(String s)。第二個構造函數接受一個字符串參數,一般表示該異常對應的錯誤描述。

·通過異常處理的常用方法,可獲取異常的信息。異常常用的3個方法:

     public void printStackTrace()或void printStackTrace(PrintStream):指出異常的類型、性質、棧層次及出現在程序中的位置。

     public getMessage():輸出錯誤的性質。

     public toString():給出異常的類型與性質。

     其他方法:我們還可以從Object(所有對象的基類)獲得一些方法,如getClass()獲得者個對象的類,及其getName()toString()查詢類的名字。

·通過catch語句捕獲類型匹配的異常,類型匹配指的是異常類型與生成的常常對象完全一致或是它的父類。catch語句的排列順序應該從特殊到一般,否則放在後面的catch語句塊將永遠執行不到。一個catch語句也可以處理多個異常類型,這時它的異常參數應該是這個多個異常類型的父類。

·try-catch-finally語句中,finally爲程序提供了一個統一的出口。通常在finally語句塊中進行資源的清除,如關閉打開的文件等。

·如果一個被調用的方法的在其定義中,未用try-catch-finally語句來對它產生的非運行時異常進行處理,則需要用throws聲明它可能拋出的異常類型,以使異常可以被調用它的方法處理。否則,編譯程序會指出錯誤。

·有時候會在catch語句裏或其它地方,對得到異常對象重新拋出,拋給更高一級環境的異常捕獲處理模塊,如“throw e”。這時拋出的異常的有關信息仍爲異常起源地的信息。如果要將當前堆棧的信息來填充原來的異常對象中的舊信息,則可調用fillInStackTrace()方法,如“throw e.fillInStackTrace()”,它丟失了起源地有關的信息。fillInStackTrace()返回的是一個Throwable對象,因此可能會使原來設計特別用來捕捉Throwable某個子類異常對象的句柄失去目標,而不被執行。

·如果在try塊中產生異常,而未用catch塊捕捉,且在finally塊中有返回語句,則會造成程序正常返回而丟失異常。

·用try-finally處理異常時,如果try塊出現的異常,在被上一級的catch塊處理異常前,finally塊中的代碼又出現異常,那麼try塊的異常將不被處理,轉而處理finally塊中出現的異常,造成try塊中的異常丟失。

 

參考:

學勤:《Java簡明教程》,清華大學出版色20027月版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章