當前位置:編程學習大全網 - 編程語言 - 求壹篇2000中文字的計算機外文翻譯

求壹篇2000中文字的計算機外文翻譯

中文:

“盡管以C++為基礎,但Java是壹種更純粹的面向對象程序設計語言”。

無論C++還是Java都屬於雜合語言。但在Java中,設計者覺得這種雜合並不像在C++裏那麽重要。雜合語言允許采用多種編程風格;之所以說C++是壹種雜合語言,是因為它支持與C語言的向後兼容能力。由於C++是C的壹個超集,所以包含的許多特性都是後者不具備的,這些特性使C++在某些地方顯得過於復雜。

Java語言首先便假定了我們只希望進行面向對象的程序設計。也就是說,正式用它設計之前,必須先將自己的思想轉入壹個面向對象的世界(除非早已習慣了這個世界的思維方式)。只有做好這個準備工作,與其他OOP語言相比,才能體會到Java的易學易用。下面,我們將探討Java程序的基本組件,並體會為什麽說Java乃至Java程序內的壹切都是對象。

用句柄操縱對象。

每種編程語言都有自己的數據處理方式。有些時候,程序員必須時刻留意準備處理的是什麽類型。您曾利用壹些特殊語法直接操作過對象,或處理過壹些間接表示的對象嗎(C或C++裏的指針)?所有這些在Java裏都得到了簡化,任何東西都可看作對象。因此,我們可采用壹種統壹的語法,任何地方均可照搬不誤。但要註意,盡管將壹切都“看作”對象,但操縱的標識符實際是指向壹個對象的“句柄”(Handle)。在其他Java參考書裏,還可看到有的人將其稱作壹個“引用”,甚至壹個“指針”。可將這壹情形想象成用遙控板(句柄)操縱電視機(對象)。只要握住這個遙控板,就相當於掌握了與電視機連接的通道。但壹旦需要“換頻道”或者“關小聲音”,我們實際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(對象)。如果要在房間裏四處走走,並想保持對電視機的控制,那麽手上拿著的是遙控板,而非電視機。此外,即使沒有電視機,遙控板亦可獨立存在。也就是說,只是由於擁有壹個句柄,並不表示必須有壹個對象同它連接。所以如果想容納壹個詞或句子,可創建壹個String句柄:

String s;

但這裏創建的只是句柄,並不是對象。若此時向s發送壹條消息,就會獲得壹個錯誤(運行期)。這是由於s實際並未與任何東西連接(即“沒有電視機”)。因此,壹種更安全的做法是:創建壹個句柄時,記住無論如何都進行初始化:

String s = "asdf";

然而,這裏采用的是壹種特殊類型:字串可用加引號的文字初始化。通常,必須為對象使用壹種更通用的初始化類型。

(2)所有對象都必須創建。

創建句柄時,我們希望它同壹個新對象連接。通常用new關鍵字達到這壹目的。new的意思是:“把我變成這些對象的壹種新類型”。所以在上面的例子中,可以說:

String s = new String("asdf");

它不僅指出“將我變成壹個新字串”,也通過提供壹個初始字串,指出了“如何生成這個新字串”。當然,字串(String)並非唯壹的類型。Java配套提供了數量眾多的現成類型。對我們來講,最重要的就是記住能自行創建類型。事實上,這應是Java程序設計的壹項基本操作,是繼續本書後余部分學習的基礎。

程序運行時,我們最好對數據保存到什麽地方做到心中有數。特別要註意的是內存的分配。有六個地方都可以保存數據:

寄存器。這是最快的保存區域,因為它位於和其他所有保存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是根據需要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程序裏找到寄存器存在的任何蹤跡。

堆棧。駐留於常規RAM(隨機訪問存儲器)區域,但可通過它的“堆棧指針”獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是壹種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須準確地知道堆棧內保存的所有數據的“長度”以及“存在時間”。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這壹限制無疑影響了程序的靈活性,所以盡管有些Java數據要保存在堆棧裏——特別是對象句柄,但Java對象並不放到其中。

堆。壹種常規用途的內存池(也在RAM區域),其中保存了Java對象。和堆棧不同,“內存堆”或“堆”(Heap)最吸引人的地方在於編譯器不必知道要從堆裏分配多少存儲空間,也不必知道存儲的數據要在堆裏停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建壹個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆裏自動進行數據的保存。當然,為達到這種靈活性,必然會付出壹定的代價:在堆裏分配存儲空間時會花掉更長的時間!

靜態存儲。這兒的“靜態”(Static)是指“位於固定位置”(盡管也在RAM裏)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出壹個對象的特定元素是靜態的。但Java對象本身永遠都不會置入靜態存儲空間。

常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的,因為它們永遠都不會改變。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。

非RAM存儲。若數據完全獨立於壹個程序之外,則程序不運行時仍可存在,並在程序的控制範圍之外。其中兩個最主要的例子便是“流式對象”和“固定對象”。對於流式對象,對象會變成字節流,通常會發給另壹臺機器。而對於固定對象,對象保存在磁盤中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,壹個特別有用的技巧就是它們能存在於其他媒體中。壹旦需要,甚至能將它們恢復成普通的、基於RAM的對象。Java 1.1提供了對Lightweight persistence的支持。未來的版本甚至可能提供更完整的方案。

