1. 程式人生 > >Java程式設計拾遺『Java概述』

Java程式設計拾遺『Java概述』

Java是一種廣泛使用的計算機程式語言,擁有跨平臺、面向物件、泛型程式設計的特性,廣泛應用於企業級Web應用開發和移動應用開發。

1. Java語言概述

任職於Sun的Jams Gosling等人於1990年代初開發Java語言的雛形,最初被命名為Oak,目標設定在家用電器等小型系統的程式語言,應用在電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通訊。由於這些智慧化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。隨著1990年代網際網路的發展,Sun公司看見Oak在網際網路上應用的前景,於是改造了Oak,於1995年5月以Java的名稱正式釋出。Java伴隨著網際網路的迅猛發展而發展,逐漸成為重要的網路程式語言。

Java程式語言的風格十分接近C++語言。繼承了C++語言面向物件技術的核心,捨棄了容易引起錯誤的指標,以引用取代;移除了C++中的運算子過載和多重繼承特性,用介面取代;增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型程式設計、型別安全的列舉、不定長引數和自動裝/拆箱特性。Sun對Java語言的解釋是:“Java程式語言是個簡單、面向物件、分散式、解釋性、健壯、安全與系統無關、可移植、高效能、多執行緒和動態的語言”

Java是一門解釋型語言,但不同於一般的編譯語言或解釋型語言的是,它首先將原始碼編譯成位元組碼,再依賴各種不同平臺上的虛擬機器來解釋執行位元組碼,從而具有“一次編寫,到處執行”的跨平臺特性,通過各個平臺的虛擬機器來遮蔽各個平臺的差異。在早期JVM中,這在一定程度上降低了Java程式的執行效率。但在J2SE1.4.2釋出後,Java的執行速度有了大幅提升。

與傳統型別不同,Sun公司在推出Java時就將其作為開放的技術。全球的Java開發公司被要求所設計的Java軟體必須相互相容。“Java語言靠群體的力量而非公司的力量”是 Sun公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同,此外,微軟公司後來推出了與之競爭的.NET平臺以及模仿Java的C#語言。後來Sun被Oracle併購,Java也隨之成為甲骨文公司的產品。

2. Java常規特性

2.1 跨平臺性

跨平臺性是java主要的特性之一,跨平臺使得使用用Java語言編寫的程式可以在編譯後不用經過任何更改,就能在任何硬體裝置條件下執行。這個特性經常被稱為“一次編譯,到處執行”。

執行Java應用程式必須安裝Java 執行時環境(Java Runtime Environment,JRE),JRE包括Java虛擬機器(Java Virtual Machine,JVM),以及Java平臺核心類和基礎Java 平臺庫。通過JVM才能在計算機系統執行Java應用程式。實現跨平臺性的方法是大多數編譯器在進行Java語言程式的編碼時候會生成一個用位元組碼寫成的“半成品”,這個“半成品”會在Java虛擬機器(解釋層)的幫助下執行,虛擬機器會把它轉換成當前所處硬體平臺的原始程式碼。之後,Java虛擬機器會開啟標準庫,進行資料(圖片、執行緒和網路)的訪問工作。很顯然,經過解釋執行,其執行速度必然會比可執行的二進位制位元組碼程式慢很多。這就是傳統的JVM的直譯器(Interpreter)的功能。為了解決這種效率問題,引入了 JIT(即時編譯) 技術。

2.2 面向物件

面向物件是Java的另一大特性,是程式設計方法的一種,對於面向物件的準確定義及其本意存在著不少爭論。與面向物件相對應的是面向過程,關於面向物件和麵向過程的區別,這裡舉個簡單的例子。我們每天去上班,要經歷起床洗漱、坐地鐵、到公司幹活這是哪個步驟,那麼用面向過程的思維要完成這個過程要這樣,分別呼叫起床洗漱()、坐地鐵(家,公司)、到公司幹活()這三個方法。假如使用面向物件的思維,那麼我的上班這一過程可以抽象為一個類GoWork,這個類中包含我上班需要的各個屬性(比如時間,其實位置等),以及方法,上班的流程可以通過一個GoWork的例項物件來完成,物件.起床洗漱()、物件.坐地鐵()、物件.幹活()。很明顯,面向物件的思想將具體活動抽象到一個類中,通過類例項呼叫方法,實現相應功能,相比於面向過程,帶來的好處便是各個模組比較獨立,方便維護。其實面向過程和麵向物件沒有絕對的優劣之分,只是兩種程式設計思想。面向物件可以帶來的好處是易維護、易複用、易擴充套件,可以設計出低耦合的系統,使系統更加靈活、更加易於維護 。而面向過程的好處是效能相對較高,比如微控制器、嵌入式開發、Linux/Unix等一般採用面向過程開發。

2.3 自動垃圾回收

C++語言被使用者詬病的原因之一是大多數C++編譯器不支援垃圾收集機制。通常使用C++程式設計的時候,程式設計師於程式中初始化物件時,會在主機儲存器堆疊上分配一塊儲存器與地址,當不需要此物件時,進行析構或者刪除的時候再釋放分配的儲存器地址。如果物件是在堆疊上分配的,而程式設計師又忘記進行刪除,那麼就會造成儲存器洩漏(Memory Leak)。長此以往,程式執行的時候可能會生成很多不清除的垃圾,浪費了不必要的儲存器空間。而且如果同一儲存器地址被刪除兩次的話,程式會變得不穩定,甚至崩潰。因此有經驗的C++程式設計師都會在刪除之後將指標重置為NULL,然後在刪除之前先判斷指標是否為NULL。

Java語言則不同,上述的情況被自動垃圾收集功能自動處理。物件的建立和放置都是在儲存器堆疊上面進行的。當一個物件沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個物件所佔用的空間,釋放儲存器以避免儲存器洩漏。