標籤: 暫無標籤

JAVA是一種可以撰寫跨平台應用軟體的面向對象的程序設計語言,由昇陽(Sun Microsystems)公司的詹姆斯·高斯林(James Gosling)等人於1990年代初開發。它最初被命名為Oak,目標設定在家用電器等小型系統的編程語言,來解決諸如電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊問題。由於這些智能化家電的市場需求沒有預期的高,Sun放棄了該項計劃。就在Oak幾近失敗之時,隨著互聯網的發展,Sun看到了Oak在計算機網路上的廣闊應用前景,於是改造了Oak,在1995年5月23日以「Java」的名稱正式發布了。Java 技術具有卓越的通用性、高效性、平台移植性和安全性,廣泛應用於個人PC、數據中心、遊戲控制台、科學超級計算機、行動電話和互聯網,同時擁有全球最大的開發者專業社群。在全球雲計算和移動互聯網的產業環境下,Java更具備了顯著優勢和廣闊前景。

1 JAVA -概述

JAVA

編程范型:Object-oriented, structured,
imperative
面市時間:1990年代
設計者:昇陽電腦
型態系統:Static, strong, safe, nominative
主要實作產品:Numerous
啟發語言:Objective-C, C , Smalltalk, Eiffel, C#[1]
影響語言:C#, D, J#, PHP, Ada 2005
操作系統:跨平台
Website:http://www.java.com/

======================================

Java 編程語言的風格十分接近C、C++ 語言。Java是一個純的面向對象的程序設計語言,它繼承了 C++ 語言面向對象技術的核心,Java捨棄了C ++語言中容易引起錯誤的指針(以引用取代)、運算符重載(operator overloading)、多重繼承(以介面取代)等特性,增加了垃圾回收器功能用於回收不再被引用的對象所佔據的內存空間,使得程序員不用再為內存管理而擔憂。在 Java SE 1.5 版本中,Java 又引入了泛型編程(Generic Programming)、類型安全的枚舉、不定長參數和自動裝/拆箱等語言特性。

Java 不同於一般的編譯執行計算機語言和解釋執行計算機語言。它首先將源代碼編譯成二進位位元組碼(bytecode),然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編譯、到處執行」的跨平台特性。不過,每次的編譯執行需要消耗一定的時間,這同時也在一定程度上降低了 Java 程序的運行效率。但在 J2SE 1.4.2 發布后,Java 的執行速度有了大幅提升。

與傳統程序不同,Sun 公司在推出 Java 之際就將其作為一種開放的技術。全球數以萬計的 Java 開發公司被要求所設計的 Java 軟體必須相互兼容。「Java 語言靠群體的力量而非公司的力量」是 Sun 公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同。

Sun 公司對 Java 編程語言的解釋是:Java 編程語言是個簡單、面向對象、分散式、解釋性、健壯、安全與系統無關、可移植、高性能、多線程和動態的語言。

Java 平台是基於 Java 語言的平台。這樣的平台目前非常流行,因此微軟公司推出了與之競爭的.NET平台以及模仿 Java 的 C# 語言。

2 JAVA -名字由來

一天,幾位Java成員組的會員正在討論給這個新的語言取什麼名字,當時他們正在咖啡館喝著Java(爪哇)咖啡,有一個人靈機一動說就叫Java怎樣,這個提議得到了其他人的贊同,於是,Java這個名字就這樣傳開了。原來看SUN的JAVA標識沒去多想,現在看看,這不就是一杯正冒著熱氣的咖啡嗎?

3 JAVA -歷史

早期的Java

JAVA
Java平台和語言最開始只是昇陽公司在1990年12開始研究的一個內部項目。昇陽公司的一個叫做帕特里克·諾頓的工程師被昇陽自己開發的C 和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。帕特里克決定改用NeXT,同時他也獲得了研究公司的一個叫做「Stealth 計劃」的項目的機會。

「Stealth 計劃」後來改名為「Green計劃」,詹姆斯·高斯林和麥克·舍林丹也加入了帕特里克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室裡面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,昇陽公司預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用C 語言,但是很多成員包括昇陽的首席科學家比爾·喬伊,發現C 和可用的API在某些方面存在很大問題。

工作小組使用的是內嵌類型平台,可以用的資源極其有限。很多成員發現C 太複雜以至很多開發者經常錯誤使用。他們發現C 缺少垃圾回收系統,還有可移植的安全性、分佈程序設計、和多線程功能。最後,他們想要一種易於移植到各種設備上的平台。

根據可用的資金,比爾·喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫做「未來」,他提議昇陽公司的工程師應該在C 的基礎上,開發一種面向對象的環境。最初,高斯林試圖修改和擴展C 的功能,他自己稱這種新語言為 C --,但是後來他放棄了。他將要創造出一種全新的語言,被他命名為「Oak」(橡樹),以他的辦公室外的樹而命名。

就像很多開發新技術的秘密的工程一樣,工作小組沒日沒夜地工作到了1992年的夏天,他們能夠演示新平台的一部分了,包括Green操作系統,Oak的程序設計語言,類庫,和其硬體。最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為「Duke」的智能代理來幫助用戶。1992年12月3日,這台設備進行了展示。

同年11月,Green計劃被轉化成了「FirstPerson有限公司」,一個昇陽公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。FirstPerson團隊對建造一種高度互動的設備感興趣,當時代華納發布了一個關於電視機頂盒的徵求提議書時(Request for proposal),FirstPerson改變了他們的目標,作為對徵求意見書的響應, 提出了一個機頂盒平台的提議。但是有線電視業界覺得FirstPerson的平台給予用戶過多地控制權,因此FirstPerson的投標敗給了SGI。與3DO 公司的另外一筆關於機頂盒的交易也沒有成功,由於他們的平台不能在電視工業產生任何效益,公司再並回昇陽公司。

JAVA與互聯網

1994年6、7月間,在經歷了一場歷時三天的頭腦風暴的討論后,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、帕特里克·諾頓、韋恩·羅斯因和埃里克·斯庫米,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用於萬維網。他們認為隨著Mosaic瀏覽器的到來,網際網路正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。作為原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器,WebRunner,後來改名為HotJava。

同年,Oak改名為Java。商標搜索顯示,Oak已被一家顯卡製造商註冊,因此團隊找到了一個新名字。這個名字是在很多成員常去的本地咖啡館中杜撰出來的。名字是不是首字母縮寫還不清楚,很大程度上來說不是。雖然有人聲稱是開發人員名字的組合:James Gosling(詹姆斯·高斯林) Arthur Van Hoff(阿瑟·凡·霍夫) Andy Bechtolsheim(安迪·貝克托克姆),或「Just Another Vague Acronym」(只是另外一個含糊的縮寫)。還有一種比較可信的說法是這個名字是出於對咖啡的喜愛,所以以Java咖啡來命名。類文件的前四個位元組如果用十六進位閱讀的話,分別為CA FE BA BE, 就會拼出兩個單詞「CAFE BABE」(咖啡寶貝)。

1994年10月,HotJava和Java平台為公司高層進行演示。1994年,Java 1.0a版本已經可以提供下載,但是Java和HotJava瀏覽器的第一次公開發布卻是在1995年3月23日SunWorld大會上進行的。昇陽公司的科學指導約翰·蓋吉宣告Java技術。這個發布是與網景公司的執行副總裁馬克·安德森的驚人發布一起進行的,宣布網景將在其瀏覽器中包含對Java的支持。1996年1月,昇陽公司成立了Java業務集團,專門開發Java技術。

4 JAVA -Java主要特性

1、Java語言是簡單的。Java語言的語法與C語言和C++語言很接近,使得大多數程序員很容易學習和使用Java。另一方面,Java丟棄了C++中很少使用的、很難理解的、令人迷惑的那些特性,如操作符重載、多繼承、自動的強制類型轉換。特別地,Java語言不使用指針,並提供了自動的廢料收集,使得程序員不必為內存管理而擔憂。

2、Java語言是一個面向對象的。Java語言提供類、介面和繼承等原語,為了簡單起見,只支持類之間的單繼承,但支持介面之間的多繼承,並支持類與介面之間的實現機制(關鍵字為implements)。Java語言全面支持動態綁定,而C++ 語言只對虛函數使用動態綁定。總之,Java語言是一個純的面向對象程序設計語言。

3、Java語言是分散式的。Java語言支持Internet應用的開發,在基本的Java應用編程介面中有一個網路應用編程介面(java.net),它提供了用於網路應用編程的類庫,包括URL、URLConnection、Socket、 ServerSocket等。Java的RMI(遠程方法激活)機制也是開發分散式應用的重要手段。

4、Java語言是健壯的。Java的強類型機制、異常處理、廢料的自動收集等是Java程序健壯性的重要保證。對指針的丟棄是Java的明智選擇。Java的安全檢查機制使得Java更具健壯性。

