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