【正文】
as a television (the object) with your remote control (the reference). As long as you?re holding this reference, you have a connection to the television, but when someone says “change the channel” or “l(fā)ower the volume,” what you?re manipulating is the reference, which in turn modifies the object. If you want to move around the room and still control the television, you take the remote/reference with you, not the 第 8頁 television. Also, the remote control can stand on its own, with no television. That is, just because you have a reference doesn?t mean there?s necessarily an object connected to it. So if you want to hold a word or sentence, you create a String reference: String s。 Java 有一個(gè)特別的 “垃圾收集器 ”,它會(huì) 查找用 new 創(chuàng)建的所有對象,并辨別其中哪些不再被引用。所以 C 和 C++能將一個(gè)變量 “隱藏 ”在一個(gè)更大的作用域里。一旦 Java 看到 null,就知道該句柄并未指向一個(gè)對象。 Big Integer 支持任意精度的整數(shù)。若數(shù)據(jù)完全獨(dú)立于一個(gè)程序之外,則程序不運(yùn)行時(shí)仍可存在,并在程序的控制范圍之外。 堆。 Java 配套提供了數(shù)量眾多的現(xiàn)成類型。此外,即使沒有電視機(jī),遙控板亦可獨(dú)立存在。由于 C++是 C 的一個(gè)超集,所以包含的許多特性都是后者不具備的,這些特性使 C++在某些地方顯得過于復(fù)雜。有些時(shí)候,程序員必須時(shí)刻留意準(zhǔn)備處理的是什么類型。 然而,這里采用的是一種特殊類型: 字串可用加引號的文字初始化。然而,寄存器的數(shù)量十分有限,所以寄存器是根據(jù)需要由編譯器分配。這兒的 “靜態(tài) ”( Static)是指 “位于固定位置 ”(盡管也在 RAM 里)。 Java 提供了對 Lightweight persistence 的支持。若程 序訪問自己內(nèi)存塊以外的數(shù)組,或者在初始化之前使用內(nèi)存(屬于常規(guī)編程錯(cuò)誤),會(huì)產(chǎn)生不可預(yù)測的后果 。變量應(yīng)持續(xù)多長的時(shí)間?如果想清除它,那么何時(shí)進(jìn)行 ?在變量存在時(shí)間上糾纏不清造成大量的程序錯(cuò)誤。在后面的章節(jié)里,大家還會(huì)繼續(xù)學(xué)習(xí)如何在程序運(yùn)行期間傳遞和復(fù)制對象句柄。 But here you?ve created only the reference, not an object. If you decided to send a message to s at this point, you?ll get an error (at run time) because s isn?t actually attached to anything (there?s no television). A safer practice, then, is always to initialize a reference when you create it: String s = asdf。但 Java以后,情況卻發(fā)生了改觀。編譯器會(huì)認(rèn)為變量x已被定義。而且每個(gè)句柄都會(huì)自動(dòng)初始 化成一個(gè)特殊值,并帶有自己的關(guān)鍵字: null(空)。我們犧牲了速度,但換來了精度。 非 RAM 存儲(chǔ)。這一限制無疑影響了程序的靈活性,所以盡管有些 Java 數(shù)據(jù)要保存在堆棧里 ——特別是對象句柄,但 Java 對象并不放到其中。當(dāng)然,字串( String)并非唯一的類型。如果要在房間里四處走走,并想保持對電 視機(jī)的控制,那么手上拿著的是遙控板,而非電視機(jī)。雜合語言允許采用多種編程風(fēng)格;之所以說 C++是一種雜合語言,是因?yàn)樗С峙c C 語言的向后兼容能力。您曾利用一些特殊語法直接操作過對象,或處理過一些間接表示的對象嗎( C 或 C++里的指針)?所有這些在 Java 里 都得到了簡化,任何東西都可看作對象。通常,必須為對象使用一種更通用的初始化類型。我們對此沒有直接的控制權(quán),也不可能在自己的程序里找到寄存器存在的任何蹤跡。程序運(yùn)行期間,靜態(tài)存儲(chǔ)的數(shù)據(jù)將隨時(shí)等候調(diào)用。未來的版本甚至可能提供更完整的方案。 Java 的一項(xiàng)主要設(shè)計(jì)目標(biāo)就是安全性。在下面的小節(jié)里,將 闡釋 Java 如何幫助我們完成所有清除工作, 從 而極大了簡化了這個(gè)問題。 這樣造成的結(jié)果便是:對于用 new 創(chuàng)建的對象,只要我們愿意,它們就會(huì)一直保留下去。 However, this uses a special Java feature: strings can be initialized with quoted text. Normally, you must use a more general type of initialization for objects. You must create all the objects When you create a reference, you want to connect it with a new object. You do so, in general, with the new keyword. The keyword new says, “Make me a new one of these objects.” So in the preceding example, you can say: String s = new String(asdf)。在 C++里,這個(gè)問題最令程序員頭痛。由于 Java 是一種形式自由的語言,所 以 額外的空格、制表位以及回車 都不會(huì)對結(jié)果程序造成影響。 創(chuàng)建對象數(shù)組時(shí),實(shí)際創(chuàng)建的是一個(gè)句柄數(shù)組。此外,由于牽涉更多,所以運(yùn)算速度會(huì)慢一些。有的常數(shù)需要嚴(yán)格地保護(hù),所以可考慮將它們置入只讀存儲(chǔ)器( ROM)。這是由于它必須生成相應(yīng)的代碼,以便向上和向下移動(dòng)指針。 它不僅指出 “將我變成一個(gè)新字串 ”,也通過提供一個(gè)初始字串,指出了 “如何生成這個(gè)新字串 ”。但一旦需要 “換頻道 ”或者 “關(guān)小聲音 ”,我們實(shí)際操縱的是遙控板(句柄),再由遙控板自己操縱電視機(jī)(對象)。但在 Java 中,設(shè)計(jì)者覺得這種雜合并不 像 在C++里那么重要。因此,我們可采用一種統(tǒng)一的語法,任何地方均可照搬不誤。 ( 2) 所有對象都必須創(chuàng)建 。 堆棧??捎?static 關(guān)鍵字指出一個(gè)對象的特定元素是靜態(tài)的。 ( 3) 高精度數(shù)字 Java 增加了兩個(gè)類,用于進(jìn)行高精度的計(jì)算: Big Integer 和 Big Decimal。所以在 C 和 C++里困擾程序員的許多問題都未在 第 5頁 Java 里重復(fù)。 作用域 大多數(shù)程序設(shè)計(jì)語言都提供了 “作用域 ”( Scope)的概念。這個(gè)編程問題在 C 和 C++里特別突出。 Not only does this mean “Make me a new String,” but it also gives information about how to make the String by supplying an initial character string. Of course, String is not the only type that exists. Java es with a plethora of readymade types. What?s mor