5、Java語言是安全的。Java通常被用在網路環境中,為此,Java提供了一個安全機制以防惡意代碼的攻擊。除了Java語言具有的許多安全特性以外,Java對通過網路下載的類具有一個安全防範機制(類ClassLoader),如分配不同的名字空間以防替代本地的同名類、位元組代碼檢查,並提供安全管理機制(類SecurityManager)讓Java應用設置安全哨兵。

6、Java語言是體系結構中立的。Java程序(後綴為java的文件)在Java平台上被編譯為體系結構中立的位元組碼格式(後綴為class的文件), 然後可以在實現這個Java平台的任何系統中運行。這種途徑適合於異構的網路環境和軟體的分發。

7、Java語言是可移植的。這種可移植性來源於體系結構中立性,另外,Java還嚴格規定了各個基本數據類型的長度。Java系統本身也具有很強的可移植性,Java編譯器是用Java實現的,Java的運行環境是用ANSI C實現的。

8、Java語言是解釋型的。如前所述,Java程序在Java平台上被編譯為位元組碼格式, 然後可以在實現這個Java平台的任何系統中運行。在運行時,Java平台中的Java解釋器對這些位元組碼進行解釋執行,執行過程中需要的類在聯接階段被載入到運行環境中。

9、Java是高性能的。與那些解釋型的高級腳本語言相比,Java的確是高性能的。事實上,Java的運行速度隨著JIT(Just-In-Time)編譯器技術的發展越來越接近於C++。

10、Java語言是多線程的。在Java語言中,線程是一種特殊的對象,它必須由Thread類或其子(孫)類來創建。通常有兩種方法來創建線程:其一,使用型構為Thread(Runnable) 的構造子將一個實現了Runnable介面的對象包裝成一個線程,其二,從Thread類派生齣子類並重寫run方法,使用該子類創建的對象即為線程。值得注意的是Thread類已經實現了Runnable介面,因此,任何一個線程均有它的run方法,而run方法中包含了線程所要運行的代碼。線程的活動由一組方法來控制。 Java語言支持多個線程的同時執行,並提供多線程之間的同步機制(關鍵字為synchronized)。

11、Java語言是動態的。Java語言的設計目標之一是適應於動態變化的環境。Java程序需要的類能夠動態地被載入到運行環境,也可以通過網路來載入所需要的類。這也有利於軟體的升級。另外,Java中的類有一個運行時刻的表示,能進行運行時刻的類型檢查。

Java語言的優良特性使得Java應用具有無比的健壯性和可靠性,這也減少了應用系統的維護費用。Java對對象技術的全面支持和Java平台內嵌的API能縮短應用系統的開發時間並降低成本。Java的編譯一次,到處可運行的特性使得它能夠提供一個隨處可用的開放結構和在多平台之間傳遞信息的低成本方式。特別是Java企業應用編程介面(Java Enterprise APIs)為企業計算及電子商務應用系統提供了有關技術和豐富的類庫。

5 JAVA -Java語言特點

Java是一種簡單的,面向對象的,分散式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的動態語言。

當1995年SUN推出Java語言之後,全世界的目光都被這個神奇的語言所吸引。那麼Java到底有何神奇之處呢?

Java語言其實最早誕生於1991年,起初被稱為OAK語言,是SUN公司為一些消費性電子產品而設計的一個通用環境。他們最初的目的只是為了開發一種獨立於平台的軟體技術,而且在網路出現之前,OAK可以說是默默無聞,甚至差點夭折。但是,網路的出現改變了OAK的命運。

在Java出現以前,Internet上的信息內容都是一些乏味死板的HTML文檔。這對於那些迷戀於WEB瀏覽的人們來說簡直不可容忍。他們迫切希望能在WEB中看到一些互動式的內容,開發人員也極希望能夠在WEB上創建一類無需考慮軟硬體平台就可以執行的應用程序,當然這些程序還要有極大的安全保障。對於用戶的這種要求,傳統的編程語言顯得無能為力。SUN的工程師敏銳地察覺到了這一點,從1994年起,他們開始將OAK技術應用於WEB上,並且開發出了HotJava的第一個版本。當SUN公司1995年正式以Java這個名字推出的時候,幾乎所有的WEB開發人員都心生感嘆:噢,這正是我想要的!於是Java成了一顆耀眼的明星,醜小鴨一下了變成了白天鵝。

Java近況

在流行幾年之後,Java在瀏覽器中的地位被逐步侵蝕。它在簡單交互性動畫方面的用途已經完全被Adobe公司的Flash排擠,2005年Java傾向只被用於雅虎遊戲那樣的更為複雜的應用程序。Java同時遭受到來自微軟的反對,他們決定在新版本的Internet Explorer和Windows中不再附帶Java平台。

與此相反。在萬維網的伺服器端和手持設備上,Java變得更加流行。很多網站在前端使用JSP和其他的Java技術。

在桌面系統上,獨立的Java程序還是相對少見,這是因為Java平台的運行開銷較大,而許多人的電腦上沒有安裝Java,由於網路帶寬在以前較小,下載Java曾經是個耗時的事情。但是隨著計算機計算能力、網路帶寬在10年中取得了很大的進步,同時虛擬機和編譯器的質量得到了越高,許多應用程序得到了廣泛的使用,包括:

開源軟體:

NetBeans

Eclipse

JEdit

Azureus BitTorrent客戶端。

JNode操作系統

閉源軟體:

EIOffice(永中Office)

純Java 3D遊戲合金戰士Chrome

Java程序

目前Java提供以下三個版本:

Java Platform, Enterprise Edition (Java EE:Java平台企業版)

Java Platform, Standard Edition (Java SE:Java平台標準版)

Java Platform, Micro Edition (Java ME:Java平台微型版)

以上為Java各種版本的SUN公司官方中文翻譯方式:http://cn.sun.com/press/jun2005/20050627-6.html

版本歷史(時間表)

JAVAJAVA

1995年5月23日,Java語言誕生

1996年1月,第一個JDK-JDK1.0誕生

1996年4月,10個最主要的操作系統供應商申明將在其產品中嵌入JAVA技術

1996年9月,約8.3萬個網頁應用了JAVA技術來製作

1997年2月18日,JDK1.1發布

1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議規模之紀錄

1997年9月,JavaDeveloperConnection社區成員超過十萬

1998年2月,JDK1.1被下載超過2,000,000次

1998年12月8日,JAVA2企業平台J2EE發布

1999年6月,SUN公司發布Java的三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME)

2000年5月8日,JDK1.3發布

2000年5月29日,JDK1.4發布

2001年6月5日,NOKIA宣布,到2003年將出售1億部支持Java的手機

2001年9月24日,J2EE1.3發布

2002年2月26日,J2SE1.4發布,自此Java的計算能力有了大幅提升

2004年9月30日18:00PM,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0

2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名,以取消其中的數字「2」:J2EE更名為Java EE,J2SE更名為Java SE,J2ME更名為Java ME

2006年12月,SUN公司發布JRE6.0

開發技巧


  Eclipse中最常用的快捷鍵:Ctrl+L Go to Line   F5 Step Into   Ctrl+H Open Search Dialog   Ctrl+Shift+K Find Previous   Ctrl+F11 Run   Ctrl+Shift+\ Remove Block Comment   F11 Debug   Ctrl+Shift+/Add Block Comment   Ctrl+K Find Next   F8 Resume (during Debug)   Ctrl+O Quick Outline   Alt+Shift+RRename (Refactoring)   F3 Open Declaration   Ctrl+R Run to Line   Ctrl+/ Toggle Comment   Ctrl+Shift+O Organize Imports   F6 Step Over   Ctrl+Shift+F Format   Ctrl+Shift+G References in Workspace

語言特性

Java之所以被開發,是要達到以下五個:

應當使用面向對象程序設計方法學

應當允許同一程序在不同的計算機平台執行

應當包括內建的對計算機網路的支持

應當被設計成安全地執行遠端代碼

應當易於使用,並借鑒以前那些面向對象語言(如C )的長處。

Java技術主要分成幾個部分:Java語言、運行環境JVM、類庫。一般情況下說Java時並不區分指的是哪個部分。

面向對象

Java的特點之一就是面向對象,是程序設計方法的一種。「面向對象程序設計語言」的核心之一就是開發者在設計軟體的時候可以使用自定義的類型和關聯操作。代碼和數據的實際集合體叫做「對象」。一個對象可以想象成綁定了很多「行為(代碼)」和「狀態(數據)」的物體。對於數據結構的改變需要和代碼進行通信然後操作,反之亦然。面向對象設計讓大型軟體工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。

