本書從Java語言的基本特點入手, 全面介紹了Java語言的基本概念和編程方法, 并深入介紹了Java的高級特性。內容涉及Java中的基本語法、數據類型、類、異常、界面設計、小應用程序、I/O數據流、線程及網絡功能等內容, 基本覆蓋了Java的大部分技術, 是進一步使用Java進行技術開發(fā)的基礎。
《Java程序設計》是Java語言的入門級教材,是作者針對Java語言的教學目的,結合國內教學的特點,根據多年的教學實踐與科技開發(fā)的經驗編寫的。結合作者編寫的《Java程序設計題解與上機指導》,能幫助讀者盡快掌握Java程序設計的方法。
Java語言自問世以來,經歷了多次版本升級,從安全機制、語法成分到API函數都有較大的修改!禞ava程序設計》自2001年9月由清華大學出版社出版至今,經過了多次修訂,目前已經出版了第4版。為配合使用《Java程序設計(第四版)》,我們編寫了本書,旨在幫助讀者檢查Java語言的學習效果,盡快掌握Java語言。
本書對《Java程序設計(第四版)》中13章的全部習題給出了完整的解答。對論述題給出了簡單的答案,內容主要摘自《Java程序設計(第四版)》。對編程題給出了對題目的簡單分析,論述了設計思路,并給出了相應的程序代碼。這些代碼均在Java 8.0環(huán)境下調試通過,程序運行結果以截圖的方式提供給讀者,供讀者參考。在有些習題的后面,又給出了若干拓展思考題,可幫助讀者進一步理解相關的習題。
在《Java程序設計(第四版)》中,增加了一章新內容,即第7章Java語言的高級特性。相應地,本書也增加了一章,對教材中第7章的習題給出了簡單解答。在高級特性中介紹了泛型及迭代器,所以對第三版中的程序代碼也增加了對泛型及迭代器的使用,對相關程序做了修改及調試。
此外,本書精選了9個實驗題目,可供教師配合授課使用。每個實驗均列出了實驗的目的,以此作為檢查的目標。實驗后可要求學生完成實驗報告,讓學生更加深入地理解Java語言,確保學生掌握編程技巧。
眾所周知,大部分習題的解答不具有唯一性;特別是程序設計題目,給讀者發(fā)揮潛能的余地非常大。本書中給出的這些解答和參考答案僅供參考,希望能起到拋磚引玉的作用。因為編者水平的局限性,書中的答案難免存在這樣、那樣的問題,實現的代碼也不一定是最優(yōu)的。讀者可以參考本書中的內容和其他參考書中的內容,得出自己更全面的答案。至于程序代碼,其實現的方式就更加多種多樣,相信讀者能在本書代碼的基礎之上,編寫出功能更全面、效率更高的程序。
計算機技術是不斷發(fā)展、不斷完善的技術,Java語言也是如此。從誕生之日起,它的版本一直在更新中。就在本書編寫過程及讀者使用本書期間,相信Java又會有新的發(fā)展。讀者應及時把握這些新動向,了解最新版本的相關信息,特別是及時更新自己機器上的JDK,以保持自己設計的代碼與新版本同步。
本書是教學參考書,希望讀者在使用、調試本書中代碼的同時,既能加深對Java語言的理解,又能提高程序設計的能力,并在此過程中不斷發(fā)現問題、思考問題、解決問題,把本書作為掌握知識的一個工具和橋梁。
本書由辛運幃、饒一梅編寫,并運行通過了所有程序代碼。
由于作者水平有限,對Java語言的掌握不夠全面,書中難免有不妥之處,懇請廣大讀者特別是同行專家批評指正,在此我們表示深深的謝意。
編者
于南開園
第3版前言
Java語言自問世以來,經歷了多次版本升級,新版本從安全機制、語法成分到API函數都有較大的修改。《Java程序設計》自2001年9月由清華大學出版社出版至今,也經過了多次修訂,目前已經出版了第三版。為配合使用《Java程序設計(第三版)》,我們編寫了這本《Java程序設計題解與上機指導(第三版)》,旨在幫助讀者檢查Java語言的學習效果,盡快掌握Java語言。
本書對《Java程序設計(第三版)》一書中12章的全部習題做了完整解答。對論述題給出了簡單的答案,內容主要摘自《Java 程序設計(第三版)》。對編程題目給出了題目的簡單分析,論述了設計思路,并給出了相應的程序代碼。這些代碼均在Java 5.0環(huán)境下調試通過,程序運行結果以截圖的方式提供給讀者,供讀者參考。在有些習題的后面,又給出了若干拓展思考題,可幫助讀者進一步理解相關的知識。此外,本書精選了9個實驗題目,可供教師配合授課使用。每個實驗均列出了實驗的目的,以此作為檢查的依據。實驗后可要求學生完成實驗報告,讓學生更加深入理解Java語言,確保學生掌握編程技巧。
眾所周知,大部分的習題解答不具有唯一性;特別是程序設計題目,給讀者發(fā)揮潛能的余地非常大。本書中給出的這些解答和參考答案僅供參考,希望能起到拋磚引玉的作用。因為編者水平的局限性,書中的答案難免存在某些問題,實現的代碼也不一定是最優(yōu)的。讀者可以參考本書中的內容和其他參考書中的內容,得出自己更全面的答案。至于程序代碼,其實現的方式就更加多種多樣,相信讀者能在本書代碼的基礎之上,編寫出功能更全面、效率更高的程序。
計算機技術是不斷發(fā)展、不斷完善的技術,Java語言也是如此。從誕生之日起,它的版本一直在更新中。就在本書編寫過程及讀者使用本書期間,相信Java語言又有了新的發(fā)展。讀者應及時把握這些新動向,了解最新版本的相關信息,特別是及時更新自己機器上的JDK,以保持自己設計的代碼與新版本同步。
本書是一本教學參考書,希望讀者在使用、調試本書中代碼的同時,既能加深對Java語言的理解,又能提高程序設計的能力,并在此過程中不斷發(fā)現問題、思考問題、解決問題,把本書作為掌握知識的一個工具和橋梁。
本書由辛運幃、饒一梅編寫,并運行通過了書中所有程序代碼。
由于作者水平有限,對Java語言的掌握不夠全面,書中難免有錯誤和不妥之處,懇請廣大讀者特別是同行專家批評指正,在此我們表示深深的謝意。
編者
于南開園
辛運幃,女,博士,教授。現為南開大學計算機與控制工程學院計算機與信息安全系教授。多年來一直從事程序語言設計、數據結構與算法等方向的教學和科研工作,主講數據結構與算法、形式語言與自動機、計算方法等課程。主要研究領域為人工智能、電子商務、加密技術、智能信息系統(tǒng)等,已出版《Java語言程序設計》、《數據結構》、《離散數學》等相關教材。
第1部分題解
概述3標識符、關鍵字和數據類型19
表達式和流程控制語句46
數組和字符串73
對象和類的進一步介紹93
Java語言中的異常143
Java語言的高級特性150
Java的圖形用戶界面設計157
Swing組件174
Java Applet190
Java數據流205
線程243
Java的網絡功能252
第2部分上 機 指 導
實驗1熟悉系統(tǒng)及環(huán)境261
實驗2簡單的輸入/輸出處理263
實驗3類的練習267
實驗4模擬彩票開獎游戲273實驗5模擬CD出租銷售店281
實驗6計算器300
實驗7用戶界面設計313
實驗8多線程練習332
實驗9文件讀寫練習338
第5章對象和類的進一步介紹
5.1詳細說明類是如何定義的,解釋類的特性及它的幾個要素。
解: Java程序設計就是定義類的過程,Java程序中的所有代碼都包含在類中。類可以看作是數據的集合及操作這些數據所需的方法的整合。
Java中的類分兩種,一種是系統(tǒng)預定義的類,這些類組成Java類庫。Java類庫是一組由軟件供應商編寫好的程序模塊,完成常用的基本功能和任務,可由程序編寫人員直接調用。正是由于有了這些類庫,程序員才有了很好的輔助工具,不必將精力浪費在一些簡單常見的功能實現上;绢悗焯峁┑倪@些功能,使得程序員站在了一個較高的起點上,他們可以把主要精力關注在更加復雜的工作上。這些定義好的類根據實現功能的不同,劃分成不同的集合,每個集合稱為一個包。Sun公司提供的JDK中共有43個大包。
除去系統(tǒng)預定義的類之外,還有一種是用戶程序自己定義的類,當然這其中又包括其他程序員定義的類和自己定義的類。這些類都顯式或隱式地派生于Java中某個預定義的類。不論是預定義的類,還是程序員自己定義的類,每個類中一般都包含屬性和方法。屬性即是數據,屬性值表明一個對象的狀態(tài);方法決定類有哪些可利用的手段,即可通過哪些函數來操作這些數據。
類的具體格式如下: 修飾符 class 類名\[extends 父類名\]{
類型 成員變量1;
類型 成員變量2;
……
修飾符 類型 成員方法1(參數列表){
類型 局部變量;
方法體
}
修飾符 類型 成員方法2(參數列表){
類型 局部變量;
方法體
}
……
}類定義的第一行是類頭,關鍵字class表明這里定義的是一個類。class前的修飾符允許有多個,用來限定所定義的類的使用方式。
類名是用戶為該類所起的名字,它應該是一個合法的標識符,并盡量遵從命名約定。
extends是關鍵字。如果所定義的類是從某一個父類派生而來,那么,父類的名字應寫在extends之后。如果不寫的話,則隱式表明繼承于Object類。Java不允許多重繼承,所以如果有父類的話,只能有一個父類。
類頭后面的部分稱為類體,類體用一對大括號括起來,含有兩部分,一部分是數據成員變量,另一部分是成員方法。數據成員變量可以含有多個,這是類的靜態(tài)屬性,表明類的實例目前所處的狀態(tài)。類的不同實例對應各自不同的屬性值,因此有些屬性值可用來標識不同的實例。成員變量前面的類型是該變量的類型。成員方法也可以有多個,其前面的類型是方法返回值的類型。方法對應類的行為和操作。方法體是要執(zhí)行的真正語句。在方法體中還可以定義該方法內使用的局部變量,這些變量只在該方法內有效。
類可以是public的,表明任何對象都可以使用或擴展這個類;也可以是friendly的,表明它可以被同一個包中的對象使用。類還可以是final的,表明它不可以再有子類,與之相對的,使用abstract修飾的類必須要有子類。
5.2給出3個類的定義: class ParentClass {}
class SubClass1 extends ParentClass {}
class SubClass2 extends ParentClass {}并分別定義3個對象:ParentClass a=new ParentClass ();
SubClass1 b=new SubClass1();
SubClass2 c=new SubClass2();若執(zhí)行下面的語句:a=b;
b=a;
b=(SubClass1)c;會有什么結果?分別從下面的選項中選擇正確的答案。
(1) 編譯時出錯。
(2) 編譯時正確,但執(zhí)行時出錯。
(3) 執(zhí)行時完全正確。
解: 3行類定義分別定義了3個類,一個父類ParentClass及它的兩個子類SubClass1和SubClass2。后面的3行則分別為每個類說明了一個實例,其中,a是ParentClass類的實例,b是SubClass1類的實例,c是SubClass2類的實例。由于SubClass1和SubClass2都是派生于ParentClass的子類,所以b和c也同時是ParentClass類的實例。
Java中允許使用對象之父類類型的一個變量指示該對象,稱為轉換對象(casting)。關于轉換對象的使用,遵從對象引用的賦值兼容原則。所謂對象引用的賦值兼容原則是指允許把子類的實例賦給父類的引用,但不允許把父類的實例賦給子類的引用。實際編程時,可以使用instanceof運算符來判明一個引用指向的是哪個類的實例。如果父類的引用指向的是子類實例,就可以轉換該引用,恢復對象的全部功能。
本題中,可以進行下面的測試: boolean tagb1=b instanceof ParentClass;
boolean tagc1=c instanceof ParentClass;tagb1和tagc1的值都是true,表明b和c是子類實例的同時,也是父類的實例。反過來,父類的實例不是子類的實例,例如下面的測試: boolean taga2=a instanceof SubClass1;
boolean taga3=a instanceof SubClass2;taga2和taga3的值都是false。b和c是不同子類的實例,所以如下測試: boolean tagb3=b instanceof SubClass2;
boolean tagc2=c instanceof SubClass1;將出現編譯錯誤。下面針對題目中的3條語句分別進行測試。
(1) 執(zhí)行a=b;時,a指向父類的實例,b指向子類的實例。由于是將子類實例賦給父類實例,因此編譯及執(zhí)行都是正確的。該語句將執(zhí)行子類中的方法,如果子類中沒有重寫父類中的方法,則將執(zhí)行父類中的方法。例如下面的程序中,父類和子類中都定義了value成員和getValue()方法,將子類的實例賦給父類引用后,此時a的值是子類的實例,再執(zhí)行語句: taga2=a instanceof SubClass1;則taga2的值應為true。在給a分配的內存中既包括子類中value的值,也含有父類中value的值。調用a.getValue()方法時,先在子類中查找這個方法是否存在,如果有,則返回子類中value的值1;若沒有,則查找父類中的同名方法,并返回父類中的值0。
……