本節(jié)內(nèi)容小編為大家精選帶來(lái)的是pdf格式高清免費(fèi)版Thinking In Java 4th(java編程思想第四版),該電子版文檔資料共有688頁(yè),該第四版中文版thinking in java內(nèi)容完整,有需要的朋友可以點(diǎn)擊本文下方的下載地址進(jìn)行下載查閱!
溫馨提示:
本文檔為PDF格式文檔,因此需確保在閱讀之前你已經(jīng)安裝了PDF閱讀器,如果尚未安裝閱讀器,建議下載福昕PDF閱讀器或其他PDF閱讀器進(jìn)行安裝后閱讀。
Thinking In Java 4th(java編程思想第四版)內(nèi)容節(jié)選
……
2.4 新建數(shù)據(jù)類型:類
如果說(shuō)一切東西都是對(duì)象,那么用什么決定一個(gè)“類”(Class)的外觀與行為呢?換句話說(shuō),是什么建立起了一個(gè)對(duì)象的“類型”(Type)呢?大家可能猜想有一個(gè)名為“type”的關(guān)鍵字。但從歷史看來(lái),大多數(shù)面向?qū)ο蟮恼Z(yǔ)言都用關(guān)鍵字“class”表達(dá)這樣一個(gè)意思:“我準(zhǔn)備告訴你對(duì)象一種新類型的外觀”。class 關(guān)鍵字太常用了,以至于本書許多地方并沒(méi)有用粗體字或雙引號(hào)加以強(qiáng)調(diào)。在這個(gè)關(guān)鍵字的后面,應(yīng)該跟隨新數(shù)據(jù)類型的名稱。例如:
class ATypeName {/*類主體置于這里}
這樣就引入了一種新類型,接下來(lái)便可用new 創(chuàng)建這種類型的一個(gè)新對(duì)象:
ATypeName a = new ATypeName();
在ATypeName 里,類主體只由一條注釋構(gòu)成(星號(hào)和斜杠以及其中的內(nèi)容,本章后面還會(huì)詳細(xì)講述),所以并不能對(duì)它做太多的事情。事實(shí)上,除非為其定義了某些方法,否則根本不能指示它做任何事情。
2.4.1 字段和方法
定義一個(gè)類時(shí)(我們?cè)?Java 里的全部工作就是定義類、制作那些類的對(duì)象以及將消息發(fā)給那些對(duì)象),可在自己的類里設(shè)置兩種類型的元素:數(shù)據(jù)成員(有時(shí)也叫“字段”)以及成員函數(shù)(通常叫“方法”)。其中,數(shù)據(jù)成員是一種對(duì)象(通過(guò)它的句柄與其通信),可以為任何類型。它也可以是主類型(并不是句柄)之一。如果是指向?qū)ο蟮囊粋(gè)句柄,則必須初始化那個(gè)句柄,用一種名為“構(gòu)建器”(第4 章會(huì)對(duì)此詳述)的特殊函數(shù)將其與一個(gè)實(shí)際對(duì)象連接起來(lái)(就象早先看到的那樣,使用new關(guān)鍵字)。但若是一種主類型,則可在類定義位置直接初始化(正如后面會(huì)看到的那樣,句柄亦可在定義位置初始化)。
……
6. 菜單
為菜單處理事件看起來(lái)受益于Java 1.1 版的事件模型,但Java 生成菜單的方法常常麻煩并且需要一些手工
編寫代碼。生成菜單的正確方法看起來(lái)像資源而不是一些代碼。請(qǐng)牢牢記住編程工具會(huì)廣泛地為我們處理創(chuàng)
建的菜單,因此這可以減少我們的痛苦(只要它們會(huì)同樣處理維護(hù)任務(wù)。。另外,我們將發(fā)現(xiàn)菜單不支持
并且將導(dǎo)致混亂的事件:菜單項(xiàng)使用ActionListeners(動(dòng)作接收器),但復(fù)選框菜單項(xiàng)使用 ItemListeners
(項(xiàng)目接收器)。菜單對(duì)象同樣能支持ActionListeners(動(dòng)作接收器),但通常不那么有用。一般來(lái)說(shuō),
我們會(huì)附加接收器到每個(gè)菜單項(xiàng)或復(fù)選框菜單項(xiàng),但下面的例子(對(duì)先前例子的修改)演示了一個(gè)聯(lián)合捕捉
多個(gè)菜單組件到一個(gè)單獨(dú)的接收器類的方法。正像我們將看到的,它或許不值得為這而激烈地爭(zhēng)論。
//: MenuNew.java
// Menus in Java 1.1
import java.awt.*;
import java.awt.event.*;
public class MenuNew extends Frame {
String[] flavors = { "Chocolate", "Strawberry",
"Vanilla Fudge Swirl", "Mint Chip",
"Mocha Almond Fudge", "Rum Raisin",
"Praline Cream", "Mud Pie" };
TextField t = new TextField("No flavor", 30);
MenuBar mb1 = new MenuBar();
Menu f = new Menu("File");
Menu m = new Menu("Flavors");
Menu s = new Menu("Safety");
// Alternative approach:
CheckboxMenuItem[] safety = {
new CheckboxMenuItem("Guard"),
new CheckboxMenuItem("Hide")
};
MenuItem[] file = {
// No menu shortcut:
new MenuItem("Open"),
// Adding a menu shortcut is very simple:
new MenuItem("Exit",
new MenuShortcut(KeyEvent.VK_E))
};
// A second menu bar to swap to:
MenuBar mb2 = new MenuBar();
Menu fooBar = new Menu("fooBar");
MenuItem[] other = {
new MenuItem("Foo"),
new MenuItem("Bar"),
new MenuItem("Baz"),
};
// Initialization code:
{
ML ml = new ML();
……
3. 程序列表的存取
接下來(lái)的一系列方法是簡(jiǎn)單的訪問(wèn)器:directory()、filename()(注意方法可能與字段有相同的拼寫和大小寫形式)和 contents()。而 hasFile()用于指出這個(gè)對(duì)象是否包含了一個(gè)文件(很快就會(huì)知道為什么需要這個(gè))。
最后三個(gè)方法致力于將這個(gè)代碼列表寫進(jìn)一個(gè)文件——要么通過(guò)writePacked()寫入一個(gè)打包文件,要么通過(guò)writeFile()寫入一個(gè)Java 源碼文件。writePacked()需要的唯一東西就是 DataOutputStream,它是在別的地方打開(kāi)的,代表著準(zhǔn)備寫入的文件。它先把頭信息置入第一行,再調(diào)用writeBytes()將contents(內(nèi)容)寫成一種“通用”格式。
準(zhǔn)備寫Java 源碼文件時(shí),必須先把文件建好。這是用 IO.psOpen()實(shí)現(xiàn)的。我們需要向它傳遞一個(gè)File 對(duì)象,其中不僅包含了文件名,也包含了路徑信息。但現(xiàn)在的問(wèn)題是:這個(gè)路徑實(shí)際存在嗎?用戶可能決定將所有源碼目錄都置入一個(gè)完全不同的子目錄,那個(gè)目錄可能是尚不存在的。所以在正式寫每個(gè)文件之前,都要調(diào)用File.mkdirs()方法,建好我們想向其中寫入文件的目錄路徑。它可一次性建好整個(gè)路徑。
4. 整套列表的包容
以子目錄的形式組織代碼列表是非常方便的,盡管這要求先在內(nèi)存中建好整套列表。之所以要這樣做,還有另一個(gè)很有說(shuō)服力的原因:為了構(gòu)建更“健康”的系統(tǒng)。也就是說(shuō),在創(chuàng)建代碼列表的每個(gè)子目錄時(shí),都會(huì)加入一個(gè)額外的文件,它的名字包含了那個(gè)目錄內(nèi)應(yīng)有的文件數(shù)目。
DirMap類可幫助我們實(shí)現(xiàn)這一效果,并有效地演示了一個(gè)“多重映射”的概述。這是通過(guò)一個(gè)散列表(Hashtable)實(shí)現(xiàn)的,它的“鍵”是準(zhǔn)備創(chuàng)建的子目錄,而“值”是包含了那個(gè)特定目錄中的SourceCodeFile 對(duì)象的Vector 對(duì)象。所以,我們?cè)谶@兒并不是將一個(gè)“鍵”映射(或?qū)?yīng))到一個(gè)值,而是通過(guò)對(duì)應(yīng)的Vector,將一個(gè)鍵“多重映射”到一系列值。盡管這聽(tīng)起來(lái)似乎很復(fù)雜,但具體實(shí)現(xiàn)時(shí)卻是非常簡(jiǎn)單和直接的。大家可以看到,DirMap類的大多數(shù)代碼都與向文件中的寫入有關(guān),而非與“多重映射”有關(guān)。與它有關(guān)的代碼僅極少數(shù)而已。
可通過(guò)兩種方式建立一個(gè)DirMap(目錄映射或?qū)?yīng))關(guān)系:默認(rèn)構(gòu)建器假定我們希望目錄從當(dāng)前位置向下展開(kāi),而另一個(gè)構(gòu)建器讓我們?yōu)槠鹗寄夸浿付ㄒ粋(gè)備用的“絕對(duì)”路徑。
add()方法是一個(gè)采取的行動(dòng)比較密集的場(chǎng)所。首先將directory()從我們想添加的SourceCodeFile 里提取出來(lái),然后檢查散列表(Hashtable),看看其中是否已經(jīng)包含了那個(gè)鍵。如果沒(méi)有,就向散列表加入一個(gè)新的Vector,并將它同那個(gè)鍵關(guān)聯(lián)到一起。到這時(shí),不管采取的是什么途徑,Vector 都已經(jīng)就位了,可以將它提取出來(lái),以便添加SourceCodeFile。由于 Vector可象這樣同散列表方便地合并到一起,所以我們從兩方面都能感覺(jué)得非常方便。
……
Thinking In Java 4th(java編程思想第四版)相關(guān)內(nèi)容小編就為大家介紹到這里了,更多pdf格式文檔資料下載,敬請(qǐng)關(guān)注東坡下載站!
- PC官方版
- 安卓官方手機(jī)版
- IOS官方手機(jī)版