面向對象設計另外一個目標就是能產生很多的有關聯的類,可以讓軟體的再開發變得簡單。舉例來說,很多軟體工程都有同樣的功能,尤其是很多應用了同一原理組織的軟體工程。軟體的二次開發者想自己為軟體開發插件以增強功能的時候,絕對不想看到混亂的開發代碼和管理計劃。面向對象的目的就是不生產難懂且難以使用的代碼,為軟體各個功能群之間建立有效的通信通道。很多開源軟體社區正在計劃給軟體作者提供更多的類來讓軟體的二次開發變得簡便。

跨平台姓

JAVAJAVA
Java語言的第二個特性就是跨平台性,也就是說使用Java語言編寫的程序可以在編譯后不用經過任何更改,就能在任何硬體設備條件下運行。這個特性經常被稱為「一次編譯,到處運行」。

實現跨平台性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用位元組碼(Bytecode)寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬體平台的原始代碼。之後,Java虛擬機會打開標準庫,進行數據(圖片、線程和網路)的存取工作。主要注意的是,儘管已經存在一個進行代碼翻譯的解釋層,有些時候Java的位元組碼代碼還是會被JIT編譯器進行二次編譯。

有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。但是這些編譯器所生成的代碼只能應用於特定平台。並且GCJ目前只支持部分的Java API。

昇陽對於Java的許可是「全兼容的」,這也導致了微軟和昇陽關於微軟的程序不支持RMI和JNI介面、並且增加特性為己所用的法律爭端。昇陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行昇陽公司關於Java的許可要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供對於Java應用程序和控制項的支持。但是昇陽公司和其他使用Java運行時系統的公司對於微軟的操作對用戶提供無償的第三方插件和程序支持。

Java語言使用解釋層最初是為了輕巧性。所以這些程序的運行效率比C語言和C 要低很多,用戶也對此頗有微詞。很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C 和C語言編寫的程序。

Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。這樣做的後果就是獲得了最佳的性能,但是程序臃腫異常。從JIT技術開始,Java的程序都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機都使用一種叫做「動態編譯」的技術,也就是說虛擬機實時監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。

程序的輕便性事實上是軟體編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處運行」,但是由於平台和平台之間的差異,所編寫的程序在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程序員對此非常頭疼,他們嘲笑Java的程序不是「一次編譯,到處運行」,而是「一次編譯,到處調試」。

平台無關性讓Java在伺服器端軟體領域非常成功。很多伺服器端軟體都使用Java或相關技術建立。

自動垃圾回收(Garbage Collection)

C 語言被用戶詬病的原因之一就是大多數C 編譯器不支持垃圾收集機制。通常使用C 編程的時候,程序員所創建的對象在創建時在本地堆棧上分配一塊內存地址,當不需要這個對象,進行析構或者刪除的時候再釋放分配的內存地址。如果對象是在堆上分配的,而程序員又忘記進行地址刪除,那麼就會造成內存泄漏(Memory Leak)。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的內存空間。更糟糕的是,如果同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C 程序員都會在刪除之後將指針重置為0,然後在刪除之前先判斷指針是否為0。

Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的建立和放置都是在內存堆上面進行的。程序或者其他的對象可以鎖定一塊堆地址來進行其他對象的引用。當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個對象所佔用的空間,釋放內存以避免內存泄漏。但是內存泄漏並不是就此避免了,當程序員疏忽大意地忘記解除一個對象不應該有的引用的時候,內存泄漏仍然不可避免,不過發生的幾率要比不啟用垃圾收集機制的C 程序少很多。但是總體來講,自動垃圾收集機制要安全和簡單許多。

不同廠商、不同版本的JVM中的內存垃圾回收機制並不完全一樣,通常越新版本的內存回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM, JVM性能的世界紀錄也在不斷的被打破並提高。

IBM有一篇有關Java內存回收機制比不啟用垃圾收集機制的C 內存處理快數倍的技術文章,可在如下網址找到:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
而著名的Java技術書籍《Java編程思想》(《Thinking in Java》)也有一段論述Java內存及性能達到甚至超過C 的章節:
http://www.sdau.edu.cn/support/thinkinjava/chapter/appe.htm

但是應該注意到,C 中也可以使用「智能指針」(Smart Pointer)或者使用C 託管擴展編譯器的方法來實現自動化內存釋放,智能指針可以在標準類庫中找到,而C 託管擴展被微軟的Visual C 7.0及以上版本所支持。智能指針的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮線程安全的問題,但是缺點是如果不善使用智能指針的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放內存可能造成內存碎片,需要手動對堆進行壓縮。除此之外,由於智能指針是一個基於模板的功能,所以沒有經驗的程序員在需要使用多態特性進行自動清理時也可能束手無策。

當然,作為一個「負責任」的程序編撰員,在程序完結前應該手動清理不再需要的變數和物件,令效能有點提升。以Java為例,finalize方法位於 Java.Object 內,而Object 這個類是每一個類自動承繼的。因此清理需要的便是覆寫finalize便行了。

protected void finalize() throws Throwable{
    super.finalize();
}

當中若有任何變數要清理,可以在super.finalize() 前加上  = null; 或 . = null;

不過事實上,就算使用了 finalize(),你還是不能保證你在堆棧中所使用的空間會馬上被回收,垃圾回收機制只有在你的堆棧已經毫無空間可以使用的情況下,才會真的去進行回收的動作,因此在編程上,還是要避免內存空間的浪費。

介面和類別

Java自帶了創建介面的類別,可以這樣使用:

public interface Deleteable {
   void delete();
}

這段代碼的意思是任何實現(implement)Deleteable介面的類別都必須實現delete()方法。每個類別對這個方法的實現可以自行定製。由此概念可以引出很多種使用方法,下面是一個類別的例子:

public class Fred implements Deleteable {
    //Must include the delete () method to satisfy the Deleteable interface
    public void delete() { //code implementation goes here
    }
    //Can also include other methods
    public void doOtherStuff() {
    }
}

在另外一個類別中,可以使用這樣的代碼:

public void deleteAll (Deleteable [] list) {
    for (int i = 0; i < list.length; i ) {
         list[i].delete();
    }
}

因為隊列中所有的對象都可以使用delete()方法。Deleteable隊列中包含Fred對象的引用,而這個類別和其他Deleteable類別在使用deleteAll()方法時候不需要進行任何改變。

之所以這樣做就是為了在介面的執行和其代碼之間進行區別。舉例來說,一個名叫Collection的介面可以包含任何對象所需要的引入、轉換和存儲數據的方法,其他的類都可以使用這個介面。但是這個介面可以是一個可重定義大小的隊列、一個鏈表或者是其他功能的集合。

這種特性其實是一種折中的辦法。Java的設計者們不想讓Java有多重繼承的特性,因為C 的多重繼承顯示了這種特性的困難。Java的介面功能可以提供同樣的功能,但是又不會很複雜。

6 JAVA -Java 5.0的特性

自動裝箱/拆箱 (Auto-Boxing/Unboxing)

沒有自動裝箱/拆箱:

int int1 = 1;
Integer integer2 = new Integer(int1);
int int3 = integer2.intValue();

有自動裝箱/拆箱:

int int1 = 1;
Integer integer2 = int1;     // 自動裝箱
int int3 = integer2;         // 自動拆箱

泛型 (Generic Types)

泛型就像是C 的模板。原有的Collection API加上泛型支援后,增加對型別的檢查,減少程序錯誤的機會。

沒有泛型:

HashMap hm = new HashMap();
int i=1;
String tt="test";
hm.put(new Integer(i), tt);

使用Generic:

HashMap hm = new HashMap();
int i=1;
String tt = "test";
hm.put(i, tt);      // 在這裡對int自動裝箱成Integer,也使用了參數的型別檢查

自動裝箱的新功能,可能是從C#語言身上學習來的,Java 已經越來越像C#。然而Java對自動裝箱/拆箱的支援,僅是利用編譯器實現,在Java Bytecode 中,並無自動裝箱/拆箱的操作碼 (opcode)。

註釋 (Annotation)

Annotation全名是Program Annotation Facility ,是Java SE 5.0的新功能。Java 的 Annotation 類似於 .NET 的屬性 (Attribute)。Java 的註釋是一種介面 (interface),繼承自 java.lang.annotation.Annotation。Class File 則貼上 ACC_ANNOTATION 標籤。

// JDK 1.4
/**
 * @todo to be implemented
 **/
void gimmeSomeLoving() {
  throw new Exception("not implemented");
}
// JDK 1.5
@todo void gimmeSomeLoving() {
  throw new Exception("not implemented");
}

枚舉類型 (enum)

枚舉類型也是J2SE 5.0的新功能。過去 Java 認為enum的關鍵字是不必要的功能,因為用 public static int field 就可以取代 enum,因此過去一直不用。J2SE 5.0中的 class 如果是 enum,在 class file 中會被貼上一個 ACC_ENUM 標籤。

// JDK 1.4
class JavaTech {
       public static final int J2ME = 1;
       public static final int J2SE = 2;
       public static final int J2EE = 3;
}
// JDK 1.5
public enum NewJavaTech {
       J2ME, J2SE, J2EE
}