(3)高精度數字

Java 1.1增加了兩個類,用於進行高精度的計算:Big Integer和Big Decimal。盡管它們大致可以劃分為“封裝器”類型,但兩者都沒有對應的“主類型”。

這兩個類都有自己特殊的“方法”,對應於我們針對主類型執行的操作。也就是說,能對int或float做的事情,對Big Integer和Big Decimal壹樣可以做。只是必須使用方法調用,不能使用運算符。此外,由於牽涉更多,所以運算速度會慢壹些。我們犧牲了速度,但換來了精度。

Big Integer支持任意精度的整數。也就是說,我們可精確表示任意大小的整數值,同時在運算過程中不會丟失任何信息。

Big Decimal支持任意精度的定點數字。例如,可用它進行精確的幣值計算。

至於調用這兩個類時可選用的構建器和方法,請自行參考聯機幫助文檔。

(4)Java的數組

幾乎所有程序設計語言都支持數組。在C和C++裏使用數組是非常危險的,因為那些數組只是內存塊。若程序訪問自己內存塊以外的數組,或者在初始化之前使用內存(屬於常規編程錯誤),會產生不可預測的後果。

Java的壹項主要設計目標就是安全性。所以在C和C++裏困擾程序員的許多問題都未在Java裏重復。壹個Java可以保證被初始化,而且不可在它的範圍之外訪問。由於系統自動進行範圍檢查,所以必然要付出壹些代價:針對每個數組,以及在運行期間對索引的校驗,都會造成少量的內存開銷。但由此換回的是更高的安全性,以及更高的工作效率。為此付出少許代價是值得的。

創建對象數組時,實際創建的是壹個句柄數組。而且每個句柄都會自動初始化成壹個特殊值,並帶有自己的關鍵字:null(空)。壹旦Java看到null,就知道該句柄並未指向壹個對象。正式使用前,必須為每個句柄都分配壹個對象。若試圖使用依然為null的壹個句柄,就會在運行期報告問題。因此,典型的數組錯誤在Java裏就得到了避免。

也可以創建主類型數組。同樣地,編譯器能夠擔保對它的初始化,因為會將那個數組的內存劃分成零。

(5)絕對不要清除對象

在大多數程序設計語言中,變量的“存在時間”(Lifetime)壹直是程序員需要著重考慮的題。變量應持續多長的時間?如果想清除它,那麽何時進行?在變量存在時間上糾纏不清造成大量的程序錯誤。在下面的小節裏,將闡釋Java如何幫助我們完成所有清除工作,從而極大了簡化了這個問題。

作用域

大多數程序設計語言都提供了“作用域”(Scope)的概念。對於在作用域裏定義的名字,作用域同時決定了它的“可見性”以及“存在時間”。在C,C++和Java裏,作用域是由花括號的位置決定的。

作為在作用域裏定義的壹個變量,它只有在那個作用域結束之前才可使用。

在上面的例子中,縮進排版使Java代碼更易辨讀。由於Java是壹種形式自由的語言,所以額外的空格、制表位以及回車都不會對結果程序造成影響。編譯器會認為變量x已被定義。所以C和C++能將壹個變量“隱藏”在壹個更大的作用域裏。但這種做法在Java裏是不允許的。

對象的作用域

Java對象不具備與主類型壹樣的存在時間。用new關鍵字創建壹個Java對象的時候,它會超出作用域的範圍之外。

那麽句柄s會在作用域的終點處消失。然而,s指向的String對象依然占據著內存空間。在上面這段代碼裏,我們沒有辦法訪問對象,因為指向它的唯壹壹個句柄已超出了作用域的邊界。在後面的章節裏,大家還會繼續學習如何在程序運行期間傳遞和復制對象句柄。

這樣造成的結果便是:對於用new創建的對象,只要我們願意,它們就會壹直保留下去。這個編程問題在C和C++裏特別突出。看來在C++裏遇到的麻煩最大:由於不能從語言獲得任何幫助,所以在需要對象的時候,根本無法確定它們是否可用。而且更麻煩的是,在C++裏,壹旦工作完成,必須保證將對象清除。

這樣便帶來了壹個有趣的問題。假如Java讓對象依然故我,怎樣才能防止它們大量充斥內存,並最終造成程序的“凝固”呢。在C++裏,這個問題最令程序員頭痛。但Java以後,情況卻發生了改觀。Java有壹個特別的“垃圾收集器”,它會查找用new創建的所有對象,並辨別其中哪些不再被引用。隨後,它會自動釋放由那些閑置對象占據的內存,以便能由新對象使用。這意味著我們根本不必操心內存的回收問題。只需簡單地創建對象,壹旦不再需要它們,它們就會自動離去。這樣做可防止在C++裏很常見的壹個編程問題:由於程序員忘記釋放內存造成的“內存溢出”。

  • 上一篇:3D MAS 和MAYS 都屬於世界頂級的3維軟件,他們各自的強項在哪?
  • 下一篇:請高手用Keil C編寫壹段能在液晶屏(protel已畫好單片機,用Proteus電路仿真)上顯示(比如"NBA")的程序!
  • copyright 2024編程學習大全網