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