輸入輸出

試試用位於 java.io 包 (package) 內的BufferedReader。請緊記要 import java.io.*;。尾部"*"是指示要 import 所有位於 java.io 內的類。

import java.io.*;
public class TestRead{
   public static void main(String[] args) throws IOException{
       BufferedReader bufread = new BufferedReader(System.in);
       String str;
       System.out.print("請輸入一句字串");
       str = bufread.readLine();
       System.out.println(str);
   }
}

程序碼解說: import java.io.* 是把整個包「打開」,那麼你便可以承繼該包的類,用內里的類創建一個物件。其實 java.io.* 是預設 import 的,不過 Eclipse 會要求 import java.io 所以功夫不可小!

public class TestRead 是宣告一個「公開」的 class(類別),而名字是TestRead 。

public static void main(String[] args) 是一個主程序。雖然是 Method ,但 main method 對於 Java 執行器來說是第一個執行程序的地方,同樣離開了 main method 就等如離開了程序。main method 的宣告式是要背的,當然是有解,不過暫且不說。

BufferedReader bufread = new BufferedReader(System.in) 在此創建一個以 BufferedReader 為藍圖的物件 bufread ,bufread名字是任你定的。詳細來說是第一個BufferedReader 是宣告 bufread 是一個會「存儲」一個BufferedReader類的物件。new BufferedReader(System.in) 是指創建一個 BufferedReader 的物件。由於BufferedReader 需要一個輸入流,因此我們指定了 System.in 給 BufferedReader。

應用程序開發介面

在Java語言中,應用程序介面(API)化身成類,並且分組成為包。每個包中包含有相關的介面和類。對於不同的平台,Java提供了不同版本的包。

API的設定由昇陽公司和其他公司通過JCP(Java社群程序)決定。任何公司和個人都可以參與這個工程,對API進行設計。

2004年,IBM和BEA公司準備聯合對官方的Java開源軟體工程進行支持,但是2005年初,昇陽公司拒絕了這個支持。

Hello World

下面這個程序顯示「Hello, world!」然後結束運行:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}

國際化

Java語言嚴格區分位元組和字元。字元的存儲格式為UCS-2,從Java 5開始支持UTF-16字元。Java的程序遂可以使用Unicode字元進行書寫。

下面就是一個合法的Java程序,裡面包含了中文字元作為類的名稱而不是字元串,這個程序可以在編譯器中運行通過。

public class 哈啰世界 {
   private string 文本 = "哈啰世界";
}

7 JAVA -深入JAVA

數據類型
任何編程語言都免不了要定義變數,JAVA也不例外。JAVA的變數聲明形式如下:

type name;

其中的type是數據類型名,name指定義的該數據類型的一個具體變數。

JAVA的內置數據類型主要有如下幾種:

boolean : 布爾值,僅有兩個常量,true和false.

byte :位元組類型值,長度8位(一個位元組),取值範圍是-128至127。

short :短整型值,長度16位(兩個位元組),取值範圍是-32768至32767。

int :整型值,長度32位(四個位元組),取值範圍是-2147483648至2147483647

long :長整型,長度64位(八個位元組),取值範圍是-9223372036854775808至9223372036854775807

float :單精度IEEE754浮點數,長度32位(四個位元組)。

double :雙精度IEEE754浮點數,長度64位(八個位元組)。

char :字元型,長度16位,支持所有的Unicode和Ascii編碼。

JAVA關鍵字

8 JAVA -關於Java的批評

Java試圖通過新的方式解決軟體編寫的複雜性。很多人認為Java語言做到了它承諾的一切。但是Java並不是一門完美的語言,在編程風格、編程環境和需求方面並沒有獲得全球性的認可。

並不是所有的工程和環境需要企業級別的複雜性,比如一個簡單的個人網站或者獨自編程的程序員所寫的程序。這些程序員會發現Java的複雜管理對於自己要做的程序來說過於強大了。

Java經常讓那些並不是對面向對象編程很熱心的程序員感到不滿。

一些人覺得Java在面向對象上面做的沒有Ruby和Smalltalk純粹。但是最新出現的用Java實現的語言Groovy解決了這些問題。

作為一種已經建立的新技術,Java顯然綜合了很多語言的特性,比如C 、C語言、Python等等。一些對於Java的評論認為Java的不變性在動搖,有些人認為Java只是一種「新的COBOL"語言。

語言問題

有些程序員不喜歡原始類型(primitive type)和類(class)的分離,尤其是那些曾經使用過Smalltalk和Ruby的程序員。他們會問:「這就是一切皆對象(object)?」

事實上,JAVA語言本身只是Smalltalk的一個不完整的代替品。JAVA的流行與SUN背後的支持分不開。

Java的代碼相對於其他的代碼來說過於冗長,這與它的輕便化聲明相違背。

Java語言在單范常式序方面非常出色。歷史上的Java則在這方面做的不好。

Java是一種單層繼承的語言。這也導致了程序員在試圖使用多重繼承時候的不便,而很多語言都可以使用這個特性。但是Java可以使用介面類,把多重繼承可能導致的風險減少到最小。

Java不支持運算符重載,這是為了防止運算符重載使得代碼的功能變的不清晰。但是用Java實現的語言Groovy可以進行運算符重載。

5.0版本增加了大量的基本類的支持,可以節省大量的額外編程工作。

過去Java對於文本的操作和其他語言,比如Perl和PHP相比差的較多,但Java在1.4版本時候引入了正則表達式。

準確地說,JAVA不是平台無關的,它本身就是一個平台。

類庫問題

使用Swing平台編寫的帶有GUI(圖形用戶界面)的程序和其他原始程序非常不同。選用AWT工具包編寫程序的程序員看到的都是原始界面,而且也無法獲得先進的GUI編程支持,如果使用的話,就要提供每個平台上面所需的API,這將是一項龐大的工程。Swing則是完全用Java語言所寫的程序,避免了界面元素重複的問題,只使用所有平台都支持的最基本的繪圖機制。但是很多用戶不知道如何在Java風格和Windows風格之間進行轉換,結果造成了Java程序的界面在很多程序中非常特殊。蘋果電腦已經提供了優化過的Java運行時程序,包含了Mac OS X的經典Aqua界面風格。

性能問題

由於Java編譯器和虛擬機的不同對Java代碼的性能影響比語言本身的影響大的多,所以統一討論Java的程序的性能經常是有誤導性的。據IBM的數據,在同樣的硬體上2001年時的IBM JDK版本的性能是1996年的JDK版本的十倍左右。見IBM東京研究院的數據: http://www.is.titech.ac.jp/ppl2004/proceedings/ishizaki_slides.pdf 而即使是在同一時期,不同公司的JDK和JRE的性能也不一樣,比如SUN、IBM、BEA等公司都有自己開發的JDK和JRE。

Java語言的一些特性不可避免的有額外的性能代價,例如數組範圍檢查、運行時類型檢查等等。Java程序的性能還會因為不同的動態複雜性和垃圾處理機制使用的多少而各有不同。如果JVM的實現比較優化的話,那麼這些功能甚至可以增加內存分配的性能。這和總是使用STL或者託管C 的程序的情況類似。

儘管如此,仍然有許多人認為Java的性能低。這部分歸因於Sun公司最初的JVM實現使用未優化的解釋機制來執行位元組碼。一些新版本的JVM使用Just-In-Time(JIT)編譯器,在載入位元組碼的時候將其編譯成針對運行環境的本地代碼來實現一些本地編譯器的優化特性。Just-In-Time機制和本地編譯的性能比較仍舊是一個有爭議的話題。JIT編譯需要很多時間,對於運行時間不長或者代碼很多的大型程序並不適宜。但是不算JIT編譯階段的話,程序的運行性能在很多JVM下可以和本地編譯的程序一爭短長,甚至在一些計算比較密集的數值計算領域也是這樣。目前,Java已經使用更先進的HotSpot技術來代替JIT技術,Java的性能有了更進一步的提升。另外,在使用-server選項運行java程序時,也可以對java進行更深入的優化,比如在運行時將調用較多的方法內聯(inline)到程序中來提高運行速度,這就是所謂的「動態優化」,而本地編譯器是無法做到這一點的;這也是一些java代碼比對應用C/C 等語言編寫的本地代碼運行的更快的原因之一。微軟的.NET平台也使用JIT編譯器,所以也有類似問題。

