版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 畢業(yè)設(shè)計(jì)(論文)外文資料翻譯</p><p> 系 : 信息工程學(xué)院 </p><p> 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 姓 名: xxxxxx
2、 </p><p> 學(xué) 號(hào): xxxxxxxxx </p><p> 外文出處: Thinking.In.Java.4th.Edition </p><p> 附 件: 1.外文資料翻譯譯文;2.外文原文。 </p><p&g
3、t; 附件1:外文資料翻譯譯文</p><p><b> 一切都是對(duì)象</b></p><p> “如果我們說另一種不同的語言,那么我們就會(huì)發(fā)覺一個(gè)有些不同的世界”。</p><p> —Ludwig Wittgenstein(1889-1951)</p><p> “盡管以C++為基礎(chǔ),但Java是一種更純粹
4、的面向?qū)ο蟪绦蛟O(shè)計(jì)語言”。</p><p> 無論C++還是Java都屬于雜合語言。但在Java中,設(shè)計(jì)者覺得這種雜合并不像在C++里那么重要。雜合語言允許采用多種編程風(fēng)格;之所以說C++是一種雜合語言,是因?yàn)樗С峙cC語言的向后兼容能力。由于C++是C的一個(gè)超集,所以包含的許多特性都是后者不具備的,這些特性使C++在某些地方顯得過于復(fù)雜。</p><p> Java語言首先便假定了我
5、們只希望進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。也就是說,正式用它設(shè)計(jì)之前,必須先將自己的思想轉(zhuǎn)入一個(gè)面向?qū)ο蟮氖澜纾ǔ窃缫蚜?xí)慣了這個(gè)世界的思維方式)。只有做好這個(gè)準(zhǔn)備工作,與其他OOP語言相比,才能體會(huì)到Java的易學(xué)易用。在本章,我們將探討Java程序的基本組件,并體會(huì)為什么說Java乃至Java程序內(nèi)的一切都是對(duì)象。</p><p> 1.1 用句柄操縱對(duì)象</p><p> 每種編程語言都有
6、自己的數(shù)據(jù)處理方式。有些時(shí)候,程序員必須時(shí)刻留意準(zhǔn)備處理的是什么類型。您曾利用一些特殊語法直接操作過對(duì)象,或處理過一些間接表示的對(duì)象嗎(C或C++里的指針)?</p><p> 所有這些在Java里都得到了簡化,任何東西都可看作對(duì)象,。因此,我們可采用一種統(tǒng)一的語法,任何地方均可照搬不誤。但要注意,盡管一切都“看作”對(duì)象,但操縱的標(biāo)識(shí)符實(shí)際是指向一個(gè)對(duì)象的“句柄”(Handle)。在其他Java參考書里,還可看
7、到有的人將其稱作一個(gè)“引用”,甚至一個(gè)“指針”??蓪⑦@一情形想象成用遙控板(句柄)操縱電視機(jī)(對(duì)象)。只要握住這個(gè)遙控板,就相當(dāng)于掌握了與電視機(jī)連接的通道。但一旦需要“換頻道”或者“關(guān)小聲音”,我們實(shí)際操縱的是遙控板(句柄),再有遙控板自己操縱電視機(jī)(對(duì)象)。如果要在房間里四處走走,并想保持對(duì)電視機(jī)的控制,那么手上拿著的是遙控板,而非電視機(jī)。</p><p> 此外,即使沒有電視機(jī),遙控板亦可獨(dú)立存在。也就是說
8、,只是由于擁有一個(gè)句柄,并不表示必須有一個(gè)對(duì)象同它連接。所以如果想容納一個(gè)詞或句子,可創(chuàng)建一個(gè)String句柄:</p><p><b> String s;</b></p><p> 但這里創(chuàng)建的只是句柄,并不是對(duì)象。若此時(shí)向s發(fā)送一條消息,就會(huì)獲得一個(gè)錯(cuò)誤(運(yùn)行期)。</p><p> 這是由于s實(shí)際并未與任何東西連接(即“沒有電視機(jī)
9、”)。因此,一種更安全的做法是:創(chuàng)建一個(gè)句柄時(shí),記住無論如何都進(jìn)行初始化:</p><p> String s = “zyp”;</p><p> 然而,這里用到了Java語言的一個(gè)特性:字串可以用加引號(hào)的文本初始化。通常,必須為對(duì)象使用一種更通用的初始化方法。</p><p> 1.2 有對(duì)象都必須創(chuàng)建</p><p> 創(chuàng)建句柄時(shí)
10、,我們希望它用一個(gè)新對(duì)象連接。通常用new關(guān)鍵字達(dá)到這一目標(biāo)。New的意思是:“把我變成這些對(duì)象的一種新類型”。所以在上面的例子中,可以說:</p><p> String s = new String(“asdf”);</p><p> 它不僅指出“給我一個(gè)新的字符串”,也通過提供一個(gè)初始字符串,指出了“如何生成這個(gè)新字串”。</p><p> 當(dāng)然,字串(
11、String)并非唯一的類型。Java配套提供了數(shù)量眾多的現(xiàn)成類型。對(duì)我們來講,最重要的就是記住能自行創(chuàng)建類型。事實(shí)上,這應(yīng)是Java程序設(shè)計(jì)的一項(xiàng)基本操作,是繼續(xù)本書后余部分學(xué)習(xí)的基礎(chǔ)。</p><p> 1.2.1 存儲(chǔ)到什么地方</p><p> 程序運(yùn)行時(shí),我們最好對(duì)數(shù)據(jù)保存到什么地方做到心中有數(shù)。特別要注意的是內(nèi)存的分配。有六個(gè)地方都可以保存數(shù)據(jù):</p>&l
12、t;p> (1)寄存器。這是最快的保存區(qū)域,因?yàn)樗挥诓煌谄渌鎯?chǔ)區(qū)的地方——處理器內(nèi)部。然而,寄存器的數(shù)量十分有限,所以寄存器是根據(jù)需要由編譯器分配。我們對(duì)此沒有直接的控制權(quán),也不可能在自己的程序里找到寄存器存在的任何蹤跡(另一方面,C和C++允許您向編譯器建議寄存器的分配方式)。</p><p> ?。?)堆棧。駐留于常規(guī)RAM(隨機(jī)訪問存儲(chǔ)器)區(qū)域,但可通過它的“堆棧指針”獲得處理的直接支持。堆棧
13、指針若向下移,會(huì)創(chuàng)建新的內(nèi)存;若向上移,則會(huì)釋放那些內(nèi)存。這是一種特別快、特別有效的數(shù)據(jù)保存方式,僅次于寄存器。創(chuàng)建程序時(shí),Java編譯器必須準(zhǔn)確地知道堆棧內(nèi)保存的所有數(shù)據(jù)的“長度”以及“存在時(shí)間”。這是由于它必須生成相應(yīng)的代碼,以便向上和向下移動(dòng)指針。這一限制無疑影響了程序的靈活性,所以盡管有些Java數(shù)據(jù)要保存在堆棧里——特別是對(duì)象句柄,但Java對(duì)象并不存儲(chǔ)于其中。</p><p> ?。?)堆。一種通用的
14、內(nèi)存池(也在RAM區(qū)域),用于存放所有的Java對(duì)象。和堆棧不同,“內(nèi)存堆”或“堆”(Heap)最吸引人的地方在于編譯器不必知道要從堆里分配多少存儲(chǔ)空間,也不必知道存儲(chǔ)的數(shù)據(jù)要在堆里停留多長時(shí)間。因此,用堆保存數(shù)據(jù)時(shí)會(huì)得到更大的靈活性。要求創(chuàng)建一個(gè)對(duì)象時(shí),只需要用new命令編制相關(guān)的代碼即可。執(zhí)行這些代碼時(shí),會(huì)在堆里自動(dòng)進(jìn)行數(shù)據(jù)的保存。當(dāng)然,為達(dá)到這種靈活性,必然付出一定的代價(jià):在堆里分配存儲(chǔ)空間時(shí)會(huì)花掉更長的時(shí)間(如果確實(shí)可以在Jav
15、a中像在C++中一樣在棧中創(chuàng)建對(duì)象)。</p><p> ?。?)常量存儲(chǔ)。常數(shù)值通常直接置于程序代碼內(nèi)部。這樣做是安全的,因?yàn)樗麄冇肋h(yuǎn)都不會(huì)改變。有的常數(shù)需要嚴(yán)格地保護(hù),所以可考慮將他們置入只讀存儲(chǔ)器(ROM)。</p><p> ?。?)非RAM存儲(chǔ)。若數(shù)據(jù)完全獨(dú)立于一個(gè)程序之外,則程序不運(yùn)行時(shí)仍可存在,并在程序的控制范圍之外。其中兩個(gè)最重要的例子便是“流式對(duì)象”和“持久化對(duì)象”。對(duì)于
16、流式對(duì)象,對(duì)象會(huì)轉(zhuǎn)化成字節(jié)流,通常會(huì)發(fā)給另一臺(tái)機(jī)器。而對(duì)于持久化對(duì)象,對(duì)象保存在磁盤中。即使程序中止運(yùn)行,他們?nèi)钥杀3肿约旱臓顟B(tài)不變。對(duì)于這些類型的數(shù)據(jù)存儲(chǔ),一個(gè)特別有用的技巧就是它們能存在于其他媒體中。一旦需要,甚至能將他們恢復(fù)成普通的、基于RAM的對(duì)象。Java 提供了對(duì)輕量級(jí)持久化的支持,而諸如JDBC和Hibernate這樣的機(jī)制提供了更加復(fù)雜的對(duì)數(shù)據(jù)庫中存儲(chǔ)和讀取對(duì)象信息的支持。</p><p> 1
17、.2.2 特例:基本類型</p><p> 在程序設(shè)計(jì)中經(jīng)常用到一系列類型,他們需要特殊對(duì)待??梢园阉麄兿胂癯伞盎尽鳖愋汀V蕴厥鈱?duì)待,是因?yàn)閚ew將對(duì)象存儲(chǔ)在“堆”里,故用new創(chuàng)建一個(gè)對(duì)象——特別是小的、簡單的變量,往往不是很有效。因此,對(duì)于這些類型,Java采取與C和C++相同的方法。也就是說,不用new來創(chuàng)建變量,而是創(chuàng)建一個(gè)并非是引用的“自動(dòng)”變量。這個(gè)變量直接存儲(chǔ)“值”,并置于堆棧中,因此更加高
18、效。</p><p> Java要確定每種基本類型所占存儲(chǔ)空間的大小。他們的大小并不像其他大多數(shù)語言那樣隨機(jī)器硬件架構(gòu)的變化而變化。這種所占存儲(chǔ)空間大小的不變性是Java程序比用其他大多數(shù)語言編寫的程序更具可移植性的原因。所有數(shù)值類型都有正負(fù)號(hào),所以不要去尋找無符號(hào)的數(shù)值類型。Boolean類型所占存儲(chǔ)空間的大小沒有明確指定,僅定義為能夠取字面值true或false?;绢愋途哂械陌b器類,使得可以在堆中創(chuàng)建一
19、個(gè)非基本對(duì)象,用來表示對(duì)應(yīng)的基本類型。例如:</p><p> Char c = ‘x’;</p><p> Character ch = new Character(c);</p><p><b> 也可以這樣用:</b></p><p> Character ch = new Character(‘x’);&
20、lt;/p><p> 包裝基本類型的原因?qū)⒃谝院蟮恼鹿?jié)中說明。</p><p><b> 高精度數(shù)字</b></p><p> Java提供了兩個(gè)用于高精度計(jì)算的類:BigInteger 或 BigDecimal。雖然它們大體上屬于“包裝器類”的范疇,但二者都沒有對(duì)應(yīng)的基本類型。</p><p> 不過,這兩個(gè)類包含
21、的方法,提供的操作與對(duì)基本類型所能執(zhí)行的操作相識(shí)。也就是說,能作用于int或float的操作,也能作用于BigInteger或Big Decimal。</p><p> 只不過必須以方法調(diào)用方式取代運(yùn)算符方式來實(shí)現(xiàn)。由于這么做復(fù)雜了許多,所以運(yùn)算速度會(huì)比較慢。在這里,我們以速度換取了精度。</p><p> BigInteger支持任意精度的整數(shù)。也就是說,在運(yùn)算中,可以準(zhǔn)確地表示任何
22、大小的整數(shù)值,而不會(huì)丟失任何信息。</p><p> BigDecimal支持任何精度的定點(diǎn)數(shù),例如,可以用它進(jìn)行精確的貨幣計(jì)算。</p><p> 關(guān)于調(diào)用這兩個(gè)類的構(gòu)造器和方法的詳細(xì)信息,請(qǐng)查閱JDK文檔。</p><p> 1.2.2 Java中的數(shù)組</p><p> 幾乎所有的程序設(shè)計(jì)語言都支持?jǐn)?shù)組。在C和C++中使用數(shù)組是
23、很危險(xiǎn)的,因?yàn)镃和C++中的數(shù)組就是內(nèi)存塊。如果一個(gè)程序要訪問其自身內(nèi)存塊之外的數(shù)組,或在數(shù)組初始化前使用內(nèi)存(程序中常見的錯(cuò)誤),都會(huì)產(chǎn)生難以預(yù)料的后果。</p><p> Java的主要目標(biāo)之一是安全性,所以許多在C和C++里困擾程序員的問題在Java里不會(huì)再出現(xiàn)呢。Java確保數(shù)組會(huì)被初始化,而且不能在它的范圍之外被訪問。這種范圍檢查,是以每個(gè)數(shù)組上少量的內(nèi)存開銷及運(yùn)行時(shí)的下標(biāo)檢查為代價(jià)的。但由此換來的是
24、安全性和效率的提高,因此付出的代價(jià)是值得的(并且Java有時(shí)可以優(yōu)化這些操作)。</p><p> 當(dāng)創(chuàng)建一個(gè)數(shù)組對(duì)象時(shí),實(shí)際上就是創(chuàng)建了一個(gè)引用數(shù)組,并且每個(gè)引用都會(huì)自動(dòng)初始化為一個(gè)特定值,該值擁有自己的關(guān)鍵字null。一旦Java看到null,就知道這個(gè)引用還沒有指向某個(gè)對(duì)象。在使用任何引用前,必須為其指定一個(gè)對(duì)象;如果試圖使用一個(gè)還是null的引用,在運(yùn)行時(shí)將會(huì)報(bào)錯(cuò)。因此,常犯的數(shù)組錯(cuò)誤在Java中就可以
25、避免。</p><p> 還可以創(chuàng)建用來存放基本數(shù)據(jù)類型的數(shù)組。同樣,編譯器也能確保這種數(shù)組的初始化,因?yàn)樗鼤?huì)將這種數(shù)組所占的內(nèi)存全部置零。</p><p> 數(shù)組將在以后的章節(jié)中詳細(xì)討論。</p><p> 1.3永遠(yuǎn)不需要銷毀對(duì)象</p><p> 在大多數(shù)程序設(shè)計(jì)語言中,變量生命周期的概念,占據(jù)了程序設(shè)計(jì)工作中非常重要的部分。變
26、量需要存活多長時(shí)間?如果想要銷毀對(duì)象,那什么時(shí)刻進(jìn)行呢?變量生命周期的混亂往往會(huì)導(dǎo)致大量的程序bug,本節(jié)將介紹Java是怎樣替我們完成所有的清理工作,從而大大簡化這個(gè)問題的。</p><p><b> 1.3.1 作用域</b></p><p> 大多數(shù)過程型語言都有作用域(scope)的概念。作用域決定了在其內(nèi)定義的變量名的可見性和生命周期。在C、C++和Ja
27、va中,作用域由花括號(hào)的位置決定。例如:</p><p><b> {</b></p><p> int x = 12; //Only x available</p><p><b> {</b></p><p> int q = 96; //both x & q availabl
28、e</p><p><b> }</b></p><p> //only x available</p><p> //q is “out of scope”</p><p><b> }</b></p><p> 在作用域里定義的變量只可用于作用域結(jié)束之前。<
29、;/p><p> 任何位于“//”之后到行末的文字都是注釋。</p><p> 縮排格式使Java代碼更易于閱讀。由于Java是一種自由格式(free-form)的語言,所以,空格、制表符、換行都不會(huì)影響程序的執(zhí)行結(jié)果。</p><p> 盡管以下代碼在C和C++中是合法的,但是在Java中卻不能這樣寫:</p><p><b>
30、 ?。?lt;/b></p><p> int x = 12;</p><p><b> {</b></p><p> int x = 96; //illegal</p><p><b> }</b></p><p><b> }</b>
31、</p><p> 編譯器將會(huì)報(bào)告變量x已經(jīng)定義過。所以,在C和C++里將一個(gè)較大作用域的變量“隱藏”起來的做法,在Java里是不允許的。因?yàn)镴ava設(shè)計(jì)者認(rèn)為這樣做會(huì)導(dǎo)致程序混亂。</p><p> 1.3.2 對(duì)象的作用域</p><p> Java對(duì)象不具備和基本類型一樣的生命周期。當(dāng)用new創(chuàng)建一個(gè)Java對(duì)象時(shí),它可以存活于作用域之外。所以假如你采
32、用代碼</p><p><b> ?。?lt;/b></p><p> String s = new String(“a string”);</p><p> // End of scope</p><p><b> ?。?lt;/b></p><p> 引用s在作用域終點(diǎn)就消失了
33、。然而,s指向的String對(duì)象仍繼續(xù)占據(jù)內(nèi)存空間。在這一</p><p> 小段代碼中,我們無法在這個(gè)作用域之后訪問這個(gè)對(duì)象,因?yàn)閷?duì)它唯一的引用已超出了作用域的范圍。在后繼章節(jié)中,讀者將會(huì)看到:在程序執(zhí)行過程中,怎樣傳遞和復(fù)制引用。</p><p> 事實(shí)證明,由new創(chuàng)建的對(duì)象,只要你需要,就會(huì)一直保留下去。這樣,許多C++編程問題在Java中就完全消失了。在C++中,你不僅必須要
34、確保對(duì)象的保留時(shí)間與你需要這些對(duì)象的時(shí)間一樣長,而且還必須在你使用完它們之后,將其銷毀。</p><p> 這樣便帶來一個(gè)有趣的問題。如果Java讓對(duì)象繼續(xù)存在,那么靠什么才能防止這些對(duì)象填滿內(nèi)存空間,進(jìn)而阻塞你的程序呢?這正是C++里可能會(huì)發(fā)生的問題。這也是Java神奇之所在。Java有一個(gè)垃圾回收器,用來監(jiān)視用new創(chuàng)建的所有對(duì)象,并辨別那些不會(huì)再被引用的對(duì)象。隨后,釋放這些對(duì)象的內(nèi)存空間,以便供其他新的對(duì)
35、象使用。也就是說,你根本不必?fù)?dān)心內(nèi)存回收的問題。你只需要?jiǎng)?chuàng)建對(duì)象,一旦不再需要,他們就會(huì)自行消失。這樣做就消除了這類編程問題(即“內(nèi)存泄漏”),</p><p> 這是由于程序員忘記釋放內(nèi)存而產(chǎn)生的問題。</p><p> 1.4 創(chuàng)建新的數(shù)據(jù)類型:類</p><p> 如果一切都是對(duì)象,那么是什么決定了某一類對(duì)象的外觀與行為呢?換句話說,是什么確定了對(duì)象的類
36、型?你可能期望有一個(gè)名為“type”的關(guān)鍵字,當(dāng)然它必須還要有相應(yīng)的含義。然而,從歷史發(fā)展角度來看,大多數(shù)面向?qū)ο蟮某绦蛟O(shè)計(jì)語言習(xí)慣用關(guān)鍵字class來表示“我準(zhǔn)備告訴你一種新類型的對(duì)象看起來像什么樣子”。class這個(gè)關(guān)鍵字(以后會(huì)頻繁使用,本書以后就不再用粗體字表示)之后緊跟著的是新類型的名稱。例如:</p><p> class ATypeName {/*Class body goes here*/}&l
37、t;/p><p> 這就引入了一種新的類型,盡管類主體僅包含一條注釋語句(星號(hào)和斜杠以及其中的內(nèi)容就是注釋,本章后面再討論)。因此,你還不能用它做太多的事情。然而,你已經(jīng)可以用new來創(chuàng)建這種類型的對(duì)象。</p><p> ATypeName a = new ATypeName();</p><p> 但是,在定義它的所有方法之前,還沒有辦法能讓它去做更多的事情(
38、也就是說,不能向它發(fā)送任何有意義的消息)。</p><p> 1.4.1 字段和方法</p><p> 一旦定義了一個(gè)類(在Java中你所做的全部工作就是定義類,產(chǎn)生那些類的對(duì)象,以及發(fā)送消息給這些對(duì)象),就可以在類中設(shè)置兩種類型的元素:字段(有時(shí)被稱作數(shù)據(jù)成員)和方法(有時(shí)被稱作成員函數(shù))。字段可以是任何類型的對(duì)象,可以通過其引用與其進(jìn)行通信;也可以是基本類型中的一種。如果字段是對(duì)
39、某個(gè)對(duì)象的引用,那么必須初始化該引用,以便使其與一個(gè)實(shí)際的對(duì)象(如前所述,使用new來實(shí)現(xiàn))相關(guān)聯(lián)。</p><p> 每個(gè)對(duì)象都有用來存儲(chǔ)其字段的空間;普通字段不能在對(duì)象間共享。下面是一個(gè)具有某</p><p><b> 些字段的類:</b></p><p> Class DataOnly{</p><p>&l
40、t;b> int i;</b></p><p><b> double d;</b></p><p> Boolean b;</p><p><b> }</b></p><p> 盡管這個(gè)類除了存儲(chǔ)數(shù)據(jù)之外什么也不能做,但是仍舊可以像下面這樣創(chuàng)建它的一個(gè)對(duì)象;</
41、p><p> DataOnly data = new DataOnly();</p><p> 可以給字段賦值,但首先必須知道如何引用一個(gè)對(duì)象的成員。具體的實(shí)現(xiàn)為:在對(duì)象引用的名稱之后緊接著一個(gè)句點(diǎn),然后再接著是對(duì)象內(nèi)部的成員名稱:</p><p> objectReference.menber</p><p><b> 例如:
42、</b></p><p> data.i = 47;</p><p> data.d = 1.1;</p><p> data.b = false;</p><p> 想修改的數(shù)據(jù)也有可能位于對(duì)象所包含的其他對(duì)象中。在這種情況下,只需要再使用連接句點(diǎn)即可。例如:</p><p> MyPlane.
43、leftTank.capacity = 100;</p><p> DataOnly類除了保存數(shù)據(jù)外沒別的用處,因?yàn)樗鼪]有任何成員方法。如果想了解成員方法的運(yùn)行機(jī)制,就得先了解參數(shù)和返回值的概念,稍后將對(duì)此作簡略描述。</p><p><b> 基本成員默認(rèn)值</b></p><p> 若累的某個(gè)成員是基本數(shù)據(jù)類型,即使沒有進(jìn)行初始化,J
44、ava也會(huì)確保它獲得一個(gè)默認(rèn)值,當(dāng)變量作為類的成員使用時(shí),Java才確保給定其默認(rèn)值,以確保那些是基本類型的成員變量得到初始化(C++沒有此功能),防止產(chǎn)生程序錯(cuò)誤。但是,這些初始值對(duì)你的程序來說,可能是不正確的,甚至是不合法的。所以最好明確地對(duì)變量進(jìn)行初始化。</p><p> 然而上述確保初始化的方法并不適用于“局部”變量(即非某個(gè)類的字段)。因此如果在某個(gè)方法定義中有</p><p&g
45、t;<b> int x; </b></p><p> 那么變量x得到的可能是任意值(與C和C++中一樣),而不會(huì)被自動(dòng)初始化為零。所以在使用x前,應(yīng)先對(duì)其賦一個(gè)適當(dāng)?shù)闹?。如果忘記了這么做,Java會(huì)在編譯時(shí)返回一個(gè)錯(cuò)誤。告訴你此變量沒有初始化,這正是Java優(yōu)于C++的地方。(許多C++編譯器會(huì)對(duì)未初始化變</p><p> 量給予警告,而Java則視為是錯(cuò)誤
46、)。</p><p> 1.5 方法、參數(shù)和返回值</p><p> 許多程序設(shè)計(jì)語言(像C和C++)用函數(shù)這個(gè)術(shù)語來描述命名子程序;而在Java里卻常用方法這個(gè)術(shù)語來表示“做某些事情的方式”。實(shí)際上,繼續(xù)把它看作是函數(shù)也無妨。盡管這只是用詞上的差別,但本書將沿用Java的慣用法,即用術(shù)語“方法”而不是“函數(shù)”來描述。</p><p> Java的方法決定了一
47、個(gè)對(duì)象能夠接收什么樣的消息。方法的基本組成部分包括:名稱、參數(shù)、返回值和方法體。下面是它最基本的形式:</p><p> ReturnType methodName(/*Argument list*/){</p><p> /* Method body*/</p><p><b> }</b></p><p>
48、返回類型描述的是在調(diào)用方法之后從方法返回的值。參數(shù)列表給出了要傳遞方法的信息的類型和名稱。方法名和參數(shù)列表(它們合起來被稱為“方法簽名”)唯一地標(biāo)識(shí)出某個(gè)方法。</p><p> Java中的方法只能作為類的一部分來創(chuàng)建。方法只有通過對(duì)象才能被調(diào)用,且這個(gè)對(duì)象必須能執(zhí)行這個(gè)方法調(diào)用。如果試圖在某個(gè)對(duì)象上調(diào)用它并不具備的方法,那么在編譯時(shí)就會(huì)得到一條錯(cuò)誤消息。通過對(duì)象調(diào)用方法時(shí),需要先列出對(duì)象名,緊接著句點(diǎn),然后
49、是方法名和參數(shù)列表。如:</p><p> objectName.methodName(arg1,arg2,arg3);</p><p> 例如,假設(shè)有一個(gè)方法f(),不帶任何參數(shù),返回類型是int。如果有個(gè)名為a 的對(duì)象,可以通過它調(diào)用f(),那么就可以這樣寫:</p><p> int x = a.f();</p><p> 返回
50、值的類型必須要與x的類型兼容。</p><p> 這種調(diào)用方法的行為通常被稱為發(fā)送消息給對(duì)象。在上面的例子中,消息是f(),對(duì)象是a。面向?qū)ο蟮某绦蛟O(shè)計(jì)通常簡單地歸納為“向?qū)ο蟀l(fā)送消息”。</p><p> 1.5.1 參數(shù)列表</p><p> 方法的參數(shù)列表指定要傳遞給方法什么樣的信息。正如你可能料想的那樣,這些信息像Java中的其他信息一樣,采用的都是
51、對(duì)象形式。因此,在參數(shù)列表中必須指定每個(gè)所傳遞對(duì)象的類型及名字。像Java中任何傳遞對(duì)象的場合一樣,這里傳遞的實(shí)際上也是引用,并且引用類型必須正確。如果參數(shù)被設(shè)為String類型,則必須傳遞一個(gè)String對(duì)象;否則,編譯器將拋出錯(cuò)誤。</p><p> 假設(shè)某個(gè)方法接受String為其參數(shù),下面是其具體定義,它必須置于某個(gè)類的定義內(nèi)才能被正確編譯。</p><p> Int stor
52、age(String s){</p><p> Return s.length()*2;</p><p><b> }</b></p><p> 此方法告訴你,需要多少個(gè)字節(jié)才能容納一個(gè)特定的String對(duì)象中的信息(字符串的每個(gè)字符的尺寸都是16位或2個(gè)字節(jié),以此來提供對(duì)Unicode字符集的支持)。此方法的參數(shù)類型是String,參數(shù)
53、名是s。一旦將s傳遞給此方法,就可以把他當(dāng)作其他對(duì)象一樣進(jìn)行處理(可以給它傳遞消息)。在這里,s的length()方法被調(diào)用,它是String類提供的方法之一,會(huì)返回字符串 包含的字符數(shù)。</p><p> 通過上面的例子,還可以了解到return關(guān)鍵字的用法,它包括兩方面:首先,它代表“已經(jīng)做完,離開此方法”。其次,如果此方法產(chǎn)生一個(gè)值,這個(gè)值要放在return語句后面。在這個(gè)例子中,返回值是通過計(jì)算s.le
54、ngth()*2這個(gè)表達(dá)式得到的。</p><p> 你可以定義方法返回任意想要的類型,如果不想返回任何值,可以指示此方法返回void(空)。下面是一些例子:</p><p> boolean flag(){return true;}</p><p> double naturalLogBase(){return 2.178;}</p><
55、p> void nothing(){return;}</p><p> void nothing2(){}</p><p> 若返回類型是void,return關(guān)鍵字的作用只是用來推出方法。因此,沒有必要到方法結(jié)束時(shí)才離開,可在任何地方返回。但如果返回類型不是void,那么無論在何處返回,編譯器都會(huì)強(qiáng)制返回一個(gè)正確類型的返回值。</p><p> 到此
56、為止,讀者或許覺得:程序視乎只是一系列帶有方法的對(duì)象組合,這些方法以其他對(duì)象為參數(shù),并發(fā)送消息給其他對(duì)象。大體上確實(shí)是這樣,但在以后章節(jié)中,讀者將會(huì)學(xué)到怎樣在一個(gè)方法內(nèi)進(jìn)行判斷,做一些更細(xì)致的底層工作。至于本章,讀者只需要理解消息發(fā)送就足夠了。</p><p><b> 附件2:外文原文</b></p><p> Everything Is an Object&l
57、t;/p><p> “If we spoke a different language, we would perceive a some what different world.” Ludwig Wittgenstein (1889-1951)Although it is based on C++, Java is more of a “pure” object-oriented language.</p
58、><p> Both C++ and Java are hybrid languages, but in Java the designers felt that the hybridization was not as important as it was in C++. A hybrid language allows multiple programming styles; the reason C++ i
59、s hybrid is to support backward compatibility with the C language. Because C++ is a superset of the C language, it includes many of that language’s undesirable features, which can make some aspects of C++ overly complica
60、ted.</p><p> The Java language assumes that you want to do only object-oriented programming. This means that before you can begin you must shift your mindset into an object-oriented world (unless it’s alrea
61、dy there). The benefit of this initial effort is the ability to program in a language that is simpler to learn and to use than many other OOP languages. In this chapter you’ll see the basic components of a Java program a
62、nd learn that (almost) everything in Java is an object.</p><p> You manipulate objects with references</p><p> Each programming language has its own means of manipulating elements in memory. S
63、ometimes the programmer must be constantly aware of what type of manipulation is going on. Are you manipulating the element directly, or are you dealing with some kind of indirect representation (a pointer in C or C++) t
64、hat must be treated with a special syntax?</p><p> All this is simplified in Java. You treat everything as an object, using a single consistent syntax. Although you treat everything as an object, the identi
65、fier you manipulate is actually a “reference” to an object. You might imagine a television (the object) and a remote control 1(the reference). As long as you’re holding this reference, you have a connection to the telev
66、ision, but when someone says, “Change the channel” or “Lower the volume,” what you’re manipulating is the reference, which in</p><p> Also, the remote control can stand on its own, with no television. That
67、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:</p><p> But here you’ve created on
68、ly the reference, not an object. If you decided to send a message to s at this point, you’ll get an error because s isn’t actually attached to anything (there’s no television). A safer practice, then, is always to initia
69、lize a reference when you create it:String s = "asdf";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 obj
70、ects.</p><p> You must create all the objects</p><p> When you create a reference, you want to connect it with a new object. You do so, in general, with the new operator. The keyword new says,
71、 “Make me a new one of these objects.” So in the preceding example, you can say:String s = new String("asdf");Not only does this mean “Make me a new String,” but it also gives information about how to make the
72、String by supplying an initial character string.</p><p> Of course, Java comes with a plethora of ready-made types in addition to String. What’s more important is that you can create your own types. In fact
73、, creating new types is the fundamental activity in Java programming, and it’s what you’ll be learning about in the rest of this book..</p><p> Where storage lives</p><p> It’s useful to visua
74、lize some aspects of how things are laid out while the program is running—in particular how memory is arranged. There are five different places to store data:</p><p> 1. Registers. This is the fastest stor
75、age because it exists in a place different from that of other storage: inside the processor. However, the number of registers is severely limited, so registers are allocated as they are needed. You don’t have direct cont
76、rol, nor do you see any evidence in your programs that registers even exist (C & C++, on the other hand, allow you to suggest register allocation to the compiler).</p><p> 2. The stack. This lives in t
77、he general random-access memory (RAM) area, but has direct support from the processor via its stack pointer. The stack pointer is moved down to create new memory and moved up to release that memory. This is an extremely
78、fast and efficient way to allocate storage, second only to registers. The Java system must know, while it is creating the program, the exact lifetime of all the items that are stored on the stack. This constraint places
79、limits on the flexibility of y</p><p> Special case: primitive types</p><p> One group of types, which you’ll use quite often in your programming, gets special treatment. You can think of thes
80、e as “primitive” types. The reason for the special treatment is that to create an object with new—especially a small, simple variable—isn’t very efficient, because new places objects on the heap. For these types Java fal
81、ls back on the approach taken by C and C++. That is, instead of creating the variable by using new, an “automatic” variable is created that is not a reference. The v</p><p> Java determines the size of each
82、 primitive type. These sizes don’t change from one machine architecture to another as they do in most languages. This size invariance is one reason Java programs are more portable than programs in most other languages.Al
83、l numeric types are signed, so don’t look for unsigned types.The size of the boolean type is not explicitly specified; it is only defined to be able to take the literal values true or false.The “wrapper” classes for the
84、primitive data types allow y</p><p> char c = ‘x’;</p><p> Character ch = new Character(c);</p><p> Or you could also use:</p><p> Character ch = new Character(‘x’)
85、;</p><p> Java SE5 autoboxing will automatically convert from a primitive to a wrapper type:</p><p> Character ch = ‘x’;</p><p> and back:char c = ch;</p><p> The r
86、easons for wrapping primitives will be shown in a later chapter.</p><p> High-precision numbers</p><p> Java includes two classes for performing high-precision arithmetic: BigInteger and BigDe
87、cimal. Although these approximately fit into the same category as the “wrapper” classes, neither one has a primitive analogue.Both classes have methods that provide analogues for the operations that you perform on primit
88、ive types. That is, you can do anything with a BigInteger or BigDecimal that you can with an int or float, it’s just that you must use method calls instead of operators. Also, since there’s mo</p><p> BigIn
89、teger supports arbitrary-precision integers. This means that you can accurately represent integral values of any size without losing any information during operations.</p><p> BigDecimal is for arbitrary-pr
90、ecision fixed-point numbers; you can use these for accurate monetary calculations, for example.</p><p> Consult the JDK documentation for details about the constructors and methods you can call for these tw
91、o classes.</p><p> Arrays in Java</p><p> Virtually all programming languages support some kind of arrays. Using arrays in C and C++ is perilous because those arrays are only blocks of memory.
92、 If a program accesses the array outside of its memory block or uses the memory before initialization (common programming errors), there will be unpredictable results.</p><p> One of the primary goals of Ja
93、va is safety, so many of the problems that plague programmers in C and C++ are not repeated in Java. A Java array is guaranteed to be initialized and cannot Thinking in Java be accessed outside of its range. The range
94、checking comes at the price of having a small amount of memory overhead on each array as well as verifying the index at run time, but the assumption is that the safety and increased productivity are worth the expense (an
95、d Java can sometimes optimize </p><p> When you create an array of objects, you are really creating an array of references, and each of those references is automatically initialized to a special value with
96、its own keyword: null. When Java sees null, it recognizes that the reference in question isn’t pointing to an object. You must assign an object to each reference before you use it, and if you try to use a reference that’
97、s still null, the problem will be reported at run time. Thus, typical array errors are prevented in Java.</p><p> You can also create an array of primitives. Again, the compiler guarantees initialization be
98、cause it zeroes the memory for that array.Arrays will be covered in detail in later chapters.</p><p> You never need todestroy an object</p><p> In most programming languages, the concept of t
99、he lifetime of a variable occupies a significant portion of the programming effort. How long does the variable last? If you are supposed to destroy it, when should you? Confusion over variable lifetimes can lead to a lot
100、 of bugs, and this section shows how Java greatly simplifies the issue by doing all the cleanup work for you.</p><p><b> Scoping</b></p><p> Most procedural languages have the conc
101、ept of scope. This determines both the visibility and lifetime of the names defined within that scope. In C, C++, and Java, scope is determined by the placement of curly braces {}. So for example:</p><p><
102、;b> {</b></p><p> int x = 12;// Only x available{</p><p> int q = 96;// Both x & q available</p><p> }// Only x available// q is "out of scope"</p>
103、<p><b> }</b></p><p> A variable defined within a scope is available only to the end of that scope.Any text after a ‘//’ to the end of a line is a comment.Indentation makes Java code easi
104、er to read. Since Java is a free-form language, the extra spaces, tabs, and carriage returns do not affect the resulting program.You cannot do the following, even though it is legal in C and C++:{</p><p> i
105、nt x = 12;</p><p> {int x = 96; // Illegal}}The compiler will announce that the variable x has already been defined. Thus the C and C++ ability to “hide” a variable in a larger scop e is not allowed, becaus
106、e the Java designers thought that it led to confusing programs.</p><p> Scope of objects</p><p> Java objects do not have the same lifetimes as primitives. When you create a Java object using
107、new, it hangs around past the end of the scope. Thus if you use:{String s = new String("a string");} // End of scopethe reference s vanishes at the end of the scope. However, the String object that s was pointi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 這里一切都是藍(lán)調(diào)的
- 計(jì)算機(jī)專業(yè)畢業(yè)設(shè)計(jì)文獻(xiàn)翻譯--一切都是對(duì)象
- 醫(yī)院醫(yī)技部主任“優(yōu)秀共產(chǎn)黨員”事跡材料-一切都是為了患者
- 心情好一切都好
- 一切都還來的及
- 一切行業(yè)都是旅游業(yè)
- 大班主題活動(dòng)《一切都在變》
- 慢慢來,一切都來得及
- 一切生物都是由細(xì)胞組成的
- 責(zé)任決定一切勝于一切
- 略帶傷感的qq說說 當(dāng)一切都已成風(fēng)
- 對(duì)“一切歷史都是當(dāng)代史”的分析與批評(píng)
- 未來一切營銷的努力,都是為了圈粉絲
- 一切想著人民一切為人民.
- “這一切都會(huì)過去”——所羅門王侍衛(wèi)長的故事
- 預(yù)備黨員思想?yún)R報(bào):一切挫折都是“紙老虎”
- 如果我能再活一次,一切都會(huì)不一樣
- 一切為了學(xué)生,為了學(xué)生的一切
- 中產(chǎn)社會(huì)誕生的序曲《一切都好》的時(shí)代內(nèi)涵與現(xiàn)實(shí)啟示
評(píng)論
0/150
提交評(píng)論