国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

JAVA學習經驗之談

2019-11-18 11:45:46
字體:
來源:轉載
供稿:網友

  本文是我自2002年9月開始java學習以來的一點經驗之談。首先我不是有豐富編程經驗的程序員,所以本文不對JAVA的具體語法、編程技巧和設計模式做過多的論述,僅從個人的學習角度談感受。
  
  由于有大學期間的C語言學習經歷我對JAVA的基本語法相對來說比較熟悉。最開始的幾個星期我一直在努力理解JAVA語言運做方式和熟悉語法,分別包括JVM虛擬機的運做原理、JAVA程序元素在內存中的分配、JAVA是如何實現跨平臺的可移植能力、及其JAVA為何被稱為一種健壯的語言、APPLET小程序的概念;許多語言都通有的基本型別、流程控制語句、基本類庫函數等等。到后來逐步了解了JAVA語言的一些特性比如JAVA對指針的處理、數組的特性、特有的接口功能(實現了C++的多繼續功能,同時擯棄了相應的負面效果)、完善的異常處理機制、以及JAVA對流訪問的實現方式、簡化的網絡編程、顯式的線程定義等等。
  
  其中熟悉語法的過程相當漫長,就是到現在我也不能說自己已經充分把握了其中的全部,因為JAVA提供的標準類庫實在是個龐大的集合,以至于常用的類庫只占其中的很小比例。
  下面我將對不同的學習單元做較具體的說明。
  
  首先應該是對OOP的理解,在充分把握OOP語言之前只能給出相對籠統的描述,如同管中窺豹只見一斑,OOP(OBJECT ORIENTED PROGRAMMING)面向對象的程序設計,字面上看是把對象作為主體,對象可理解為抽象的物體,這里先談談我對過程化程序語言的理解,許多資料描述PPL(PROCEDURAL PROGRAMMING LANGUAGE)用了一個“HOW”
  ,意思是說PPL描述了如何完成動作,當然完成動作的物體可以稱之為OBJECT,所以我理解為PPL語言是在描述一個物體如何去做一個或多個動作執行程序任務,假如需要完成多個動作就需要多段代碼,假如不同物體完成相同的任務也要重新寫代碼,這就造成浪費,另外,假如PPL中的部分代碼需要修改,差不多肯定要影響到后面的部分,這造成維護的困難,由于PPL代碼的功能和代碼本身是密不可分的,所以隱藏重要代碼成為不可能(為什么要藏呢?比如說你寫了一個商用類庫的第1個版本并且發放出去了,后來你發現前一個版本里有個函數有點不妥當需要修改或者干脆刪掉,這時候問題來了,由于你的代碼對用戶是完全透明的,有的用戶已經把你要修改的函數應用到自己的程序中去了,假如你改變了原來的代碼,用戶的代碼也隨即無法工作,這就是不使用實現隱藏的災難,相信你的老板面臨由你一手造成的兩難境地時不會對你手軟~)。下面該OOP了,它把一切事物都抽象為對象OBJ這和人類的思維方式相同,但是需要一點哲學的思想,所以我一直認為哲學和編程是緊密對應的,OOP優雅地解決了PPL的所有問題,實現了封裝和代碼重用,這就達到了信息隱藏和效率的提升,同時也降低了維護的成本,然而,我們是不是應該淘汰PPL呢,既然OOP這么優秀我們還有什么理由繼續使用PPL呢,在我看來答案是否定的,為什么呢,大家知道C是一種過程化的語言,它是和UNIX一起成長起來的,幾十年的時間以來它一直經久不衰,有存在就一定有原因,C被搞硬件編程的人稱為高級語言,因為它和匯編語言相比確實要方便許多,假如你知道匯編語言的重要性同時也就明白了C語言的價值,就是對硬件的底層編碼,高效率和可讀性在C中被結合,C就是一種過程化語言,所以許多的過程化語言都將存在下去,他們有的語法簡單易用、有的具備非凡的功能。PPL和OOP注定將共存,沒有好與壞的區別,編程語言的發展就象人類的歷史一樣,以前人們知道通過捕魚可以得到魚吃,說不定哪天就出現專門在海里工作的自動捕魚機,人們要做的只是到機器那去取魚,而捕魚的過程被封裝在捕魚機的機器里,這個比喻也許能幫助你理解OOP的概念,但這個不是全面,具體的要靠自己去理解。
  
  下面談JAVA特有的JVM(JAVA VIRTUAL MACHINE)吧,虛擬機這個概念不好理解,什么叫虛擬機?這和JAVA特有的可移植性有關,既然要可移動就不能和具體的計算機硬件有關,你這樣想吧,假如WINDOWS機器是美國人,UNIX機器是法國人,APPLE機器是德國人,并且假設你只會漢語而且你是這三個只懂本國語言人的老板,你需要給他們布置工作,于是你找到他們三個,面對面講話,他們誰也聽不懂啊,所以你們在一起工作沒有結果可言。所以你就想了個主意,你為他們每個人都配了個形影不離的翻譯,你說話時對著翻譯,翻譯就把你的話解釋給他們三人,OK,問題解決,你應該會問這樣做不是要增加成本嗎,沒錯,翻譯的過程是要損失效率的,但這使你不至于什么事都做不了。現在你應該能多少了解JVM的概念了吧,就象個翻譯。
  
  這個將是很輕易被忽視但是極端重要的東東—JAVA元素在內存中的分配情況。首先假定你有STACK堆棧的概念,它是內存中的一個部分,特性是數據訪問是先進后出,后進先出,這里你要明白這8個字有個隱含的約束,就是時間,假如你要明確數據進出的順序,就要明確它們進出的時機,主要是出棧的時間,就是說你要明確指出什么時候這個數據應該出棧,這樣才能保證先前進棧的數據有機會出棧。還有就是堆的概念,堆是程序運行時大量OBJECT對象存在的空間,你要有個形象的想象圖,不要以為計算機是在神奇地憑空完成程序,就象自然萬物數據也是要有空間才能存在的,回顧剛才說到的堆棧以及它的特性,先告訴你它被用來存放基本數據類型和REFERENCE引用,什么是引用呢,書上說它是指向OBJECT物體的東西,用它來訪問具體的OBJECT,那為什么不直接訪問OBJECT呢?我猜想有如下原因(不一定是事實,也不是無道理),首先是因為效率,訪問堆棧的速度要比堆快,因為堆相對堆棧比較無序、無組織性,你也許要問,那為什么不把OBJECT對象放到堆棧里呢,那樣不是更快么?別忘了OBJECT和自然物體一樣也有屬性的,屬性不好理解,你就當它是體積、重量什么的吧,把OBJECT放到堆棧是不可能的,堆棧容納不下(我猜測堆棧的大小是固定的值而且不會很大),即使能容納下個別的OBJECT,注重OBJECT的體積可不全一樣。明智的方法是用REFERENCE做個標示,假設你在一個阿拉伯國家當老師,那里的人名字可是很長的,又假使你很熟悉你的每個學生所以不會認錯人并且你給他們每人一個固定的學號,上課時你要叫學生回答問題,你選擇叫他們完整的全名呢(阿拉伯國家叫全名以外的外號和縮短的名字是不尊重的行為,也許吧,哈哈),還是叫他們的學號?REFERENCE引用就好比學號吧。另外還有STATIC靜態內存區,是用來專門保存靜態數據的,他們有著非凡的作用和意義,先不說這個。前面說到的這些還不完全,但有一點可以肯定,明確了解他們會使你更快地把握編程語言,幫助理解和分析具體的程序,這些對學習任何一門語言來說都同樣重要。
  
  現在來說一下OVERLOAD和OVERRIDE這兩個概念,不幸的是這兩個非常重要的概念被許多人錯誤地理解了,真是要細細說道一下。首先,看這兩個英文單詞:OVERLOAD—
  超載,過載,重載,超出標準負荷;OVERRIDE:重置,覆蓋,使原來的失去效果。這兩個詞在外國人來看絕對不會弄混,可換了國人恐怕沒幾個初學者能搞得明白,問題在哪呢?我來告訴你,就在這個“重”字上,有許多人(包括我的大學C++課老師)讀OVERLOAD的中文譯名為—重(chong 二聲,升調)載,實際上應該讀(zhong 四聲,降調),OVERRIDE的中文譯名是—重(chong 二聲,升調)置,把重載和重置混為一體了,接著就有人把二者混用,原因主要還是對二者的涵義不明晰。先說OVERLOAD,其實OVERLOAD和OVERRIDE不是什么具體的東西,二者都是機制,OVERLOAD我喜歡叫它超載,是對函數而言(假如不知道什么是函數……那你不要看了)也就是方法(JAVA的函數標準稱謂),這里引用一個經典的說明:你怎么表達洗東西,是不是說洗手、洗車、洗衣服之類的?這些你平時再也熟悉不過的詞語的涵義是什么你真的清楚嗎?比如洗車怎么洗,洗手又怎么洗,它們是相同的過程嗎?你肯用洗車的方式洗手?還是用洗衣服的方式去洗車?懂了嗎,盡管你說話的時候沒有明確地說我要洗我的手,用洗手的方式;或者我要用洗衣服的方式洗一件衣服。不需要那樣麻煩地表達,這就是超載的意思了,具體的語法用我解釋嗎?好吧,OVERLOAD超載是指在同一可訪問區內被聲名的、幾個、具有不同參數列的(參數類型/個數/順序,不同)、同名函數,程序會根據不同的參數列來確定需要調用的函數,這種機制叫超載,超載不關心函數的返回值類型(返回值類型及其為何不能作為超載函數的判定因素在這里不描述)。OVERLOAD覆蓋是指派生類(派生類這里不做描述)中存在重新定義的函數,其函數名、參數列、返回值類型必須同父類中的相對應被覆蓋的函數嚴格一致,覆蓋函數和被覆蓋函數只有函數體(花括號中的部分)不同,當派生類對象調用子類中該同名函數時會自動調用子類中的覆蓋版本,而不是父類中的被覆蓋函數版本,這種機制就叫做覆蓋。明白了沒?這兩個看似生僻怪異的機制可是以后編程中經常用到的哦。
  
  先寫到這里了,提醒大家一下假如沒有英語基礎還是別學編程了,不然困難會很大,99%的技術文檔都是英文,MICROSOFT的MSDN應該有中文版本。另外90%的優秀書籍都是英文版本,比如BRUCE ECKEL的大作 “THINKING IN XXX”系列在他的網站直接提供電子版本的免費下載,很棒的書,目前免費電子版已經出到第3版。相信國內很多人都知道“侯捷”這個臺灣人,他曾翻譯過前面提到的B。E。大師的“THINKING IN JAVA Second Edition”,該書口碑極佳,書中對全數的名詞術語的翻譯比較精準,基本表達了原作者的意思,也是我看過的JAVA書中最為出眾的一本,可惜世上無完美,由于侯先生是臺灣人,書中使用的詞語有的偏重臺灣化,盡管他已經在序中說明將盡量使用大陸的構詞習慣,有些地方還是差強人意。我在這里強烈推薦中級和剛入門的朋友吃透這本書,書中的知識點闡述相當詳盡(個人認為不完美,其實沒有什么是完美的),函蓋了大部分重點要素,是一本系統學習JAVA的好書,但要注重,該書不是面向

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 疏勒县| 治多县| 安溪县| 松潘县| 巫溪县| 乌恰县| 绥芬河市| 托克托县| 海门市| 武宣县| 民勤县| 东方市| 成安县| 克山县| 卢湾区| 景东| 定兴县| 开封市| 长海县| 顺义区| 九寨沟县| 文山县| 永春县| 白河县| 东宁县| 苗栗县| 赣州市| 宾阳县| 乃东县| 绥滨县| 新河县| 嘉兴市| 房产| 景宁| 惠水县| 尉犁县| 临西县| 额尔古纳市| 元阳县| 沁阳市| 大同县|