Java的設計目的主要是安全性和可移植性,所以對於一些特性,比如對硬體架構和內存地址訪問的直接訪問都被去除了。如果需要間接調用這些底層功能的話,就需要使用JNI(Java本地介面)來調用本地代碼,而間接訪問意味著頻繁調用這些特性時性能損失會很大,微軟的.NET平台也有這樣的問題。所以到目前為止,性能敏感的代碼,例如驅動程序和3D視頻遊戲,還是大多使用本地編譯,甚至直接以不直接支持面向對象的C語言或機器碼編寫。但最近已經有了許多用純Java編寫的3D遊戲,其效果與用C語言編寫的不相上下,例如「合金戰士」(英文名:Chrome)。這主要是因為新版的Java 3D技術已經能像C 一樣調用硬體加速,也就是使用顯卡來加速,無論是C 還是Java語言寫的3D遊戲都是使用顯卡及GPU來處理,從而使得CPU可以專註於其它方面的工作。

關於Java的性能,可以參看以下文章: http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html http://www.matrix.org.cn/thread.shtml?topicId=16092&forumId=18

9 JAVA -Java運行時環境

Java運行時環境,即Java Runtime Environment,簡稱為JRE,是在任何平台上運行Java編寫的程序都需要用到的軟體。終端用戶可以以軟體或者插件方式得到和使用JRE。Sun公司還發布了一個JRE的更複雜的版本,叫做JDK,即Java 2 開發包,裡面包含了Java需要的編譯器、參考文檔和調試器等。

JRE的成分:

Java的類庫,包含了編譯Java程序所需要的最核心文件。

核心庫文件,其中有

數據結構的庫,包括列表、字典和樹等

XML分析庫

安全方面應用庫

國際化和本地化應用庫

綜合庫文件,包含了程序員和其他系統通信的功能文件。

JDBC,即Java資料庫聯通的API

JNDI,即Java命名和目錄介面

RMI和CORBA用於重新分發軟體

用戶界面庫文件,包含:

AWT,即抽象窗口開發包,提供了產生圖形用戶界面所需要的功能

Swing庫

其他用於回訪媒體文件、錄音、截圖的庫

一個用於執行軟體的Java虛擬機

插件,可以在瀏覽器裡面使用

JWS,可以讓終端用戶連接到互聯網

許可文件和文檔

10 JAVA -擴展和相關架構

擴展和與Java程序設計語言緊密相關的架構(按字母排序)。

Groovy ,一種用純Java實現的腳本語言,Python的強有力競爭者

JAIN (Java API for Integrated Networks)Java綜合網路應用程序開發介面

JAI,(Java Advanced Imaging)Java進階圖像

JAXP, (Java API for XML Processing) Java XML 處理 API

Java EE(原名J2EE),Java平台企業版

Java ME(原名J2ME) ,Java平台微型版為PDA和智能手機開發的移動版本

Java SE(原名J2SE),Java平台標準版

JDBC ,(Java Database Connectivity)Java資料庫聯通

JDMK,(Java Dynamic Management Kit)Java動態管理開發包

JDO ,(Java Data Objects)Java數據對象

JJSF,Java伺服器界面

JMF,(Java Media Framework) Java媒體框架

JMI,Java元數據介面

JML ,(Java Modeling Language)Java建模軟體

JMX ,(Java Management Extensions)Java管理擴展

JNDI ,(Java Naming and Directory Interface)Java命名和目錄介面

JNI ,Java原始界面

JOGL,使用OpenGL的低階三位遊戲開發介面

JSML ,(Java Speech API Markup Language)Java的語音和標記語言

JSP ,(JavaServer Pages)Java伺服器頁面

JSF ,(JavaServer Faces)

JXTA ,P2P虛擬網路協議

Java Card

Java3D ,用於三維遊戲編程的高階應用程序開發介面

JavaSpaces

Jini ,Java網路分佈計算結構

Jiro

OSGi,(Dynamic Service Management and Remote Maintenance)動態服務管理和遠程控制

Rhino, 用Java實現的JavaScript語言。

Swing, Java 的圖像用戶界面 API

SWT, Standard Widget Toolkit, 由IBM和Eclipse基金會主導開發的開源圖像用戶界面API

SuperWaba ,手持設備的虛擬機程序

總的來說java已經變得越來越龐大,或許是有些臃腫,在ROR等各種新的事物的出現的情況下,java或許將會將重點集中在企業級的開發上。

11 JAVA -相關技術

1、JDBC(Java Database Connectivity)提供連接各種關係資料庫的統一介面。

2、EJB(Enterprise JavaBeans)使得開發者方便地創建、部署和管理跨平台的基於組件的企業應用。

3、Java RMI(Java Remote Method Invocation)用來開發分散式Java應用程序。一個Java對象的方法能被遠程Java虛擬機調用。這樣,遠程方法激活可以發生在對等的兩端,也可以發生在客戶端和伺服器之間,只要雙方的應用程序都是用Java寫的。

4、Java IDL(Java Interface Definition Language) 提供與CORBA(Common Object Request Broker Architecture)的無縫的互操作性。這使得Java能集成異構的商務信息資源。

5、JNDI(Java Naming and Directory Interface)提供從Java平台到的統一的無縫的連接。這個介面屏蔽了企業網路所使用的各種命名和目錄服務。

6、JMAPI(Java Management API)為異構網路上系統、網路和服務管理的開發提供一整套豐富的對象和方法。

7、JMS(Java Message Service)提供企業消息服務,如可靠的消息隊列、發布和訂閱通信、以及有關推拉(Push/Pull)技術的各個方面。

8、JTS(Java transaction Service)提供存取事務處理資源的開放標準,這些事務處理資源包括事務處理應用程序、事務處理管理及監控。

在Java技術中,值得關注的還有JavaBeans,它是一個開放的標準的組件體系結構,它獨立於平台,但使用Java語言。一個JavaBean是一個滿足JavaBeans規範的Java類,通常定義了一個現實世界的事物或概念。一個JavaBean的主要特徵包括屬性、方法和事件。通常,在一個支持JavaBeans規範的開發環境(如Sun Java Studio 和IBM VisualAge for Java)中,可以可視地操作JavaBean,也可以使用JavaBean構造出新的JavaBean。JavaBean的優勢還在於Java帶來的可移植性。現在,EJB (Enterprise JavaBeans) 將JavaBean概念擴展到Java服務端組件體系結構,這個模型支持多層的分散式對象應用。除了JavaBeans,典型的組件體系結構還有DCOM和CORBA,關於這些組件體系結構的深入討論超出了本書的範圍。

12 JAVA -Java開源項目

Spring Framework 【Java開源 J2EE框架】

Spring 是一個解決了許多在J2EE開發中常見的問題的強大框架。 Spring提供了管理業務對象的一致方法並且鼓勵了注入對介面編程而不是對類編程的良好習慣。Spring的架構基礎是基於使用JavaBean屬性的 Inversion of Control容器。然而,這僅僅是完整圖景中的一部分:Spring在使用IoC容器作為構建完關注所有架構層的完整解決方案方面是獨一無二的。 Spring提供了唯一的數據訪問抽象,包括簡單和有效率的JDBC框架,極大的改進了效率並且減少了可能的錯誤。Spring的數據訪問架構還集成了 Hibernate和其他O/R mapping解決方案。Spring還提供了唯一的事務管理抽象,它能夠在各種底層事務管理技術,例如JTA或者JDBC事務提供一個一致的編程模型。 Spring提供了一個用標準Java語言編寫的AOP框架,它給POJOs提供了聲明式的事務管理和其他企業事務--如果你需要--還能實現你自己的 aspects。這個框架足夠強大,使得應用程序能夠拋開EJB的複雜性,同時享受著和傳統EJB相關的關鍵服務。Spring還提供了可以和IoC容器集成的強大而靈活的MVC Web框架。【SpringIDE:Eclipse平台下一個輔助開發插件】。

WebWork 【Java開源 Web框架】

