【正文】
rn ()*2。因此,在參數(shù)列表中必須指定每個(gè)所傳遞對(duì)象的類型及名字。在上面的例子中,消息是 f(),對(duì)象是 a。 例如 ,假設(shè)有一個(gè)方法 f(),不帶任何參數(shù),返回類型是 int。方法只有通過(guò)對(duì)象才能被調(diào)用,且這個(gè)對(duì)象必須能執(zhí)行這個(gè)方法調(diào)用。下面是它最基本的形式: ReturnType methodName(/*Argument list*/){ /* Method body*/ } 返回類型描述的是在調(diào)用方法之后從方法返回的值。實(shí)際上,繼續(xù)把它看作是函數(shù)也無(wú)妨。如果忘記了這么做, Java 會(huì)在編譯時(shí)返回一個(gè)錯(cuò)誤。 然而上述確保初始化的方法并不適用于“局部”變量(即非某個(gè)類的字段)。如果想了解成員方法的運(yùn)行機(jī)制,就得先了解參數(shù)和返回值的概念,稍后將對(duì)此作簡(jiǎn)略描述。 想修改的數(shù)據(jù)也有可能位于對(duì)象所包含的其他對(duì)象中。 可以給字段賦值,但首先必須知道如何引用一個(gè)對(duì)象的成員。下面是一個(gè)具有某 些字段的類: Class DataOnly{ int i。 字段和方法 一旦定義了一個(gè)類(在 Java 中你所做的全部工作就是定義類,產(chǎn)生那些類的對(duì)象,以及發(fā)送消息給這些對(duì)象),就可以在類中設(shè)置兩種類型的元素:字段(有時(shí)被稱作數(shù)據(jù)成員)和方法(有時(shí)被稱作成員函數(shù))。因此,你還不能用它做太多的事情。 創(chuàng)建新的數(shù)據(jù)類型:類 如果一切都是對(duì)象,那么是什么決定了某一類對(duì)象的外觀與行為呢?換句話說(shuō),是什么確定了對(duì)象的類型?你可能期望有一個(gè)名為“ type” 的關(guān)鍵字 ,當(dāng)然它必須還要有相應(yīng) 的含義。隨后,釋放這些對(duì)象的內(nèi)存空間,以便供其他新的對(duì)象使用。 這樣便帶來(lái)一個(gè)有趣的問(wèn)題。在后繼章節(jié)中,讀者將會(huì)看到:在程序執(zhí)行過(guò)程中,怎樣傳遞和復(fù)制引用。所以假如你采用代碼 { String s = new String(“ a string” )。所以,在 C和 C++里將一個(gè)較大作用域的變量“隱藏”起來(lái)的做法,在 Java 里是不允許的。由于 Java 是一種自由格式( freeform)的語(yǔ)言,所以,空格、制表符、換行都不會(huì)影響程序的執(zhí)行結(jié)果。 //both x amp。作用域決定了在其內(nèi)定義的變量名的可見(jiàn)性和生命周期。 數(shù)組將在以后的章節(jié)中詳細(xì)討論。在使用任何引用前,必須為其指定一個(gè)對(duì)象;如果試圖使用一個(gè)還是 null 的引用,在運(yùn)行時(shí)將會(huì)報(bào)錯(cuò)。這種范圍檢查,是以每個(gè)數(shù)組上少量的內(nèi)存開(kāi)銷及運(yùn)行時(shí)的下標(biāo)檢查為代價(jià)的。在 C 和 C++中使用數(shù)組是很危險(xiǎn)的,因?yàn)?C 和C++中的數(shù)組就是內(nèi)存塊。也就是說(shuō),在運(yùn)算中,可以準(zhǔn)確地表示任何大小的整數(shù)值,而不會(huì)丟失任何信息。 只不過(guò)必須以方 法調(diào)用方式取代運(yùn)算符方式來(lái)實(shí)現(xiàn)。 高精度數(shù)字 Java 提供了兩個(gè)用于高精度計(jì)算的類: BigInteger 或 BigDecimal。例如: Char c = ‘ x’ 。這種所占存儲(chǔ)空間大小的不變性是 Java 程序比用其他大多數(shù)語(yǔ)言編寫(xiě)的程序更具可移植性的原因。也就是說(shuō),不用 new 來(lái)創(chuàng)建變量,而是創(chuàng)建一個(gè)并非是引用的“自動(dòng)”變量。 特例:基本 類型 在程序設(shè)計(jì)中經(jīng)常用到一系列類型,他們需要特殊對(duì)待。即使程序中止運(yùn)行,他們?nèi)钥杀3肿约旱臓顟B(tài)不變。若數(shù)據(jù)完全獨(dú)立于一個(gè)程序之外,則程序不運(yùn)行時(shí)仍可存在,并在程序的控制范圍之外。常數(shù)值通常直接置于程序代碼內(nèi)部。要求創(chuàng)建一個(gè)對(duì)象時(shí),只需要用 new 命令編制相關(guān)的代碼即可。 ( 3)堆。這是一種特別快、特別有效的數(shù)據(jù)保存方式,僅次于寄存器。我們對(duì)此沒(méi)有直接的控制權(quán),也不可能在自己的程序里找到寄存器存在的任何蹤跡 (另一方面, C 和C++允許您向編譯器建議寄存器的分配方式) 。特別要注意的是內(nèi)存的分配。 Java 配套提供了數(shù)量 眾 多的現(xiàn)成類型。 New 的意思是:“把我變成這些對(duì)象的一種新類型”。 然而,這里用到了 Java 語(yǔ)言的一個(gè)特性 :字串可以用加引號(hào)的文本 初始化。 但這里創(chuàng)建的只是句柄,并不是對(duì)象。如果要在房間里四處走走,并想保持對(duì)電視機(jī)的控制,那么手上拿著的是遙控板,而非電 視機(jī)。在其他 Java 參考書(shū)里,還可看到有的人將其稱作一個(gè)“引用”,甚至一個(gè)“指針”。有些時(shí)候,程序員必須時(shí)刻留意準(zhǔn)備處理的是什么類型。也就是說(shuō),正式用它設(shè)計(jì)之前,必 須先將自己的思想轉(zhuǎn)入一個(gè)面向?qū)ο蟮氖澜纾ǔ窃缫蚜?xí)慣了這個(gè)世界的思維方式)。但在 Java 中,設(shè)計(jì)者覺(jué)得這種雜合并不像在 C++里那么重要。 畢業(yè)設(shè)計(jì) (論文 )外文資料翻譯 系 : 信息工程學(xué)院 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 姓 名: xxxxxx 學(xué) 號(hào): xxxxxxxxx 外文出處: 附 件: ; 。 無(wú)論 C++還是 Java 都屬于 雜合語(yǔ)言 。 Java 語(yǔ)言首先便假定了我們只希望進(jìn)行面向?qū)ο蟮某绦蛟O(shè)計(jì)。 用 句柄操縱對(duì)象 每種編程語(yǔ)言都有自己的數(shù)據(jù)處理方式。但要注意,盡管一切都“看作”對(duì)象,但操縱的標(biāo)識(shí)符實(shí)際是指向一個(gè)對(duì)象的“句柄”( Handle)。但一旦需要“換頻道”或者“關(guān)小聲音”,我們實(shí)際操縱的是遙控板(句柄),再有遙控板自己操縱電視機(jī)(對(duì)象)。所以如果想容納一個(gè)詞或句子,可創(chuàng)建一個(gè) String 句柄 : String s。因此,一種更安全的做法是:創(chuàng)建一個(gè)句柄時(shí),記住無(wú)論如何都進(jìn)行初始化: String s = “ zyp” 。通常用 new 關(guān)鍵字達(dá)到這一目標(biāo)。 當(dāng)然,字串( String)并非唯一的類型。 存儲(chǔ) 到什么地方 程序運(yùn)行時(shí),我們最好對(duì)數(shù)據(jù)保存到什么地方做到心中有數(shù)。然而,寄存器的數(shù)量十分有限,所以寄存器是根據(jù)需要由編譯器分配。堆棧指針若向下移 , 會(huì)創(chuàng)建新的內(nèi)存;若向上移,則會(huì)釋放那些內(nèi)存。這一限制無(wú)疑影響了程序的靈活性,所以盡管有些Java 數(shù)據(jù)要保存在堆棧里 —— 特別是對(duì)象句柄,但 Java 對(duì)象并不 存儲(chǔ)于 其中。因此,用堆保存數(shù)據(jù)時(shí)會(huì)得到更大的靈活性。 ( 4) 常量 存儲(chǔ)。 ( 5)非 RAM 存儲(chǔ)。而對(duì)于持久化 對(duì)象,對(duì)象保存在磁盤(pán)中。 Java 提 供了對(duì) 輕量級(jí)持久化的支持,而諸如 JDBC 和 Hibernate 這樣的機(jī)制提供了更加復(fù)雜的對(duì)數(shù)據(jù)庫(kù)中存儲(chǔ)和讀取對(duì)象信息的支持。因此,對(duì)于這些類型, Java 采取與 C 和 C++相同的方法。他們的大小并不像其他大多數(shù)語(yǔ)言那樣隨機(jī)器硬件架構(gòu)的變化而變化。基本類型具有的包裝器類,使得可以在堆中創(chuàng)建一個(gè)非基本對(duì)象,用來(lái)表示對(duì)應(yīng)的基本類型。 包裝基本類型的原因?qū)⒃谝院蟮恼鹿?jié)中說(shuō)明。也就是說(shuō),能作用于 int 或 float 的操作,也能作用于 BigInteger 或 Big Decimal。 BigInteger 支持任意精度的整數(shù)。 Java 中的數(shù)組 幾乎所有的程序設(shè)計(jì)語(yǔ)言都支持?jǐn)?shù)組。 Java 確保數(shù)組會(huì)被初始化,而且不能在它的范圍之外被訪問(wèn)。一旦 Java 看到 null,就知道這個(gè)引用還沒(méi)有指向某個(gè)對(duì)象。同樣,編譯器也能確保這種數(shù)組的初始化,因?yàn)樗鼤?huì)將這種數(shù)組所占的內(nèi)存全部置零。 作用域 大多數(shù) 過(guò)程型語(yǔ)言都有作用域( scope)的概念。 //Only x available { int q = 96。 縮排格式使 Java 代碼更易于閱讀。 //illegal } } 編譯器將會(huì)報(bào)告變量 x已經(jīng)定義過(guò)。當(dāng)用 new 創(chuàng)建一個(gè) Java 對(duì)象時(shí),它可以存活于作用域之外。在這一 小段代碼中,我們無(wú)法在這個(gè)作用域之后訪 問(wèn)這個(gè)對(duì)象,因?yàn)?對(duì)它唯一的引用已超出了作用域的范圍。在 C++中,你不僅必須要確保對(duì)象的保留時(shí)間與你需要這些對(duì)象的時(shí)間一樣長(zhǎng),而且還必須在你使用完它們之后,將其銷毀。 Java 有一個(gè)垃圾回收器,用來(lái)監(jiān)視用 new 創(chuàng)建的所有對(duì)象,并辨別那些不會(huì)再被引用的對(duì)象。這樣做就消除了這類編程問(wèn)題(即“內(nèi)存泄漏”), 這是由于程序員忘記釋放內(nèi)存而產(chǎn)生的問(wèn)題。例如: class ATypeName {/*Class body goes here*/} 這就引入了一種新的類型,盡管類主體僅包含一條注釋語(yǔ)句(星號(hào)和斜杠以及其中的內(nèi)容就是注釋,本章后面再討論)。 但是,在定義它的所有方法之前,還沒(méi)有辦法能讓它去做更多的事情(也就是說(shuō),不能向 它發(fā)送任何有意義的消息)。 每個(gè)對(duì)象都有用來(lái)存儲(chǔ)其字段的空間;普通字段不能在對(duì)象間共享。 } 盡管這個(gè)類除了存儲(chǔ)數(shù)據(jù)之外什么也不能做,但是仍舊可以像下面這樣創(chuàng)建它的一個(gè)對(duì)象; DataOnly data = new DataOnly()。 = false。 DataOnly 類除了保存數(shù)據(jù)外沒(méi)別的用處,因?yàn)樗鼪](méi)有任何成員方法。所以最好明確地對(duì)變量進(jìn)行初始化。所以在使用 x前,應(yīng)先 對(duì)其賦一個(gè)適當(dāng)?shù)闹怠? 方法、參數(shù)和返回值 許多程序設(shè)計(jì)語(yǔ)言(像 C 和 C++)用函數(shù)這個(gè)術(shù)語(yǔ)來(lái)描述命名子程序;而在 Java 里卻常用方法這個(gè)術(shù)語(yǔ)來(lái)表示“做某些事情的方式”。方法的基本組成部分包括:名稱、參數(shù)、返回值和方法體。 Java 中的方法只能作為類的一部分來(lái)創(chuàng)建。如: (arg1,arg2,arg3)。 這種調(diào)用方法的行為通常被稱為發(fā)送消息給對(duì)象。正如你可能料想的那樣,這些信息像 Java 中的其他信息一樣,采用的都是對(duì)象形式。 假設(shè)某個(gè)方法接受 String 為其參數(shù),下面是其具體定義,它必須置于某個(gè)類的定義內(nèi)才能被正確編譯。一旦將 s 傳遞給此方法,就可以把他當(dāng)作其他對(duì)象一樣進(jìn)行處理(可以給它傳遞消息)。在這個(gè)例子中,返回值是通過(guò)計(jì)算 ()*2 這個(gè)表達(dá)式得到的。} void nothing(){return。 到此為止,讀者或許覺(jué)得:程序視乎只是一系列帶有方法的對(duì)象組合,這些方法以其他對(duì)象為參數(shù),并發(fā)送消息給其他對(duì)象。 the reason C++ is hybrid is to support backward patibility 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 plicated. The Java language assumes that you want to do only objectoriented programming. This means that before you can begin you must shift your mindset into an objectoriented world (unless it?s already 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 ponents of a Java program and learn that (almost) everything in Java is an object. You manipulate objects with references Each programming language has its own means of manipulating elements in memory. Sometimes 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++) that must be treated with a special syntax? 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 identifier you manipulate is actually a “reference” to an object. You might imagine a television (the object) and a remote control 1(the reference)