-- 作者:wangxinxin
-- 發布時間:2010-12-10 15:13:24
-- C++與Java語言及其開發工具 (2)
在Java中,對變量和方法的訪問控制是通過訪問修飾符來實現的。Java定義了4種 訪問級別:公共(public)、受保護(protected)、私有(private)和友好(friendly)。 公共類型的方法及變量可從任意類進行訪問;受保護類型的方法及變量只能從當前 類及其子類訪問;私有類型的方法及變量則只能從當前類訪問。如果未給出這三種 類型中任意一種的顯式說明 ,表明相應的方法或變量屬于"友好"類型,從而可由屬 于同一"包"(package)內的所有類進行訪問。在Java內,"包"是一個單獨的編譯單 位,它是具有某種共性的類所組成的集合。通過定義包這個單位,可實現相關對象 之間的相互訪問,同時把這些對象與包之外的其它對象隔離。
面向對象的編程機制是Java的一個極為重要的方面。在Java內,如果不創建新類, 就無法創建應用程序。Java定義了一個特殊的超類Object,用戶創建的類都是Object 的子類。J ava程序既可在解釋器內也可在瀏覽器內運行,但無論采用哪種方式,都 必須先創建一個類實例,然后才能提交運行。此外,利用繼承機制,用戶還可充分利 用各種超類提供的功能。
2. 與C++的差別
盡管C++程序員可以相對容易地掌握Java編程,但他們仍然必須克服從C++帶來的一 些舊習慣。Java取消了C++中的如下特性或功能:
·結構或指針 ·#define語句
·指針 ·多重繼承
·獨立的函數 ·GOTO語句
·操作符重載 ·自動類型轉換
Java不支持結構和指針,而且取消了C++中的#define或#typedef語句和頭文件。
事實上,constant和typedef這兩條語句包含了#define語句的作用。現在,結構和 聯合已經被Java的類所代替。刪除這些特性的原因是:由于其希望維持與C語言的 向后兼容性,C ++的語言規范包含了大量冗余。比如,類實際上就已經包括了結構 和聯合的作用,因此這兩種數據結構完全可以取消。關于#define語句,Java語言規 范的制訂者認為:盡管該語句的出發點是為了增強程序的可讀性,但實際效果卻恰 恰相反,它常常導致難讀的代碼,故應該予以取消。Java不再支持獨立函數,因此任 何函數都必須封裝到某個類中。由于人們普遍認為, C++所用的超類是非常不穩定 的,因此Java拋棄了C++中的多繼承并代之以接口。Java的接口指的是,在別的類看 來一個類所能實現的方法。它所顯示的只是一個類的方法或常量和變量 ,而不是 這個類的全部結構。
最后,Java還取消了C++中的GOTO語句、操作符重載、自動類型轉換及指針數據類 型。 GOTO語句引起的爭議已經有很多年了,可一直陰魂不散,這跟某些程序員對該 語句一直情有獨鐘有關。C++仍然支持數據類型的自動轉換,但Java要求編程人員 顯式實現數據類型之間的轉換。自動數據類型轉換使得兩個數據類型互不兼容的 變量可以相互賦值,而不需要給出顯式說明。這有時會導致一些問題,其中最常見 的是精確度損失。比方說,如果把一個帶符號的32位整數賦給一個無符號整數,則 所有的結果均為正數。Java的設計者們認為這很容易引起程序錯誤,從而決定不支 持這種轉換方式。
某些C和C++程序員也許會覺得遺憾,因為Java不再支持他們非常愿意使用的指針類 型。但我們都知道,指針是調試程序時使人最感頭痛的地方之一。Java的設計者們 認為,由于Ja va取消結構類型并且把數組封裝到了對象里面,指針已經不再有用武 之地。但有些C和C++高級編程人員可能仍然需要一段時間才能走出指針的陰影。 因為指針的用法盡管很難掌握,可一旦掌握了其使用技巧,就會讓人感到它的功能 的確非常強大。作為一種面向分布式計算環境的編程語言,Java放棄對指針的支持 是非常順理成章的,因為只有這樣,才可能產生一種穩可能產生一種穩定、高效而 且安全的代碼。
3. 內存管理和線索
Java語言帶來的好處還在于其自動內存管理和線索控制。在C和C++中,內存必須用 free、 malloc和其它許多內存管理標準庫管理。因此,系統要了解何時分配、釋 放內存并且跟蹤所有的內存使用情況是非常困難的。如果要在C和C++中實現線索 功能,必須使用一個可對線索進行各種控制的類庫。而在Java中,盡管線索仍然需 要類的支持,但系統卻在語言級包括了線索同步機制。
Java具有內嵌的內存管理程序。一旦創建了一個對象,Java的運行系統就開始跟蹤 這個對象,直到不再需要跟蹤該對象的所有引用為止。當某個對象不存在相應的引 用時,Java把這個對象放到一個用于垃圾搜集的棧內。為在性能損失最小的情況下 提供自動垃圾搜集機制,這個垃圾搜集程序將在后臺或作為低優先級線索運行。這 樣,Java的垃圾搜集軟件將在前臺線索的執行期間抽空執行,或者在系統顯式提出 需要使用那些被已經死亡的類所占用的內存空間時執行。
從后臺內存管理程序可以很明顯地看出,多線索的確可以增強Java環境的相對性能。 鑒于多線索的重要性,Java在語言級提供了線索同步機制,使多線索成為一種內嵌 特性。Java 語言支持針對方法的同步修飾符,并通過該修飾符來指明線索的運行 順序。此外,Java還能控制方法與實例變量的相互作用機制,確保了各方法之間在 修改數據時不會產生沖突。
Java的內存管理和線索支持還具有使Java語言簡單化的作用。正是由于把內存管 理任務嵌入到了Java環境,Java語言才可以取消指針數據類型、malloc和free函 數。這樣,程序員就可以把更多的時間化在真正的編程工作上,而不是去跟蹤調試 與內存使用相關的程序錯誤。正是由于其多線索機制,Java才可以為一個可移植 的解釋系統提供較高的性能。
Java語言非常適合于異構網絡系統(尤其是Internet)上的高性能、分布式計算環 境。雖然個人機系統未必可以看作是高性能的,但目前的個人機已經具有相當好 的性能。再者, 目前幾乎所有操作系統均提供了各種高級特性,如內嵌的聯網功 能和真正的多任務、多線索支持等。然而在幾年前,這些功能還只有昂貴的UNIX 工作站才能提供。有了這些軟硬件基礎 ,加上Java的簡單易學及面向對象特性, 未來的程序員將可以在聯入網絡的個人機上開發適合于在各種硬件和軟件平臺上 發布的高級"內容"。
|