WebWork 是由OpenSymphony組織開發的,致力於組件化和代碼重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,現在的WebWork2.x前身是Rickard Oberg開發的WebWork,但現在WebWork已經被拆分成了Xwork1和WebWork2兩個項目。 Xwork簡潔、靈活功能強大,它是一個標準的Command模式實現,並且完全從web層脫離出來。 Xwork提供了很多核心功能:前端攔截機(interceptor),運行時表單屬性驗證,類型轉換,強大的表達式語言(OGNL – the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。 WebWork2建立在Xwork之上,處理HTTP的響應和請求。WebWork2使用ServletDispatcher將HTTP請求的變成 Action(業務層Action類), session(會話)application(應用程序)範圍的映射,request請求參數映射。WebWork2支持多視圖表示,視圖部分可以使用 JSP, Velocity, FreeMarker, JasperReports,XML等。在WebWork2.2中添加了對AJAX的支持,這支持是構建在DWR與Dojo這兩個框架的基礎之上.【EclipseWork:用於WebWork輔助開發的一個Eclipse插件】

Struts 【Java開源 Web框架】

Struts 是一個基於Sun J2EE平台的MVC框架,主要是採用Servlet和JSP技術來實現的。由於Struts能充分滿足應用開發的需求,簡單易用,敏捷迅速,在過去的一年中頗受關注。Struts把Servlet、JSP、自定義標籤和信息資源(message resources)整合到一個統一的框架中,開發人員利用其進行開發時不用再自己編碼實現全套MVC模式,極大的節省了時間,所以說Struts是一個非常不錯的應用框架。【StrutsIDE:用於Struts輔助開發的一個Eclipse插件】

Hibernate 【Java開源 持久層框架】

Hibernate 是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱資料庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序實用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。Eclipse平台下的Hibernate輔助開發工具:【Hibernate Synchronizer】【MiddlegenIDE】

Quartz 【Java開源 Job調度】

Quartz 是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣複雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本為Quartz 1.5.0。

Velocity 【Java開源 模板引擎】

Velocity 是一個基於java的模板引擎(template engine)。它允許任何人僅僅簡單的使用模板語言(template language)來引用由java代碼定義的對象。當Velocity應用於web開發時,界面設計人員可以和java程序開發人員同步開發一個遵循MVC架構的web站點,也就是說,頁面設計人員可以只關注頁面的顯示效果,而由java程序開發人員關注業務邏輯編碼。Velocity將java代碼從web頁面中分離出來,這樣為web站點的長期維護提供了便利,同時也為我們在JSP和PHP之外又提供了一種可選的方案。 Velocity的能力遠不止web站點開發這個領域,例如,它可以從模板(template)產生SQL和PostScript、XML,它也可以被當作一個獨立工具來產生源代碼和報告,或者作為其他系統的集成組件使用。Velocity也可以為Turbine web開發架構提供模板服務(template service)。Velocity Turbine提供一個模板服務的方式允許一個web應用以一個真正的MVC模型進行開發。 【VeloEclipse :Velocity在Eclipse平台下的一個輔助開發插件】

IBATIS 【Java開源 持久層框架】

使用ibatis 提供的ORM機制,對業務邏輯實現人員而言,面對的是純粹的Java對象, 這一層與通過Hibernate 實現ORM 而言基本一致,而對於具體的數據操作,Hibernate 會自動生成SQL 語句,而ibatis 則要求開發者編寫具體的SQL 語句。相對Hibernate等 「全自動」ORM機制而言,ibatis 以SQL開發的工作量和資料庫移植性上的讓步,為系統設計提供了更大的自由空間。作為「全自動」ORM 實現的一種有益補充,ibatis 的出現顯 得別具意義。

Compiere ERP&CRM 【Java開源ERP與CRM系統】

Compiere ERP&CRM為全球範圍內的中小型企業提供綜合型解決方案,覆蓋從客戶管理、供應鏈到財務管理的全部領域,支持多組織、多幣種、多會計模式、多成本計算、多語種、多稅制等國際化特性。易於安裝、易於實施、易於使用。只需要短短几個小時,您就可以使用申購-採購-發票-付款、報價-訂單-發票-收款、產品與定價、資產管理、客戶關係、供應商關係、員工關係、經營業績分析等強大功能了。

Roller Weblogger 【Java開源 Blog博客】

這個weblogging 設計得比較精巧,源代碼是很好的學習資料。它支持weblogging應有的特性如:評論功能,所見即所得HTML編輯,TrackBack,提供頁面模板,RSS syndication,blogroll管理和提供一個XML-RPC 介面。

Eclipse 【Java開源 開發工具】

Eclipse平台是IBM向開發源碼社區捐贈的開發框架,它之所以出名並不是因為IBM宣稱投入開發的資金總數 —4千萬美元,而是因為如此巨大的投入所帶來的成果:一個成熟的、精心設計的以及可擴展的體系結構。

XPlanner 【Java開源 項目管理】

XPlanner 一個基於Web的XP團隊計劃和跟蹤工具。XP獨特的開發概念如iteration、user stories等,XPlanner都提供了相對應的的管理工具,XPlanner支持XP開發流程,並解決利用XP思想來開發項目所碰到的問題。 XPlanner特點包括:簡單的模型規劃,虛擬筆記卡(Virtual note cards),iterations、user stories與工作記錄的追蹤,未完成stories將自動迭代,工作時間追蹤,生成團隊效率,個人工時報表,SOAP界面支持。

HSQLDB 【Java開源 DBMS資料庫】

HSQLDB(Hypersonic SQL)是純Java開發的關係型資料庫,並提供JDBC驅動存取數據。支持ANSI-92 標準 SQL語法。而且他占的空間很小。大約只有160K,擁有快速的資料庫引擎。

Liferay 【Java開源 Portal門戶】

代表了完整的J2EE應用,使用了Web、EJB以及JMS等技術,特別是其前台界面部分使用Struts 框架技術,基於XML的portlet配置文件可以自由地動態擴展,使用了Web Services來支持一些遠程信息的獲取,使用 Apahce Lucene實現全文檢索功能。

JetSpeed 【Java開源 Portal門戶】

Jetspeed 是一個開放源代碼的企業信息門戶(EIP)的實現,使用的技術是Java和XML。用戶可以使用瀏覽器,支持WAP協議的手機或者其它的設備訪問Jetspeed架設的信息門戶獲取信息。Jetspeed扮演著信息集中器的角色,它能夠把信息集中起來並且很容易地提供給用戶。

JOnAS 【Java開源 J2EE伺服器】

JOnAS 是一個開放源代碼的J2EE實現,在ObjectWeb協會中開發。整合了Tomcat或Jetty成為它的Web容器,以確保符合Servlet 2.3和JSP 1.2規範。JOnAS伺服器依賴或實現以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。

JFox3.0 【Java開源 J2EE伺服器】

JFox 是 Open Source Java EE Application Server,致力於提供輕量級的Java EE應用伺服器,從3.0開始,JFox提供了一個支持模塊化的MVC框架,以簡化EJB以及Web應用的開發! 如果您正在尋找一個簡單、輕量、高效、完善的Java EE開發平台,那麼JFox正是您需要的。

13 JAVA -實戰應用

【JAVA數組操作的常用工具類】

Java提供了的Arrays類里包含了一些static修飾方法可以直接操作數組,這個Arrays類里包含了提供了如下幾個static修飾的方法(static修飾的方法可以直接通過類名調用):

int binarySearch(type[] a,type key):這個方法查詢key元素值在a數組中出現的索引; 如果a數組不包含key元素值,則返回-1.調用該方法時要求數組中元素已經按升序排列,這樣才能得到正確結果。

binarySearch(type[] a,int fromIndex,int toIndex,type key):這個方法與前一個方法類似,但它只搜索a數組中formIndex到toIndex索引的元素。調用該方法時要求數組中元素已經按升序排列,這樣才能得到正確結果。

type[] copyOf(type[] original,int newLength):這個方法將會把original數組複製成一個新數組,其中length是新數組的長度。如果length小於original數組的長度,則新數組就是原數組的前面length個元素; 如果length大於original數組的長度,則新數組的前面元素就是原數組的所個元素,後面補充0(數值型)、false(布爾型)或者null(引用型)。

type[] copyOfRange(type[] original,int from,int to):這個方法與前面方法相似,但這個方法只複製original數組的from索引到to索引的元素。

boolean equals(type[] a,type[] a2):如果a數組和a2數組的長度相等,而且a數組和a2數組的數組元素也一一相同,該方法將返回true.

void fill(type[] a,type val):該方法將會把a數組所有元素值都賦值為val.

void fill(type[] a,int fromIndex, int toIndex, type val):該方法與前一個方法的作用相同,區別只是該方法僅僅將a數組的fromIndex到toIndex索引的數組元素賦值為val.

void sort(type[] a):該方法對a數組的數組元素進行排序。

void sort(type[] a,int fromIndex,int toIndex):該方法與前一個方法相似,區別是該方法僅僅對fromIndex到toIndex索引的元素進行排序。

String toString(type[] a):該方法將會一個數組轉換成一個字元串。該方法按順序把多個數組元素連綴在一起,多個數組元素使用英文逗號(,)和空格隔開。(利用該方法可以很清楚地看到各數組元素)

下面程序示範了Arrays類的用法:

public class TestArrays
  {
  public static void main(String[] args)
  {
  //定義一個a數組
  int[] a = new int[]{3, 4 , 5, 6};
  //定義一個a2數組
  int[] a2 = new int[]{3, 4 , 5, 6};
  //a數組和a2數組的長度相等,每個元素依次相等,將輸出true
  System.out.println("a數組和a2數組是否相等:" Arrays.equals(a , a2));
  //通過複製a數組,生成一個新的b數組
  int[] b = Arrays.copyOf(a, 6);
  System.out.println("a數組和b數組是否相等:" Arrays.equals(a , b));
  //輸出b數組的元素,將輸出[3, 4, 5, 6, 0, 0]
  System.out.println("b數組的元素為:" Arrays.toString(b));
  //將b數組的第3個元素(包括)到第5個元素(不包括)賦為1
  Arrays.fill(b , 2, 4 , 1); //fill方法可一次對多個數組元素進行批量賦值
  //輸出b數組的元素,將輸出[3, 4, 1, 1, 0, 0]
  System.out.println("b數組的元素為:" Arrays.toString(b));
  //對b數組進行排序
  Arrays.sort(b);
  //輸出b數組的元素,將輸出[0, 0, 1, 1, 3, 4]
  System.out.println("b數組的元素為:" Arrays.toString(b));
  }
  }

注意:Arrays類處於java.util包下,為了在程序中使用Arrays類,必須在程序中導入java.util.Arrays類。

除此之外,在System類里也包含了一個static void arraycopy(Object src,int srcPos,Object dest, int destPos,int length)方法,該方法可以將src數組裡的元素值賦給dest數組的元素,其中srcPos指定從src數組的第幾個元素開始賦值,length參數指定將src數組的多少個元素賦給dest數組的元素。

【淺析Hibernate下數據批量處理方法】

很多人都對Java在批量數據的處理方面是否是其合適的場所持有懷疑的念頭,由此延伸,那麼就會認為ORM可能也不是非凡適合數據的批量處理。其實,我想假如我們應用得當的話,完全可以消除ORM批量處理性能問題這方面的顧慮。下面以Hibernate為例來做為說明,假如我們真的不得不在 Java中使用Hibernate來對數據進行批量處理的話。 向資料庫插入100 000條數據,用Hibernate可能像這樣:

  Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  for ( int i=0; i<100000; i ) {
  Customer customer = new Customer(.....);
  session.save(customer); }
  tx.commit();
  session.close();

大概在運行到第50 000條的時候,就會出現內存溢出而失敗。這是Hibernate把最近插入的Customer都以session-level cache在內存做緩存,我們不要忘記Hiberante並沒有限制first-level cache 的緩存大小。

持久對象實例被治理在事務結束時,此時Hibernate與資料庫同步任何已經發生變 化的被治理的的對象。

Session實現了非同步write-behind,它答應Hibernate顯式地寫操作的批處理。 這裡,我給出Hibernate如何實現批量插入的方法:

首先,我們設置一個合理的JDBC批處理大小,hibernate.jdbc.batch_size 20。 然後在一定間隔對Session進行flush()和clear()。

Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  for ( int i=0; i<100000; i ) {
  Customer customer = new Customer(.....);
  session.save(customer);
  if ( i % 20 == 0 ) {
  //flush 插入數據和釋放內存:
  session.flush(); session.clear(); }
  }
  tx.commit();
  session.close();

那麼,關於怎樣刪除和更新數據呢?那好,在Hibernate2.1.6或者更后版本,scroll() 這個方法將是最好的途徑:

  Session session = sessionFactory.openSession();
  Transaction tx = session.beginTransaction();
  ScrollableResults customers = session.getNamedQuery("GetCustomers")
  .scroll(ScrollMode.FORWARD_ONLY);
  int count=0;
  while ( customers.next() ) {
  Customer customer = (Customer) customers.get(0);
  customer.updateStuff(...);
  if ( count % 20 == 0 ) {
  //flush 更新數據和釋放內存:
  session.flush(); session.clear(); } }
  tx.commit(); session.close();

這種做法並不困難,也不算不優雅。請注重,假如Customer啟用了second-level caching ,我們仍然會有一些內存治理的問題。原因就是對於用戶的每一次插入和更新,Hibernate在事務處理結束后不得不通告second-level cache 。因此,我們在批處理情況下將要禁用用戶使用緩存。

【如何把Java程序編譯成.exe文件】

常常在網上看到有人詢問:如何把 java 程序編譯成 .exe 文件。通常回答只有兩種,一種是製作一個可執行的 JAR 文件包,然後就可以像.chm 文檔一樣雙擊運行了;而另一種是使用 JET 來進行 編譯。但是 JET 是要用錢買的,而且據說 JET 也不是能把所有的 Java 程序都編譯成執行文件,性能也要打些折扣。所以,使用製作可執行 JAR 文件包的方法就是最佳選擇了,何況它還能保持 Java 的跨平台特性。

下面就來看看什麼是 JAR 文件包吧:

1. JAR 文件包

JAR 文件就是 Java Archive File,顧名思意,它的應用是與 Java 息息相關的,是 Java 的一種文檔格式。JAR 文件非常類似 ZIP 文件——準確的說,它就是 ZIP 文件,所以叫它文件包。JAR 文件與 ZIP 文件唯一的區別就是在 JAR 文件的內容中,包含了一個 META-INF/MANIFEST.MF 文件,這個文件是在生成 JAR 文件的時候自動創建的。舉個例子,如果我們具有如下目錄結構的一些文件:

  ==

  `-- test

    `-- Test.class

把它壓縮成 ZIP 文件 test.zip,則這個 ZIP 文件的內部目錄結構為:

  test.zip

  `-- test

    `-- Test.class

如果我們使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,則這個 JAR 文件的內部目錄結構為:

  test.jar

  |-- META-INF

  |  `-- MANIFEST.MF

  `-- test

    `--Test.class

2. 創建可執行的 JAR 文件包

製作一個可執行的 JAR 文件包來發布你的程序是 JAR 文件包最典型的用法。

Java 程序是由若干個 .class 文件組成的。這些 .class 文件必須根據它們所屬的包不同而分級分目錄存放;運行前需要把所有用到的包的根目錄指定給 CLASSPATH 環境變數或者 java 命令的 -cp 參數;運行時還要到控制台下去使用 java 命令來運行,如果需要直接雙擊運行必須寫 Windows 的批處理文件 (.bat) 或者 Linux 的 Shell 程序。因此,許多人說,Java 是一種方便開發者苦了用戶的程序設計語言。

其實不然,如果開發者能夠製作一個可執行的 JAR 文件包交給用戶,那麼用戶使用起來就方便了。在 Windows 下安裝 JRE (Java Runtime Environment) 的時候,安裝文件會將 .jar 文件映射給 javaw.exe 打開。那麼,對於一個可執行的 JAR 文件包,用戶只需要雙擊它就可以運行程序了,和閱讀 .chm 文檔一樣方便 (.chm 文檔默認是由 hh.exe 打開的)。那麼,現在的關鍵,就是如何來創建這個可執行的 JAR 文件包。

創建可執行的 JAR 文件包,需要使用帶 cvfm 參數的 jar 命令,同樣以上述 test 目錄為例,命令如下:

jar cvfm test.jar manifest.mf test

這裡 test.jar 和 manifest.mf 兩個文件,分別是對應的參數 f 和 m,其重頭戲在 manifest.mf。因為要創建可執行的 JAR 文件包,光靠指定一個 manifest.mf 文件是不夠的,因為 MANIFEST 是 JAR 文件包的特徵,可執行的 JAR 文件包和不可執行的 JAR 文件包都包含 MANIFEST。關鍵在於可執行 JAR 文件包的 MANIFEST,其內容包含了 Main-Class 一項。這在 MANIFEST 中書寫格式如下:

Main-Class: 可執行主類全名(包含包名)

例如,假設上例中的 Test.class 是屬於 test 包的,而且是可執行的類 (定義了 public static void main(String[]) 方法),那麼這個 manifest.mf 可以編輯如下:

Main-Class: test.Test <回車>

這個 manifest.mf 可以放在任何位置,也可以是其它的文件名,只需要有 Main-Class: test.Test 一行,且該行以一個回車符結束即可。創建了 manifest.mf 文件之後,我們的目錄結構變為:

  ==

  |-- test

  |  `-- Test.class

  `-- manifest.mf

這時候,需要到 test 目錄的上級目錄中去使用 jar 命令來創建 JAR 文件包。也就是在目錄樹中使用「==」表示的那個目錄中,使用如下命令:

jar cvfm test.jar manifest.mf test

之後在「==」目錄中創建了 test.jar,這個 test.jar 就是執行的 JAR 文件包。運行時只需要使用 java -jar test.jar 命令即可。

需要注意的是,創建的 JAR 文件包中需要包含完整的、與 Java 程序的包結構對應的目錄結構,就像上例一樣。而 Main-Class 指定的類,也必須是完整的、包含包路徑的類名,如上例的 test.Test;而且在沒有打成 JAR 文件包之前可以使用 java <類名> 來運行這個類,即在上例中 java test.Test 是可以正確運行的 (當然要在 CLASSPATH 正確的情況下)。

Java是什麼?快速入門,助力屌絲"逆襲"


Java是一種可以編寫跨平台應用軟體的面向對象的程序設計語言,是目前世界上最流行的計算機編程語言。Java的應用可以說是無處不在,從桌面辦
公應用到網路資料庫等應用,從PC到嵌入式移動平台等處處都有Java的身影。 


Java由四方面組成:Java編程語言、Java類文件格式、Java虛擬機和Java應用程序介面(Java API)。 


Java有三個版本:標準版(J2SE)、企業版(J2EE)和微型版(J2ME),J2SE就是Java的標準版,主要用於桌面應用軟體的編程;J2ME主要應用於嵌入式系統開發,如手機、PDA、家用電器等方面的編程;J2EE則應用於大量的企業級應用,如網站、ERP系統等。其中以J2EE和J2ME應用最為廣泛。

【如何使用Java編寫多線程程序】

線程呢可以看作單獨地佔有CPU時間來執行相應的代碼的。當然一個程序可以是多線程的,多線程的各個線程看上去像是并行地獨自完成各自的工作,就像一台一台計算機上運行著多個處理機一樣。

1、什麼是線程

線程呢可以看作單獨地佔有CPU時間來執行相應的代碼的。當然一個程序可以是多線程的,多線程的各個線程看上去像是并行地獨自完成各自的工作,就像一台一台計算機上運行著多個處理機一樣。在多處理機計算機上實現多線程時,它們確實可以并行工作,而且採用適當的分時策略可以大大提高程序運行的效率。

2、為什麼要使用多線程

順序執行程序和採用多線程并行執行程序相比,效率是可以大大地提高。

3、java中是如何實現多線程

在java語言中的線程系統是java語言自建的, 因為java中有專門的支持多線程的API庫,所以很容易寫一個支持線程的程序。在使用java創建線程的時候,可以生成一個Thread類或者他的子類對象,並給這個對象發送start()消息(程序可以向任何一個派生自 Runnable 介面的類對象發送 start() 消息的),這樣一來程序會一直執行,直到run返回為止,此時該線程就停止了。

在這裡我們用多線程中最典型的例子,生產者與消費者問題。在這個例子裡面我們定義了生產者Producer,消費者Consumer和倉庫Warehouse三個類,在整個程序的生命周期里,生產者隨機地製造出產品放到倉庫中,消費者也是隨即地從倉庫中取出產品。

import exception.ProducerConsumerException;
  /**
  * Consumer.java
  * Consumer
  * By: Jiabo
  * Date: Mar 21, 2004
  * Time: 2:47:58 PM
  */
  public class Consumer extends Thread {
  private Warehouse warehouse;
  private String id;
  public Consumer(Warehouse warehouse, String id) {
  this.warehouse = warehouse;
  this.id = id;
  }
  public void run() {
  int tmp = (int) Math.random() * 10;
  try {
  warehouse.get(tmp);
  System.out.println("Consumer # " this.id " get " tmp);
  } catch (ProducerConsumerException e) {
  e.printStackTrace();
  }
  try {
  sleep((int) (Math.random() * 100));
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  }

在這個類中,值得注意的一點是run方法中必須使用try-catch,因為,消費者從倉庫中取東西時有可能諸如倉庫中的儲量不夠得異常,在消費者裡面也是一樣,只不過異常變為倉庫已滿。

  import exception.*;
  /**
  * Producer.java
  * Producer
  * By: Jiabo
  * Date: Mar 21, 2004
  * Time: 2:47:45 PM
  */
  public class Producer extends Thread {
  private Warehouse warehouse;
  private String id;
  public Producer(Warehouse warehouse, String id) {
  this.warehouse = warehouse;
  this.id = id;
  }
  public void run() {
  int tmp = (int) Math.random() * 10;
  if (tmp != 0) {
  try {
  warehouse.put(tmp);
  System.out.println("Consumer # " this.id " put " tmp);
  } catch (ProducerConsumerException e) {
  e.printStackTrace();
  }
  }
  try {
  sleep((int) (Math.random() * 100));
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  }
  }

最重要的一部分在Warehouse類,如上所說為了保證get何set的原子性,在這裡使用了synchronized關鍵字,並且在操作時拋出了可能跑出的異常。

import exception.*;
  /**
  * Warehouse
  * By: Jiabo
  * Date: Mar 21, 2004
  * Time: 2:48:10 PM
  */
  public class Warehouse {
  // max capability of the warehouse
  private int MAX;
  private int contents;
  // init with max capacity
  public Warehouse(int max) {
  this.MAX = max;
  this.contents = 0;
  }
  public synchronized void get(int amount) throws ProducerConsumerException {
  // the amount you want to get is bigger than the contends that the warehouse stores
  if (amount > this.contents) {
  throw new NotEnoughGoodsException();
  }
  amount -= contents;
  }
  public synchronized void put(int amount) throws ProducerConsumerException {
  // the amount you want to put is out of the capability of the warehouse
  if (amount > (this.MAX - this.contents)) {
  throw new WarehouseFullException();
  } else if (this.contents == 0) {
  // warehouse is empty
  throw new WarehouseEmptyException();
  }
  amount = contents;
  }
  }

14 JAVA -Java模擬器

  Java手機遊戲模擬器主要針對諾基亞S60系列手機以及其他大屏手機(小屏遊戲也可運行,但不能全屏顯示),是一款非常簡單而且實用的JAVA遊戲模擬器,可以正常運行絕大部分JAVA手機遊戲!註:暫不支持遊戲後綴名為sis的遊戲。程序的使用是傻瓜式的,在電腦上安裝好以後,所有的遊戲jar文件都會和模擬器相關連,直接雙擊遊戲jar文件就可以進入模擬器玩遊戲啦!電腦的小數字鍵盤和方向鍵就可以直接控制遊戲,與模擬器的按鍵相對應,當然也可以用滑鼠直接點擊控制。

15 JAVA -java學習書籍

  Java資料庫高級編程寶典 Java核心技術第八版(core java 8th) Java程序設計基礎教程   Java distribute computing 15天學會jQuery J2EE課程設計指導   JMS簡明教程 JDK1.6 API中文版(CHM格式) JDK 1.4 Tutorial   JAVA核心技術:針對Java SE6平台進行了全面更新,涵蓋Java語言核心內容。大量精心設計代碼示列

16 JAVA -參見

計算機科學課程列表
JNI(Java Native Interface)Java本地介面

17 JAVA -參考文獻

Jon Byous, Java technology: The early years. Sun Developer Network, no date [ca. 1998]. Retrieved April 22, 2005.

James Gosling, A brief history of the Green project. Java.net, no date [ca. Q1/1998]. Retrieved April 22, 2005.

James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, second edition. Addison-Wesley, 2000. ISBN 0201310082.

James Gosling, Bill Joy, Guy Steele, and Gilad Bracha, The Java language specification, third edition. Addison-Wesley, 2005. ISBN 0321246780.

Tim Lindholm and Frank Yellin. The Java Virtual Machine specification, second edition. Addison-Wesley, 1999. ISBN 0201432943.

蔡學鏞,〈從編譯器與 VM 角度分析 Java2 v5.0 語言的新特色〉

18 JAVA -外部鏈接

昇陽公司

昇陽(Sun Microsystems)公司主頁(英文)

昇陽公司中國主頁

Java的官方網站(英文)

Java主頁(英文)

Java白皮書(英文)

技術開發

http://jakarta.apache.org Apache基金會的Jakarta項目

Javaeye---深度技術社區

Java家-中文Java門戶

Matrix Java

Java研究組織

CSDN Java頻道

CSDN JAVA社區

中文JAVA技術網

JAVA中文站

雙子星Java開源技術門戶

http://www.javaworld.com.tw/Javawhat.com

Java resource directory, Java API Specifications, Latest Java News

Java常式網

免費網上Java書

名詞解釋:JavaFX

名詞解釋:JavaFX Mobile

Full Java Tutorial

Java 學習筆記

集成開發環境IDE

BEA Workshop – 商業軟體, BEA Systems公司開發, 與BEA WebLogic伺服器整合。

BlueJ – 免費軟體 目前由肯特大學和迪肯大學的聯合小組負責維護。

Eclipse – 免費開源軟體, Eclipse Foundation開發。

IntelliJ IDEA – 商業軟體, JetBrains公司開發。

JBuilder – 商業軟體(有試用版), Borland公司開發。

JCreator – 商業軟體(有試用版), Xinox公司開發

JDeveloper – 商業軟體,Oracle Corporation公司開發, 與Oracle Application Server伺服器整合。

NetBeans – 免費開源軟體,NetBeans.org社區開發。

Sun Java Studio Enterprise – 商業軟體(available free to members of the free Sun Developer Network), Sun Microsystems公司開發。

WebSphere Developer & Development Studio – 商業軟體, IBM開發, 與WebSphere Application Server伺服器整合。

一般應用

昇陽公司的新聞組

維基Java

Java基礎應用

Java歷史

Java的早年

綠色計劃概要

Java傳奇

Java歷史

Java評論

Java Cover

Java真爛

Java的陰暗面

上一篇[Skype]    下一篇 [鎮腦寧]

相關評論

同義詞:暫無同義詞