教學(xué)課件-Java程序設(shè)計(jì)(第二版)陳圣國_第1頁
教學(xué)課件-Java程序設(shè)計(jì)(第二版)陳圣國_第2頁
教學(xué)課件-Java程序設(shè)計(jì)(第二版)陳圣國_第3頁
教學(xué)課件-Java程序設(shè)計(jì)(第二版)陳圣國_第4頁
教學(xué)課件-Java程序設(shè)計(jì)(第二版)陳圣國_第5頁
已閱讀5頁,還剩1152頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第1章Java語言概述

1.1計(jì)算機(jī)與程序設(shè)計(jì)語言1.2Java的發(fā)展歷史1.3跨平臺的Java1.4面向?qū)ο蟮腏ava1.5Java程序的開發(fā)環(huán)境1.6最簡單的Java程序 1.1計(jì)算機(jī)與程序設(shè)計(jì)語言

1946年2月15日,第一臺通用電子數(shù)字計(jì)算機(jī)ENIAC在美國研制成功。它由1.8萬個(gè)電子管組成,重達(dá)30多噸。ENIAC無論功能還是運(yùn)算速度都無法跟今天的家用電腦相比,但它的出現(xiàn)卻開啟了一個(gè)新的時(shí)代。

計(jì)算機(jī)作為一種通用工具,與人類歷史上發(fā)明的各種工具相比,一個(gè)突出的不同就是可以編程控制,通過執(zhí)行不同的程序,計(jì)算機(jī)可以實(shí)現(xiàn)不同的功能。程序是計(jì)算機(jī)能夠執(zhí)行的指令序列,程序員可以使用不同的程序設(shè)計(jì)語言來編寫程序,其中有一些語言計(jì)算機(jī)能夠直接識別,而另一些程序設(shè)計(jì)語言需要經(jīng)過翻譯才能為計(jì)算機(jī)所執(zhí)行。程序設(shè)計(jì)語言的發(fā)展,經(jīng)歷了從機(jī)器語言、匯編語言到高級語言的歷程。

1)機(jī)器語言

計(jì)算機(jī)所使用的是由“0”和“1”組成的二進(jìn)制數(shù),計(jì)算機(jī)發(fā)明之初,人們只能使用一串串由“0”和“1”組成的指令序列來編寫程序,這種語言稱為機(jī)器語言。機(jī)器語言難以使用,程序調(diào)試修改十分困難。而且,由于不同型號計(jì)算機(jī)的指令系統(tǒng)往往不同,在一臺計(jì)算機(jī)上執(zhí)行的程序,要想在另一臺計(jì)算機(jī)上執(zhí)行,必須另編程序,造成了重復(fù)工作。

2)匯編語言

針對機(jī)器語言的缺點(diǎn),人們進(jìn)行了一種有益的改進(jìn),采用一些類似于英語單詞的縮寫代替計(jì)算機(jī)的各種二進(jìn)制指令,如“ADD”代表加法,“MOV”代表數(shù)據(jù)傳遞等等。這樣一來,程序變得易于理解和維護(hù)。這些縮寫便構(gòu)成了基本的匯編語言。用匯編語言編寫的程序不能直接由計(jì)算機(jī)執(zhí)行,需要一個(gè)翻譯程序?qū)⑦@些符號翻譯成二進(jìn)制的機(jī)器語言,這種翻譯程序被稱為匯編程序。

3)高級語言

雖然利用匯編語言編寫程序的效率遠(yuǎn)高于其他語言,但是對于一項(xiàng)簡單的任務(wù),仍需要大量的指令才能完成,所以使用匯編語言編程調(diào)試來實(shí)現(xiàn)一個(gè)復(fù)雜應(yīng)用依然是一件很痛苦的事情。

“痛”則思變,高級語言應(yīng)運(yùn)而生。1954年,第一個(gè)完全脫離機(jī)器硬件的高級語言——FORTRAN問世了,它采用接近于數(shù)學(xué)語言或人的自然語言的語法形式,同時(shí)又不依賴于計(jì)算機(jī)硬件,編程效率和程序的通用性得到很大的提高。50多年來,已出現(xiàn)的高級語言有幾百種,影響較大的也有幾十種。高級語言程序本身不能直接為計(jì)算機(jī)所執(zhí)行,必須由專門的編譯程序?qū)⒏呒壵Z言編寫的程序轉(zhuǎn)換為一個(gè)或多個(gè)包含了機(jī)器語言的文件。高級程序經(jīng)過編譯后,鏈接程序?qū)藱C(jī)器語言的文件鏈接成一個(gè)計(jì)算機(jī)可以運(yùn)行的程序,采用這種方式工作的高級語言稱為編譯型語言。

高級語言的另一種工作方式是由解釋器直接執(zhí)行高級語言程序,與編譯型方式相比,解釋器方式的執(zhí)行效率比較低。 1.2Java的發(fā)展歷史

1995年5月,Sun公司在“SunWorld95”大會上推出了Java語言。Java語言作為一種網(wǎng)絡(luò)編程語言,隨著國際互聯(lián)網(wǎng)的飛速發(fā)展,很快得到了廣泛的支持和實(shí)際的應(yīng)用。

其實(shí),Java語言最初并不是為互聯(lián)網(wǎng)設(shè)計(jì)的,它來自于Sun公司的一個(gè)叫Green的項(xiàng)目,目的是為家用消費(fèi)電子產(chǎn)品開發(fā)一個(gè)分布式代碼系統(tǒng),這樣,用戶可以把E-mail發(fā)給電冰箱、電視機(jī)等家用電器,對它們進(jìn)行控制和信息交流。該項(xiàng)目小組開始準(zhǔn)備采用C++,但他們很快意識到C++?太復(fù)雜,安全性差,后來基于C++?開發(fā)了一種新的語言——Oak(Java的前身)。

Oak是一種用于網(wǎng)絡(luò)的精巧而安全的語言,Sun公司曾以此投標(biāo)一個(gè)交互式電視項(xiàng)目,但未獲成功,使得Oak幾乎夭折。MarkArdreesen開發(fā)的Mosaic和Netscape啟發(fā)了Oak項(xiàng)目組成員,他們用Java編制了HotJava瀏覽器,得到了Sun公司首席執(zhí)行官ScottMcNealy的支持,Java得以進(jìn)軍互聯(lián)網(wǎng)。為此Sun公司引入了一個(gè)稱之為Applet的Java程序創(chuàng)建機(jī)制,用以在Web頁上執(zhí)行并通過Web瀏覽器進(jìn)行顯示,使得原本靜態(tài)的網(wǎng)頁“活躍起來”。

Java的取名也有一段趣聞。有一天,幾位Oak項(xiàng)目組成員正在討論給這個(gè)新的語言取什么名字,當(dāng)時(shí)他們正在咖啡館喝著Java咖啡,有一個(gè)人靈機(jī)一動說,就叫Java怎么樣,結(jié)果得到了其他人的贊同,于是,Java這個(gè)名字就這樣傳開了。

目前通常所說的Java有三層含義:先是指一種編程語言;其次是一種開發(fā)環(huán)境;再者是一種應(yīng)用環(huán)境。如今的Java語言不再只是將Web網(wǎng)頁“活躍起來”的一門語言,它已成為許多機(jī)構(gòu)編程時(shí)的首選語言。

Java作為新一代面向?qū)ο蟪绦蛟O(shè)計(jì)語言,特別適合于Internet應(yīng)用程序開發(fā),它的平臺無關(guān)性使Java作為軟件開發(fā)的一種革命性技術(shù)地位得到確立。計(jì)算機(jī)產(chǎn)業(yè)的許多大公司購買了Java的許可證,包括IBM、Microsoft、Apple、Oracle等。Java開發(fā)工具軟件日漸豐富,如Borland公司的JBuilder、Sun公司的JavaWorkshop、IBM公司的VisualAge、Microsoft公司的VisualJ++等。數(shù)據(jù)庫廠商如Sysbase、Versant、Oracle都在開發(fā)CGI接口,支持HTML和Java。

Sun公司于1996年年初發(fā)布了Java的第一個(gè)版本,1998年召開的JavaOne大會上發(fā)布了Java1.2版。1999年,Sun公司發(fā)布了以Java2平臺為核心的J2SE、J2EE和J2ME三大平臺?!?J2SE(Java2Platform,StandardEdition)

J2SE含有基本的Java2SDK工具和運(yùn)行時(shí)API,開發(fā)者可以用它們來編寫、部署和運(yùn)行Java應(yīng)用程序和Applet(在Web瀏覽器如IE中運(yùn)行的Java小程序)。

●?J2EE(Java2Platform,EnterpriseEdition)

J2EE建立在J2SE的基礎(chǔ)上,它是JSP(JavaServerPage)、Servlet、EJB、JTS(JavaTransactionService)、Javamail以及JMS(JavaMessageService)等多項(xiàng)技術(shù)的混合體,主要用于開發(fā)分布式的、服務(wù)器端的多層結(jié)構(gòu)的應(yīng)用系統(tǒng),如電子商務(wù)網(wǎng)站。●?J2ME(Java2Platform,MicroEdition)

J2ME主要用于開發(fā)電子產(chǎn)品,如移動電話、數(shù)字機(jī)頂盒、汽車導(dǎo)航系統(tǒng)等。

本書介紹的內(nèi)容基本都屬于J2SE的范疇,僅第9章涉及J2EE的部分內(nèi)容。

2002年2月,Sun公司發(fā)布了J2SE1.4版,該版本為目前應(yīng)用最為廣泛的Java版本。2004年10月J2EE1.5版發(fā)布,該版引入了一些新的特性,Sun將其正式稱為Java5,相應(yīng)的三個(gè)平臺分別改稱為JavaSE、JavaEE、JavaME。目前,Sun公司網(wǎng)站已正式發(fā)布了Java6。

本書內(nèi)容主要基于Java2,少量程序使用了Java5的一些新特性。 1.3跨平臺的Java

與常見的編譯型高級程序設(shè)計(jì)語言不同,Java語言編譯器產(chǎn)生的二進(jìn)制代碼是一種與具體機(jī)器指令無關(guān)的指令集合,只要有Java運(yùn)行時(shí)系統(tǒng)存在,編譯后的代碼便可在許多處理器上運(yùn)行。Java運(yùn)行時(shí)系統(tǒng)被稱為Java虛擬機(jī)(JavaVirtualMachine,JVM),Java編譯器產(chǎn)生的代碼由Java虛擬機(jī)解釋執(zhí)行,如圖1.1所示。由此,Java語言實(shí)現(xiàn)了平臺獨(dú)立性——一次編寫,隨處運(yùn)行(Writeonce,Runanywhere)。圖1.1Java的平臺無關(guān)性

Java編譯器產(chǎn)生的二進(jìn)制代碼稱為字節(jié)碼(ByteCode),字節(jié)碼與任何具體計(jì)算機(jī)結(jié)構(gòu)都無關(guān)。實(shí)際上,這并不是一個(gè)新想法,多年前的UCSDPascal系統(tǒng)就在一個(gè)商業(yè)產(chǎn)品中做了同樣的努力,甚至比這更早,NiklausWirth的Pascal的最初實(shí)現(xiàn)也使用了同樣的方法。

不過這種技術(shù)存在著一個(gè)很大的缺點(diǎn),即與通常高級語言采用的編譯為機(jī)器指令相比,其程序執(zhí)行效率相差很多。為此,Java系統(tǒng)采用了一些獨(dú)特的方法來改善其執(zhí)行效率。例如,采用即時(shí)編譯技術(shù)(JustInTime,JIT),在程序執(zhí)行前將字節(jié)碼轉(zhuǎn)換為本地指令,避免了對某些指令段的重復(fù)解釋;精心設(shè)計(jì)Java字節(jié)碼,使其既可容易地在任何機(jī)器上解釋,又可容易地被快速翻譯為本地機(jī)器代碼。

Java系統(tǒng)的基本數(shù)據(jù)類型不依賴于具體實(shí)現(xiàn),在任何硬件平臺上均保持一致。而通常的高級語言數(shù)據(jù)類型是與平臺相關(guān)的,如C語言在Windows3.1中整數(shù)(int)為16位,在Windows95中整數(shù)為32位,在DECAlpha中整數(shù)為64位,在Intel486中整數(shù)為32位。

這種與體系結(jié)構(gòu)無關(guān)的特性使得Java應(yīng)用程序可以在配備了Java虛擬機(jī)的任何計(jì)算機(jī)系統(tǒng)上運(yùn)行,這成為Java應(yīng)用軟件便于移植的良好基礎(chǔ)。 1.4面向?qū)ο蟮腏ava

20世紀(jì)60年代,軟件開發(fā)技術(shù)發(fā)展緩慢,隨著硬件技術(shù)的發(fā)展,出現(xiàn)了“軟件危機(jī)”。在軟件開發(fā)過程中,所做的工作常常落后于預(yù)先的計(jì)劃,成本大幅提高,超過預(yù)算,而得到的最終產(chǎn)品卻并不可靠,不能滿足實(shí)際的需要。

為了解決“軟件危機(jī)”,20世紀(jì)60年代末70年代初人們提出了結(jié)構(gòu)化程序設(shè)計(jì)的思想,按照結(jié)構(gòu)化程序設(shè)計(jì)的原則和方法,設(shè)計(jì)出結(jié)構(gòu)清晰、容易理解、容易修改、容易驗(yàn)證的程序。結(jié)構(gòu)化程序設(shè)計(jì)方法采用自頂向下、逐步細(xì)化的方法將復(fù)雜的過程分解成由三種基本控制結(jié)構(gòu)(順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu))構(gòu)成的程序。到了20世紀(jì)70年代末期,隨著計(jì)算機(jī)科學(xué)的發(fā)展和應(yīng)用領(lǐng)域的不斷擴(kuò)大,對計(jì)算機(jī)技術(shù)的要求越來越高。結(jié)構(gòu)化程序設(shè)計(jì)語言和結(jié)構(gòu)化分析與設(shè)計(jì)已無法滿足用戶需求的變化,面向?qū)ο蠹夹g(shù)開始嶄露頭角。

面向?qū)ο蟪绦蛟O(shè)計(jì)方法起源于Simula67語言,它本身雖因比較難學(xué)、難用而未能廣泛流行,但在它的影響下所產(chǎn)生的面向?qū)ο蠹夹g(shù)卻迅速傳播開來,并在全世界掀起了一股OO(ObjectOriented)熱潮,至今盛行不衰。面向?qū)ο蟪绦蛟O(shè)計(jì)在軟件開發(fā)領(lǐng)域引起了大的變革,極大地提高了軟件開發(fā)的效率,為解決軟件危機(jī)帶來了一線光明。結(jié)構(gòu)化程序設(shè)計(jì)方法將要實(shí)現(xiàn)的系統(tǒng)描述為一個(gè)過程,而一些復(fù)雜的系統(tǒng)如Windows的窗口系統(tǒng)、一個(gè)大型機(jī)構(gòu)的管理信息系統(tǒng)等,我們則很難將其運(yùn)作規(guī)律描述成一個(gè)單一的過程。面向?qū)ο蟮幕舅枷胝J(rèn)為系統(tǒng)是由若干對象構(gòu)成的,每個(gè)對象都有各自的內(nèi)部狀態(tài)和運(yùn)動規(guī)律,不同對象之間通過消息傳送相互作用和聯(lián)系。使用面向?qū)ο蟮姆椒?,我們可以通過分別描述系統(tǒng)中的每個(gè)對象的特性和這些對象之間的聯(lián)系來描述整個(gè)系統(tǒng)。

Java語言的設(shè)計(jì)完全是面向?qū)ο蟮?。在Java語言編寫的程序中,使用類class來描述一組對象的共同特性,類可以看成是創(chuàng)建對象的藍(lán)圖,對象之間通過方法調(diào)用來實(shí)現(xiàn)相互間的聯(lián)系。

Java語言程序的基本單位是類class,一個(gè)完整的Java語言程序一般由多個(gè)類構(gòu)成。Java語言運(yùn)行環(huán)境還提供了功能強(qiáng)大的類庫(或稱為應(yīng)用程序接口API),可以幫助應(yīng)用程序很容易地實(shí)現(xiàn)一些復(fù)雜的功能。

1.5Java程序的開發(fā)環(huán)境

1.5.1Java程序的開發(fā)過程

Java程序的開發(fā)過程與其他高級語言相似。首先編寫程序,然后采用文本編輯軟件輸入源程序,再使用Java語言編譯器進(jìn)行編譯,生成字節(jié)碼文件。

與C/C++?等其他高級語言不同的是,一個(gè)Java程序由若干個(gè)字節(jié)碼文件構(gòu)成,Java虛擬機(jī)直接執(zhí)行字節(jié)碼文件,沒有連接生成獨(dú)立的可執(zhí)行文件的過程。Java類庫代碼也不像C/C++?的函數(shù)庫或類庫那樣需要連接到執(zhí)行文件中,用戶要執(zhí)行Java程序必須安裝相應(yīng)的Java運(yùn)行環(huán)境(JavaRuntimeEnvironment,JRE),這些類庫在安裝Java運(yùn)行環(huán)境時(shí)已安裝在用戶的系統(tǒng)中了。1.5.2Java開發(fā)工具

Java語言最基本的開發(fā)環(huán)境是由Sun公司免費(fèi)提供的JDK(JavaDevelopmentKit),它的開發(fā)環(huán)境比較簡單,使用命令行編譯源代碼,編譯調(diào)試程序都不是很方便。

目前很多廠商推出了Java語言的集成開發(fā)工具,這些開發(fā)工具集源代碼的編輯、編譯及調(diào)試于一體,而且可以幫助程序員生成應(yīng)用程序框架,減少程序員的重復(fù)勞動,提高軟件開發(fā)的效率。常見的集成開發(fā)工具有Microsoft公司的VisualJ++、Borland公司的JBuilder、IBM公司的VisualAgeforJava和Eclipse等。由于Microsoft公司與Sun公司的Java標(biāo)準(zhǔn)之爭,VisualJ++后續(xù)版本已不再支持Java的一些新特性,也不再作為Java應(yīng)用的開發(fā)工具。大部分的Java集成開發(fā)環(huán)境均需要JDK的支持,某些廠商的集成開發(fā)環(huán)境在安裝過程中會自動安裝特定版本的JDK,并允許用戶自行安裝其他版本的JDK,以便用戶能夠使用Java語言新版本的一些特性。

目前,Sun公司網(wǎng)站提供JDK6以及J2SE5.0、J2SE1.4.2等版本的下載,用戶可根據(jù)需要選擇下載。從J2SE1.4開始,Sun公司提供了帶集成開發(fā)環(huán)境的JDK版本,其所使用的集成開發(fā)環(huán)境為NetBeansIDE。Sun公司于2000年6月創(chuàng)建了NetBeans開放源碼計(jì)劃,并繼續(xù)充當(dāng)該計(jì)劃的主贊助商。NetBeansIDE是一個(gè)開發(fā)環(huán)境,也即一個(gè)供程序員編寫、編譯、調(diào)試和部署程序的工具。它是用Java編寫的,但卻可以支持任何編程語言。另外也有巨大數(shù)量的模塊來擴(kuò)展NetBeansIDE,它是一個(gè)免費(fèi)產(chǎn)品,不限制其使用形式。

JBuilder是Borland公司提供的跨平臺Java開發(fā)環(huán)境,可以用于構(gòu)建符合工業(yè)標(biāo)準(zhǔn)的Java應(yīng)用系統(tǒng),開發(fā)各類應(yīng)用程序。雙向、可視化設(shè)計(jì)工具使得用戶可以快速地構(gòu)建和部署各種J2EE應(yīng)用程序。JBuilder功能強(qiáng)大,易于使用,本書將其作為實(shí)驗(yàn)環(huán)境推薦給讀者使用。 1.6最簡單的Java程序

Java程序主要有Java應(yīng)用程序(JavaApplication)和Applet兩種。下面給出兩個(gè)最簡單的Java程序,從中可以了解Java語言程序的基本結(jié)構(gòu)。

1.6.1最簡單的Java應(yīng)用程序

【程序1.1】

最簡單的Java應(yīng)用程序。

/*HelloWorldApp.java*/

classHelloWorldApp{

/***Traditional“HelloWorld!”program.

*/

publicstaticvoidmain(Stringargs[]){

//Writetostdout.

System.out.println(“HelloWorld!”);

}

}

程序1.1是一個(gè)JavaApplication,它的功能很簡單,向標(biāo)準(zhǔn)輸出設(shè)備輸出字符串“HelloWorld!”,運(yùn)行該程序可以在顯示器上看到該字符串。從程序1.1中首先看到的是注釋語句,編譯器在編譯時(shí)將跳過該部分內(nèi)容。Java語言的注釋語句有兩種基本形式:

(1)以/*開始,以*/結(jié)束。其中的所有字符在編譯時(shí)被忽略。

(2)行注釋。以//開始到本行結(jié)束。

程序1.1定義了一個(gè)類HelloWorldApp,其中定義了一個(gè)方法main。有關(guān)類和方法的概念本書第3章將詳細(xì)描述。

main方法是程序的入口點(diǎn),Java應(yīng)用程序從main方法開始執(zhí)行,main方法執(zhí)行結(jié)束則該程序退出運(yùn)行。因此,如果一個(gè)程序由多個(gè)類構(gòu)成,則只能有一個(gè)類有main方法。程序1.1使用了JavaAPI完成字符串的輸出功能,System.out為標(biāo)準(zhǔn)輸出流對象,用于訪問操作系統(tǒng)的標(biāo)準(zhǔn)輸出設(shè)備,通常情況下標(biāo)準(zhǔn)輸出設(shè)備為顯示設(shè)備。println為其方法成員,其功能為輸出括號中的字符串或其他類型的數(shù)據(jù)并換行。類似的還有方法print,它與println的區(qū)別是輸出數(shù)據(jù)后不換行。

程序1.1的結(jié)構(gòu)比較簡單,只定義了一個(gè)類,在后面的章節(jié)中讀者將會看到包含多個(gè)類的程序。1.6.2最簡單的JavaApplet

JavaApplet的執(zhí)行環(huán)境與Java應(yīng)用程序不同,Applet不是獨(dú)立的應(yīng)用程序,它是嵌入在HTML文件中使用的,程序被放置在Web服務(wù)器上,下載到客戶端后,由Web瀏覽器如微軟的InternetExplorer執(zhí)行。

【程序1.2】

最簡單的JavaApplet。

importjava.applet.Applet;

importjava.awt.Graphics;

publicclassHelloWorldextendsApplet{

publicvoidpaint(Graphicsg)

{

g.drawString(“你好,Java世界!”,2,20);

}

}

程序1.2是一個(gè)最簡單的JavaApplet。下面是一個(gè)發(fā)布程序1.2的HTML文件的內(nèi)容,請注意其中斜黑體的內(nèi)容。

<html>

<head><title>我的第一個(gè)JavaApplet程序</title></head>

<body>

<p><appletcode=HelloWorld.classwidth=300height=200></applet>

</body>

</html>將上述HTML文件和程序1.2編譯得到的字節(jié)碼文件HelloWorld.class放在Web服務(wù)器的同一個(gè)目錄下,當(dāng)使用Web瀏覽器瀏覽該HTML文件時(shí),瀏覽器將下載HelloWorld.class,然后執(zhí)行。

因?yàn)閳?zhí)行環(huán)境與JavaApplication不同,Applet的程序結(jié)構(gòu)與JavaApplication也有所不同,當(dāng)然它們有一點(diǎn)是共同的,即都是由若干個(gè)類組成的。程序1.2的第1行表示該Applet程序需要引用JavaAPI類庫提供的Applet類。學(xué)習(xí)過C語言的讀者應(yīng)注意import與C語言中的?#inlcude類似,但Java編譯器的處理方法不同于C語言,它并不將該文件讀入,而且它引用的是已經(jīng)編譯過的Java字節(jié)碼文件。在編譯階段,Java編譯器將從該字節(jié)碼文件中讀取有關(guān)Applet類的信息,檢驗(yàn)程序中對Applet的使用是否正確。程序1.2編譯生成的HelloWorld.class文件中也不包含Applet類的代碼。第2行的作用與第1行類似,由于程序中用java.awt.Graphics類的功能來輸出字符串,因此引入該類。

第3行開始定義HelloWorld類,注意后面的extendsApplet,這是Java類繼承語法。一個(gè)Applet程序可以由多個(gè)類構(gòu)成,其中只有一個(gè)類繼承自Applet類,這是Applet程序的入口。

Applet的執(zhí)行與JavaApplication不同,從程序中看不到像Application中main方法那樣的一個(gè)明顯的執(zhí)行流程。實(shí)際上這些都已經(jīng)在Applet中實(shí)現(xiàn)了,Applet在執(zhí)行時(shí)一直等待用戶的輸入或其他的一些事件(如關(guān)閉瀏覽器),根據(jù)不同的事件執(zhí)行不同的功能。在編寫Applet時(shí)需要做的就是提供各種事件的處理程序,例如程序1.2類HelloWorld中定義了方法paint,該方法當(dāng)Applet需要繪制界面時(shí)被調(diào)用。

Applet類中定義了paint方法的調(diào)用形式,它有一個(gè)Graphics類的對象作參數(shù),通過它可以在Applet的界面上繪制圖形和文字。程序1.2調(diào)用drawString方法來輸出一個(gè)字符串:

g.drawString(“你好,Java世界!”,2,20);

drawString方法有三個(gè)參數(shù):第一個(gè)是要輸出的字符串;第二、三個(gè)是輸出位置,分別為x、y軸的值。

圖1.2是程序1.2在IE6.0中執(zhí)行的畫面。圖1.2Applet的運(yùn)行

實(shí)訓(xùn)一安裝與熟悉Java開發(fā)工具

A.

JDK開發(fā)工具

一、實(shí)訓(xùn)目的

1.學(xué)習(xí)從網(wǎng)絡(luò)上下載JDK開發(fā)工具與幫助文檔。

2.學(xué)習(xí)安裝JDK開發(fā)工具及其文檔。

3.掌握J(rèn)avaAppllcation程序的開發(fā)過程并編寫一個(gè)JavaApplication程序。

4.掌握J(rèn)avaApplet程序的開發(fā)過程并編寫一個(gè)JavaApplet程序。

5.學(xué)習(xí)編寫簡單的HTML文件以配合JavaApplet的使用。

6.學(xué)習(xí)使用JDK的幫助文檔。

7.給出JavaApplet、Application例子,調(diào)試程序、修改程序功能。

二、實(shí)訓(xùn)內(nèi)容

1.從網(wǎng)絡(luò)上下載JDK開發(fā)工具與幫助文檔。

(1)訪問,瀏覽JDK下載頁面,JDK5的下載頁面為/javase/downloads/index_jdk5.jsp,如圖1.3所示。也可以訪問其他國內(nèi)外的免費(fèi)FTP站點(diǎn)或從CD-ROM光盤中下載得到JDK開發(fā)工具。圖1.3JDK5下載頁面

(2)選擇適合的軟件版本,點(diǎn)擊,進(jìn)入圖1.4所示的頁面,選擇其中的“AcceptLicenseAgreement”接受許可協(xié)議。圖1.4接受許可協(xié)議

(3)在圖1.5所示的頁面中選擇適合用戶的JDK版本,點(diǎn)擊下載該JDK。在Windows環(huán)境下IE將彈出如圖1.6所示的對話框,點(diǎn)擊按鈕,然后選擇保存的文件目錄,IE會將文件下載到指定的位置。圖1.5選擇適合用戶平臺的JDK版本圖1.6文件下載保存提示

(4)按同樣的方法下載JDK的幫助文檔。下載鏈接參考圖1.3。

2.安裝JDK開發(fā)工具與幫助文檔。

(1)運(yùn)行下載的可執(zhí)行文件,安裝JDK。

(2)為方便運(yùn)行Java編譯器,設(shè)置環(huán)境變量Path。對于Windows95/98,修改計(jì)算機(jī)的C:\AUTOEXEC.BAT文件時(shí)應(yīng)在文件末增加一句:

setPath=%Path%;C:\jdk1.5.0_09\bin

這里,C:\jdk1.5.0_09為JDK的安裝目錄。對于WindowsXP及Windows2000等平臺,在控制面板中選擇“系統(tǒng)”圖標(biāo),在彈出的“系統(tǒng)屬性”對話框中單擊“高級”標(biāo)簽,再在彈出的對話框中單擊按鈕,如圖1.7所示。然后在圖1.8中的“系統(tǒng)變量”列表中選擇“Path”,單擊按鈕,在出現(xiàn)的對話框中仿照上面的set命令將C:\jdk1.5.0_09\bin加入到path環(huán)境變量中。圖1.7“系統(tǒng)屬性”對話框圖1.8環(huán)境變量設(shè)置

(3)使用解壓縮工具Winzip解壓JDK幫助文檔jdk-1_5_0-doc.zip文件,該壓縮文件包含一組以HTML文件形式組織的幫助文件,把它們保存在本地的一個(gè)目錄下,例如保存在C:\jdk1.5.0_09\document\目錄下。

3.編寫并運(yùn)行一個(gè)JavaApplicadon程序。

(1)打開一個(gè)純文本編輯器,例如Windows記事本NotePad.exe或DOS下的edit.exe。

(2)鍵入1.2節(jié)中的程序1.1。

(3)檢查無誤后(注意大小寫準(zhǔn)確)把文件保存起來,命名為HelloWorldApp.java,可以創(chuàng)建一個(gè)目錄,如C:\Java\prog1_1,保存這個(gè)文件。

(4)進(jìn)入DOS命令行方式,用cd命令進(jìn)入(3)中創(chuàng)建的目錄,運(yùn)行Java編譯器:

javacHelloWorldApp.java

(5)如果JDK安裝正確、程序輸入無誤且保存的文件名正確,運(yùn)行編譯器將沒有任何輸出;否則會輸出錯(cuò)誤信息,一般的錯(cuò)誤都是由于拼寫失誤引起的。運(yùn)行dir命令查看是否已在相同目錄下生成一個(gè)名為HelloWorldApp.class的文件。

(6)利用Java解釋器運(yùn)行這個(gè)JavaApplication程序,并查看運(yùn)行結(jié)果:

javaHelloWorldApp

4.編寫并編譯一個(gè)JavaApplet程序。

(1)打開一個(gè)純文本編輯器。

(2)鍵入1.2節(jié)中的程序1.2。

(3)創(chuàng)建一個(gè)目錄保存文件,命名為HelloWorld.java。

(4)進(jìn)入DOS命令行方式,在保存有上述Java文件的目錄下運(yùn)行Java編譯器:

javacHelloWorld.java

(5)如果程序輸入無誤且保存的文件名正確,運(yùn)行編譯器將沒有任何輸出;否則會輸出錯(cuò)誤信息。運(yùn)行dir命令查看是否已在相同目錄下生成一個(gè)名為HelloWorld.class的文件。

5.編寫配合JavaApplet的HTML文件。

(1)打開一個(gè)純文本編輯器。

(2)鍵入如下的HTML程序:

<html>

<head><title>我的第一個(gè)JavaApplet程序</title></head>

<body>

<p><appletcode=HelloWorld.classwidth=300height=200></applet>

</body>

</html>

(3)檢查無誤后把文件命名為Page1.htm,保存在與文件HelloWorld.java同一目錄下。

(4)直接雙擊這個(gè)HTML文件的圖標(biāo),或者打開Web瀏覽器(例如IE),在地址欄中鍵入這個(gè)HTML文件的全路徑名,查看Applet在瀏覽器中的運(yùn)行結(jié)果。

(5)利用模擬的Applet運(yùn)行環(huán)境解釋運(yùn)行這個(gè)JavaApplet程序并觀察運(yùn)行結(jié)果。進(jìn)入DOS環(huán)境,在程序所在目錄下運(yùn)行下面的命令:

appletviewerPage1.htm

6.使用JDK幫助文檔。

在Windows中打開JDK文檔目錄,雙擊indexhtml文件,或者在Web瀏覽器的地址欄中輸入這個(gè)文件的路徑名,打開這個(gè)文件對應(yīng)的網(wǎng)頁,查閱相關(guān)內(nèi)容。B.

JBuilder2006集成開發(fā)環(huán)境

一、實(shí)訓(xùn)目的

1.學(xué)習(xí)安裝JBuilder2006集成開發(fā)環(huán)境。

2.掌握集成開發(fā)環(huán)境(IDE)的概念,了解并學(xué)習(xí)使用JBuilder2006開發(fā)環(huán)境的基本構(gòu)成和功能。

3.了解“項(xiàng)目”的概念,掌握利用JBuilder2006開發(fā)并編譯運(yùn)行、修改及調(diào)試JavaApplication和JavaApplet的過程。

二、實(shí)訓(xùn)內(nèi)容

1.安裝JBuilder2006。

(1)將JBuilder2006光盤放入光盤驅(qū)動器,安裝程序會自動運(yùn)行,顯示如圖1.9所示的畫面。然后單擊BorlandJBuilder2006Enterprise啟動安裝進(jìn)程,稍候片刻,顯示如圖1.10所示的畫面。

(2)在圖1.10所示的畫面中單擊Next按鈕,在接下來的幾個(gè)畫面中分別接受Borland的許可協(xié)議、選擇安裝類型(選擇Full即可)、安裝目錄,最后開始復(fù)制文件,等待一段時(shí)間后安裝完畢。圖1.9安裝程序啟動畫面圖1.10JBuilder安裝簡介

(3)第一次啟動JBuilder2006出現(xiàn)注冊向?qū)?,如圖1.11所示,可按照要求提供注冊碼或注冊文件。圖1.11注冊向?qū)?/p>

2.編寫并運(yùn)行一個(gè)JavaApplication程序。

(1)啟動JBuilder,選擇File菜單的NewProject子菜單(如圖1.12所示),創(chuàng)建一個(gè)新項(xiàng)目。圖1.12創(chuàng)建新項(xiàng)目

(2)在圖1.13中輸入項(xiàng)目名(Name),存放項(xiàng)目文件的文件夾(Directory),單擊Finish按鈕。圖1.13輸入項(xiàng)目名和存放文件夾

(3)在Project窗口<ProjectSource>處右擊選擇新建文件,如圖1.14所示。圖1.14新建文件

(4)選擇文件類型(java),輸入文件名,如圖1.15所示。圖1.15選擇文件類型和文件名

(5)在源程序編輯區(qū)輸入源程序,如圖1.16所示。圖1.16輸入源程序

(6)編譯源程序。選擇Project菜單的子菜單MakeProject,如果編譯失敗將顯示錯(cuò)誤信息,按照提示修改程序后重新編譯即可。

(7)運(yùn)行程序。選擇Run菜單的子菜單RunProject可運(yùn)行程序。首次運(yùn)行需先進(jìn)行配置,指定項(xiàng)目類型和主類名稱后才能運(yùn)行。配置窗口如圖1.17所示,類型Type指定為Application,主類(MainClass)可點(diǎn)擊按鈕選擇,如圖1.18所示。運(yùn)行結(jié)果可以在Messages窗口中看到,如圖1.19所示。圖1.17運(yùn)行配置圖1.18選擇主類圖1.19運(yùn)行結(jié)果

(8)運(yùn)行完畢,可以關(guān)閉項(xiàng)目,創(chuàng)建新項(xiàng)目調(diào)試下一個(gè)程序。選擇File菜單的CloseProjects子菜單即可,如圖1.20所示。圖1.20關(guān)閉項(xiàng)目

3.編寫并調(diào)試一個(gè)JavaApplet程序。

(1)創(chuàng)建項(xiàng)目,輸入源程序,方法與創(chuàng)建JavaApplication相同。

(2)運(yùn)行程序。在運(yùn)行配置中選擇類型為Applet(見圖1.21),其余與Application相似,這里不再詳述。Applet運(yùn)行畫面如圖1.22所示。圖1.21項(xiàng)目類型選擇為Applet圖1.22Applet運(yùn)行畫面第2章Java語言基礎(chǔ)

2.1案例:課程成績統(tǒng)計(jì)程序2.2變量和常量2.3數(shù)據(jù)類型2.4運(yùn)算符與表達(dá)式2.5案例的初步實(shí)現(xiàn)2.6流程控制語句2.7案例的完整實(shí)現(xiàn)2.8程序舉例 2.1案例:課程成績統(tǒng)計(jì)程序

下面首先看一個(gè)案例,本章將圍繞該案例介紹所需掌握的知識。該案例是一個(gè)課程成績統(tǒng)計(jì)程序,所要求實(shí)現(xiàn)的功能如下:

某班級有若干名學(xué)生,教師在課程考試結(jié)束后,需要統(tǒng)計(jì)班級某門課的最高分、最低分及平均成績?,F(xiàn)要求編寫一個(gè)Java應(yīng)用程序,允許教師輸入學(xué)生人數(shù)和所有學(xué)生該門課的成績,然后輸出最高分、最低分及平均成績。

完成后程序運(yùn)行情況如圖2.1所示,輸入若干學(xué)生成績后輸出最高分、最低分和平均成績。圖2.1課程成績統(tǒng)計(jì)程序 2.2變?量?和?常?量

2.2.1變量的定義

本章案例要求從鍵盤接收用戶輸入的學(xué)生成績,學(xué)生成績輸入后必須存放到計(jì)算機(jī)內(nèi)部的存儲器中。在Java程序中可以通過變量的定義來聲明所需要的存儲空間,例如案例中的學(xué)生成績是一個(gè)0~100之間的整數(shù),在程序中可以采用下面的語句定義一個(gè)整型的變量來存儲一個(gè)學(xué)生的成績:

intstudentGrade;

這里定義了一個(gè)名為studentGrade的變量,其類型為int。一個(gè)變量的類型決定了它在存儲空間中所占據(jù)的字節(jié)數(shù)和表示形式,變量的值在程序執(zhí)行的過程中可以改變。變量名在程序設(shè)計(jì)語言中稱為標(biāo)識符,標(biāo)識符除了可以表示變量外,還可以用來表示后面將要介紹的類、方法、標(biāo)號及其他各種用戶自定義對象。

Java語言的標(biāo)識符可以由字母、數(shù)字、下劃線或$符號組成,以字母、下劃線或$符開頭,區(qū)分大小寫,對標(biāo)識符的長度沒有特別限定。

Java語言的基本符號采用Unicode字符集,而不是ASCII字符集,以方便支持多語種。Unicode字符集中,字母不僅限于英語,還包括其他語言的字符,包括漢字。Unicode字符集采用16位編碼,一個(gè)字符在內(nèi)存中占用兩個(gè)字節(jié)。雖然現(xiàn)有的多數(shù)程序使用ASCII編碼,但在運(yùn)行前都要被轉(zhuǎn)換為Unicode字符。

Unicode字符集中的字母包括英文字母以及序號大于十六進(jìn)制數(shù)0xC0的字符,因此可以使用漢字作標(biāo)識符。下面都是合法的Java語言標(biāo)識符:

變量1,$Str,_var1,myVar另外,與大多數(shù)程序設(shè)計(jì)語言一樣,Java語言也有一些系統(tǒng)保留的標(biāo)識符,稱為關(guān)鍵字或保留字。

目前Java語言用到的關(guān)鍵字有:abstract、boolean、break、byte、byvalue、case、catch、char、class、continue、default、do、double、else、extends、final、finally、float、for、if、implements、import、inner、instanceof、int、interface、long、native、new、null、package、private、protected、public、return、short、static、super、switch、synchronized、this、throw、throws、transient、try、var、volatile、void、while。

cast、const、future、generic、goto、operator、outer、rest等也被列為系統(tǒng)保留字,但目前的Java規(guī)范并未用到。另外,在VisualJ++中true、false也作為關(guān)鍵字使用。

Java語言中變量必須定義后才能使用,每個(gè)變量有各自不同的作用范圍,稱為作用域。Java語言中的變量定義有兩種形式:一種是類的成員,本書將在第3章介紹;另一種就是局部變量,指在方法或復(fù)合語句(由大括號括起的若干語句)中定義的變量,分別在所定義的方法或復(fù)合語句中起作用。圖2.2是一個(gè)簡單的例子。圖2.2變量的作用域變量定義的時(shí)候可以賦初值,例如:

intk=20;

定義一個(gè)整型變量k,其初值為20。

2.2.2常量的定義

有些數(shù)據(jù)在程序執(zhí)行過程中其值不可改變,例如數(shù)學(xué)常量π。Java語言中的常量分為兩種:一種稱為直接量,其字面代表了該常量的值;另一種是用標(biāo)識符表示的常量。

直接常量根據(jù)其類型的不同書寫的方法也不同,例如123、-780為兩個(gè)int型常量。使用標(biāo)識符定義常量,其形式與變量的定義類似,只是需要用關(guān)鍵字final修飾,表示該數(shù)據(jù)在執(zhí)行過程中不可修改。Java語言編譯器會做相應(yīng)的檢查,如果發(fā)現(xiàn)程序中有改變該常量值的語句,編譯器將指出錯(cuò)誤。下面的語句定義了一個(gè)int型常量:

finalintCOUNT=5;

該語句定義了一個(gè)名為COUNT的常量,并初始化其值為5。由于在程序執(zhí)行過程中常量的值不可改變,因此必須在定義時(shí)初始化。

有些教材將用這種方法定義的常量稱為final變量或只讀變量。 2.3數(shù)據(jù)類型

Java語言支持的數(shù)據(jù)類型可以分為簡單數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型兩類。簡單數(shù)據(jù)類型包括整型、實(shí)型、字符型和布爾型;復(fù)合類型包括類與接口。本章首先介紹簡單數(shù)據(jù)類型。

2.3.1整型

整型用來表示數(shù)學(xué)中的整數(shù)。Java語言的整型分為byte、short、int、long四種,它們占用的內(nèi)存大小及表示范圍見表2.1。表2.1Java整型數(shù)據(jù)字節(jié)數(shù)和取值范圍

Java語言中的整型常量可以采用十進(jìn)制、八進(jìn)制和十六進(jìn)制表示。十進(jìn)制表示方法最為常見,如123、-780。

在書寫十進(jìn)制常量時(shí),注意不能以0為打頭字符,因?yàn)镴ava語言中以0開始的整型常量被當(dāng)作八進(jìn)制處理,如017、-0234都是八進(jìn)制表示的整型常量。八進(jìn)制數(shù)據(jù)使用的數(shù)字字符只能是0~7,不能出現(xiàn)8、9。

十六進(jìn)制整型常量以0x或0X開始,如0x123、0x1AB。十六進(jìn)制數(shù)據(jù)使用的數(shù)字字符是0~9和A~F(或a~f)。

整型常量中,byte、short、int表示方法相同,而長整型(long)常量必須在數(shù)后加字母L或l,表示該數(shù)是長整型,如0L、306l。下面是整型變量定義的例子:

byteb; //指定變量b為byte型

shorts; //指定變量s為short型

inti=10; //指定變量i為int型,初始化為10

longl; //指定變量l為long型

也可以在一條語句中定義多個(gè)變量,變量名之間以逗號隔開,例如:

intx,y;2.3.2實(shí)型

Java語言的實(shí)型數(shù)據(jù)分為單精度實(shí)數(shù)(float)和雙精度實(shí)數(shù)(double)兩種,分別為32位和64位IEEE754-1985標(biāo)準(zhǔn)浮點(diǎn)數(shù)。這兩種類型所占內(nèi)存的字節(jié)數(shù)和表示范圍見表2.2,雙精度類型比單精度類型具有更高的精度和更大的表示范圍。表2.2實(shí)型數(shù)據(jù)字節(jié)數(shù)及范圍數(shù)據(jù)

Java的實(shí)型常量有兩種表示形式:

(1)十進(jìn)制數(shù)形式。由數(shù)字和小數(shù)點(diǎn)組成,且必須有小數(shù)點(diǎn),如0.123、.123、123.、123.0。

(2)科學(xué)計(jì)數(shù)法形式。如123e3或123E3,其中e或E之前必須有數(shù)字,且e或E后面的指數(shù)必須為整數(shù)。

實(shí)型常量缺省為double型,如果希望聲明某個(gè)實(shí)型常量為float型,則要在數(shù)字后加f或F,如12.3F,它在機(jī)器中占4個(gè)字節(jié),精度較低。實(shí)型變量的定義方法與整型變量的定義方法相同,如:

floatf=2.3f; //指定變量f為float型

doubled,yp=2.3; //指定變量d為double型

Java語言對數(shù)據(jù)類型的檢查很嚴(yán)格,不允許用雙精度的常量初始化單精度變量,因此下面的變量定義語句是錯(cuò)誤的:

floatf=1.23;2.3.3字符型

Java語言使用Unicode字符集,因此其字符型數(shù)據(jù)在內(nèi)存中占用2個(gè)字節(jié),共16位,其范圍為0~65535。

字符常量是用單引號括起來的一個(gè)字符,如‘a(chǎn)’、‘A’。對于一些特殊字符,如單引號?‘,由于該符號已用做字符常量的起始符號,因此不直接將它放在一對單引號中,而是通過轉(zhuǎn)義符字符來表示。

轉(zhuǎn)義字符以反斜杠(\)開頭,其后的字符轉(zhuǎn)變?yōu)榱硗獾暮x。表2.3列出了Java中的轉(zhuǎn)義字符。表2.3Java中的轉(zhuǎn)義字符字符型的類型標(biāo)識符為char,下面是定義字符型變量的例子:

charc=‘a(chǎn)’; //指定變量c為char型,且賦初值為‘a(chǎn)’

字符類型在計(jì)算機(jī)內(nèi)部的表示形式與整型數(shù)據(jù)類似,但Java語言不允許將字符型變量用作整型,但可與整型進(jìn)行混合運(yùn)算。例如:

inti=‘A’;

是非法的,而下面的語句是合法的:

inti=3;

i=i+‘0’;

Java語言用雙引號(")括起一串字符表示字符串常量,如"Thisisastring.\n"。但與前面介紹的幾種類型不同,字符串常量是作為字符串類String的一個(gè)對象來處理的。有關(guān)String的使用本書將在第3章講述。2.3.4布爾型

布爾型用以表示邏輯判斷的結(jié)果,只有兩個(gè)值:true和false。Java語言中關(guān)系運(yùn)算和邏輯運(yùn)算的結(jié)果均為布爾型。

布爾型變量用關(guān)鍵字boolean定義,例如:

booleanb=true; //定義b為布爾型變量,且初值為true

布爾型數(shù)據(jù)不可作為整型數(shù)據(jù)使用,不能等同于0和1。Java語言中應(yīng)該使用布爾型數(shù)據(jù)的地方,不可使用其他類型的數(shù)據(jù)。

true和false雖然不是關(guān)鍵字,但在編寫程序時(shí)應(yīng)將其作為關(guān)鍵字處理,以免在閱讀程序時(shí)引起誤解。 2.4運(yùn)算符與表達(dá)式

2.4.1概述

程序在運(yùn)行過程中會進(jìn)行各種各樣的運(yùn)算,例如案例1中求平均成績會用到求和運(yùn)算和除法運(yùn)算,求最高、最低成績會進(jìn)行比較運(yùn)算。Java語言提供了豐富多樣的運(yùn)算符來實(shí)現(xiàn)各種運(yùn)算。

運(yùn)算符是指明對操作數(shù)進(jìn)行何種運(yùn)算的符號。按操作數(shù)的數(shù)目可以分為單目運(yùn)算符、雙目運(yùn)算符和三目運(yùn)算符,它們分別有一個(gè)、兩個(gè)和三個(gè)操作數(shù)。Java語言中的運(yùn)算符按照功能來分有下面幾類:

(1)算術(shù)運(yùn)算符:+,-,*,/,%,++,--;

(2)關(guān)系運(yùn)算符:>,<,>=,<=,==,!=;

(3)布爾邏輯運(yùn)算符:!,&&,||,&,|;

(4)位運(yùn)算符:>>,<<,>>>,&,|,^,~;

(5)賦值運(yùn)算符:=,+=(復(fù)合賦值運(yùn)算符);

(6)條件運(yùn)算符:?:;

(7)其他運(yùn)算符:包括分量運(yùn)算符.、下標(biāo)運(yùn)算符[

]、實(shí)例運(yùn)算符instanceof、內(nèi)存分配運(yùn)算符new、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符(類型)、方法調(diào)用運(yùn)算符(

)等。

Java程序通過用各種不同的運(yùn)算符與操作數(shù)連接起來構(gòu)成的表達(dá)式來完成各種運(yùn)算的。本節(jié)主要講述前6類運(yùn)算符。2.4.2算術(shù)運(yùn)算符

算術(shù)運(yùn)算符是最基本的運(yùn)算符,用來實(shí)現(xiàn)基本的算術(shù)運(yùn)算,表2.4列出了Java語言的算術(shù)運(yùn)算符。表2.4Java語言的算術(shù)運(yùn)算符

+、-、*、/?運(yùn)算符實(shí)現(xiàn)數(shù)學(xué)中的加、減、乘、除運(yùn)算,其中運(yùn)算符?+?的功能有所擴(kuò)展,可以用它進(jìn)行字符串的連接,如“abc”+“de”,得到串“abcde”。除法運(yùn)算當(dāng)兩個(gè)運(yùn)算對象均為整型數(shù)據(jù)時(shí),作整除運(yùn)算。例如,45/4的值為10。

取模運(yùn)算符%為求余運(yùn)算,例如,21%4的值為1,25%5的值為0。Java語言中取模運(yùn)算的操作數(shù)也可以為浮點(diǎn)數(shù),如37.2%10=7.2。

++、--運(yùn)算符的運(yùn)算對象通常為變量,分別使運(yùn)算對象的值加1和減1。它們可以做前綴也可以做后綴,即?++i或i++,但其含義有一定的差別。i++?在使用i之后,使i的值加1,因此執(zhí)行完i++?后,整個(gè)表達(dá)式的值為原來i的值,而i的值加1。++i在使用i之前,使i的值加1,因此執(zhí)行完?++i后,整個(gè)表達(dá)式和i的值均為i原來的值加1。對i--與--i的運(yùn)算方式與?++?運(yùn)算符相似。假設(shè)i的值為5,則不管執(zhí)行i++?還是?++i后,i的值均為6,但第一個(gè)表達(dá)式的值為5,而第二個(gè)表達(dá)式的值為6。當(dāng)一個(gè)表達(dá)式中有多個(gè)運(yùn)算符時(shí),其運(yùn)算順序取決于運(yùn)算符的優(yōu)先級和結(jié)合順序。

當(dāng)一個(gè)表達(dá)式中有多個(gè)優(yōu)先級不同的運(yùn)算符時(shí),首先計(jì)算優(yōu)先級較高的運(yùn)算。例如表達(dá)式a+b*c,其中乘法運(yùn)算符的優(yōu)先級高于加法運(yùn)算,因此首先計(jì)算b*c,然后a與b*c所得的結(jié)果進(jìn)行加法運(yùn)算。

Java語言中算術(shù)運(yùn)算符的優(yōu)先級按下面的次序排列:++、--級別最高,然后是*、/、%,而+、-級別最低。如果一個(gè)表達(dá)式中有多個(gè)相同優(yōu)先級的運(yùn)算符,則按照其結(jié)合順序進(jìn)行運(yùn)算。例如表達(dá)式a+b-c中,加法運(yùn)算符與減法運(yùn)算符優(yōu)先級相同,它們的結(jié)合順序是從左至右,因此首先計(jì)算a+b,然后a+b所得結(jié)果與c進(jìn)行減法運(yùn)算。

當(dāng)一個(gè)表達(dá)式中有多個(gè)不同運(yùn)算符,運(yùn)算順序不能一目了然時(shí),建議將先運(yùn)算的部分加上括號(),減少出錯(cuò)的幾率,增加程序的可讀性。

【程序2.1】

算術(shù)運(yùn)算符的使用。

publicclassArithmaticOp{

publicstaticvoidmain(Stringargs[]){

inta=5+4; //a=9

intb=a*2; //b=18

intc=b/4; //c=4

intd=b-c; //d=14

inte=-d; //e=-14

intf=e%4; //f=-2

doubleg=18.4;doubleh=g%4;//h=2.4

inti=3;

intj=i++; //i=4,j=3

intk=++i; //i=5,k=5

System.out.println("a="+a);

System.out.println("b="+b);

System.out.println("c="+c);

System.out.println("d="+d);

System.out.println("e="+e);

System.out.println("f="+f);

System.out.println(“g=”+g);

System.out.println(“h=”+h);

System.out.println(“i=”+i);

System.out.println(“j=”+j);

System.out.println(“k=”+k);

}

}

編譯運(yùn)行,其結(jié)果為

a=9

b=18

c=4

d=14

e=-14

f=-2

g=18.4

h=2.3999999999999986

i=5

j=3

k=5

由于實(shí)數(shù)與整型數(shù)據(jù)不同,在計(jì)算機(jī)內(nèi)部存儲的值是不精確的,因此使得h的值看起來有點(diǎn)古怪。2.4.3賦值運(yùn)算符

賦值運(yùn)算的功能是將一個(gè)數(shù)據(jù)或表達(dá)式的值賦給一個(gè)變量。賦值運(yùn)算符是雙目運(yùn)算符,左邊的操作數(shù)必須是變量。

Java語言的賦值運(yùn)算符可以分為兩種:基本賦值運(yùn)算符和復(fù)合賦值運(yùn)算符。所有賦值運(yùn)算符的優(yōu)先級都相同,與其他運(yùn)算符相比,賦值運(yùn)算符的優(yōu)先級最低。

基本賦值運(yùn)算符是最簡單的賦值運(yùn)算符,格式為

變量名=表達(dá)式

先計(jì)算表達(dá)式,再將結(jié)果賦給變量,整個(gè)賦值表達(dá)式的值為賦值后變量的值。使用賦值運(yùn)算符時(shí),應(yīng)盡量使變量和表達(dá)式的數(shù)據(jù)類型一致,否則,先將表達(dá)式的值轉(zhuǎn)換為變量的數(shù)據(jù)類型再賦值。例如:

byteb=123;

inti;

i=b; //自動類型轉(zhuǎn)換

復(fù)合賦值運(yùn)算符是在基本運(yùn)算符的基礎(chǔ)上加上另一個(gè)運(yùn)算符,例如:

x*=a-b

這個(gè)表達(dá)式與下面的表達(dá)式等價(jià):

x=x*(a-b)

先計(jì)算復(fù)合賦值運(yùn)算符右邊的表達(dá)式,然后變量與該表達(dá)式的值進(jìn)行指定的運(yùn)算后將結(jié)果賦給該變量。常見的雙目算術(shù)運(yùn)算符如+、-、*、/、%以及下面將介紹的位運(yùn)算符>>、<<、&、|、^等都可以構(gòu)成復(fù)合賦值運(yùn)算符。2.4.4關(guān)系運(yùn)算符

關(guān)系運(yùn)算符用來比較兩個(gè)值,Java語言關(guān)系運(yùn)算的結(jié)果為布爾類型的值true或false。關(guān)系運(yùn)算符都是雙目運(yùn)算符,如表2.5所示。表2.5關(guān)?系?運(yùn)?算?符表2.5中的前四種關(guān)系運(yùn)算符的優(yōu)先級相同,高于后兩種,后兩種的優(yōu)先級也相同。關(guān)系運(yùn)算符的優(yōu)先級與前面的算術(shù)運(yùn)算符相比要低一些。

參與比較大小的兩個(gè)操作數(shù)或表達(dá)式的值可以是浮點(diǎn)型,但是浮點(diǎn)型數(shù)之間作“等于”比較是無意義的,因?yàn)檫\(yùn)算總有誤差,所以通常沒有絕對相等的浮點(diǎn)數(shù)。

2.4.5邏輯運(yùn)算符

Java語言的邏輯運(yùn)算符只能對布爾類型的數(shù)據(jù)進(jìn)行運(yùn)算,表2.6列出了Java語言支持的邏輯運(yùn)算符。

&&、||、^、&、|?為雙目運(yùn)算符,!?為單目運(yùn)算符。表2.7給出了邏輯運(yùn)算符的運(yùn)算規(guī)則。表2.6Java語言的邏輯運(yùn)算符表2.7邏輯運(yùn)算真值表從表2.7中可以看出,&&與&的真值完全一樣,||與|的真值完全一樣,那么它們在Java語言中有什么區(qū)別呢?

條件與(&&)和條件或(||)構(gòu)成的表達(dá)式求值規(guī)則是:先求出運(yùn)算符左邊的表達(dá)式的值,根據(jù)左邊表達(dá)式的結(jié)果決定是否需要求解右邊的表達(dá)式。例如:

booleanb1,b2,b3;

b1=false;

b2=false;

b3=b1&&(b2=true);由于b1的值為假,則表達(dá)式b1&&(b2=true)右邊部分b2=true無需計(jì)算即可得到結(jié)果,因此該部分不計(jì)算,b2的值不改變。

如果將該表達(dá)式中的“條件與”換為“邏輯與”,改成:

booleanb1,b2,b3;

b1=false;

b2=false;

b3=b1&(b2=true);

則不管前面b1的值為什么,b2=true都計(jì)算,該程序片斷運(yùn)行結(jié)束后,b2的值為true。條件或(||)與邏輯或(|)的區(qū)別與此類似。

【程序2.3】

關(guān)系運(yùn)算符與邏輯運(yùn)算符的使用。

publicclassRelationLogicOp{

publicstaticvoidmain(Stringargs[]){

inta=25,b=30;

booleand=a<b;

System.out.println(“a<b=”+d);

inte=3;

if(e!=0&&a/e>5)

System.out.println(“a/e=”+a/e);

intf=2;

if(f==0&(d=false))

System.out.println(“f=0”);

else

System.out.println(“f!=0”);

System.out.println(“d=”+d);

}

}

其運(yùn)行結(jié)果為:

a<b=true

a/e=8

f=0

d=true2.4.6位運(yùn)算符

位運(yùn)算符用來對整型和字符型數(shù)據(jù)按二進(jìn)制位進(jìn)行操作,Java語言提供的位運(yùn)算符見表2.8。表2.8Java語言的位運(yùn)算符

Java語言的整型數(shù)據(jù)也以補(bǔ)碼表示。補(bǔ)碼的最高位為符號位,正數(shù)的符號位為0,負(fù)數(shù)為1。補(bǔ)碼的規(guī)定如下:對于正數(shù),最高位為0,其余各位代表數(shù)值本身,如+42的補(bǔ)碼為00101010。而對負(fù)數(shù)而言,將該數(shù)絕對值的原碼按位取反,然后對整個(gè)數(shù)加1,即得該數(shù)的補(bǔ)碼,如-42的補(bǔ)碼為11010110(00101010按位取反后為11010101,+1后為11010110)。

按位與運(yùn)算符&為雙目運(yùn)算符,如果參與運(yùn)算的兩個(gè)值相應(yīng)位都為1,則該位的結(jié)果為1,否則為0。例如,3&5結(jié)果為1。按位或運(yùn)算符?|?也是雙目運(yùn)算符,參與運(yùn)算的兩個(gè)值只要兩個(gè)相應(yīng)位中有一個(gè)為1,則該位的結(jié)果為1。例如,3|5結(jié)果為7。

按位取反運(yùn)算符~是單目運(yùn)算符,對數(shù)據(jù)的每個(gè)二進(jìn)制位取反,即把1變?yōu)?,把0變?yōu)?。例如,~3的值為-4。3表示成二進(jìn)制為

0000000000000011

按位取反為

1111111111111100

該值為-4的補(bǔ)碼表示。對于“按位異或”運(yùn)算符?^,如果參與運(yùn)算的兩個(gè)值相應(yīng)位相同,則結(jié)果為0,否則為1,即0^0=0,1^0=1,0^1=1,1^1=0。例如,3^5結(jié)果為6。

左移運(yùn)算符<<用來將一個(gè)數(shù)的各二進(jìn)位全部左移若干位。例如,a=a<<2,使a的各二進(jìn)制位左移2位,右補(bǔ)0,若a=00001111,則a<<2=00111100。高位左移后溢出,舍棄不起作用。在不產(chǎn)生溢出的情況下,左移一位相當(dāng)于乘2,而且用左移來實(shí)現(xiàn)乘法比乘法運(yùn)算速度要快。右移運(yùn)算符>>用來將一個(gè)數(shù)的各二進(jìn)制位全部右移若干位。例如,a=a>>2,使a的各二進(jìn)制位右移2位,移到右端的低位被舍棄,最高位則移入原來高位的值。帶符號右移運(yùn)算以符號位填補(bǔ)空位,而不帶符號右移空位固定以0填補(bǔ)。因此負(fù)數(shù)帶符號右移若干位后仍為負(fù)數(shù),而不帶符號右移則變?yōu)檎龜?shù)。例如:

-17>>2 結(jié)果為-5;

-17>>>2 結(jié)果為1073741819。2.4.7條件運(yùn)算符

條件運(yùn)算符的格式如下:

(boolean_expr)?true_statement:false_statement

如果

boolean_expr為真,則計(jì)算true_satatement,將結(jié)果作為表達(dá)式的值;否則計(jì)算false_statement作為表達(dá)式的值。true_statement與false_statement應(yīng)為相同數(shù)據(jù)類型的表達(dá)式。例如:

booleanopr1=true,opr2=fales;

intcount1,count2;

count1=(opr1)?3:5;

count2=(opr2)?3:5;

該程序段執(zhí)行結(jié)束時(shí),count1的值為3,count2的值為5。2.4.8類型轉(zhuǎn)換

在編程時(shí),經(jīng)常會出現(xiàn)不同類型的數(shù)據(jù)進(jìn)行混合運(yùn)算的情況,運(yùn)算前應(yīng)將不同類型的數(shù)據(jù)轉(zhuǎn)換為相同類型。類型轉(zhuǎn)換有兩種方法:自動類型轉(zhuǎn)換和強(qiáng)制類型轉(zhuǎn)換。

整型、實(shí)型、字符型等數(shù)據(jù)混合運(yùn)算時(shí),Java語言編譯器可以對它們進(jìn)行自動類型轉(zhuǎn)換。轉(zhuǎn)換規(guī)則為從低級數(shù)據(jù)類型轉(zhuǎn)換為高級數(shù)據(jù)類型:

(1)(byte或short)opint→int;

(2)(byte或short或int)oplong→long;

(3)(byte或short或int或long)opfloat→float;

(4)(byte或short或int或long或float)opdouble→double;

(5)charopint→int。

這里箭頭左邊表示參與運(yùn)算的數(shù)據(jù)類型,op為運(yùn)算符(如加、減、乘、除等),右邊表示轉(zhuǎn)換后進(jìn)行運(yùn)算的數(shù)據(jù)類型。

混合運(yùn)算中如果高級數(shù)據(jù)要轉(zhuǎn)換成低級數(shù)據(jù),需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。例如:

inti=10;

byteb=(byte)i;這里使用了強(qiáng)制類型轉(zhuǎn)換運(yùn)算符把int型的值強(qiáng)制轉(zhuǎn)換為byte型,然后賦值給變量b。強(qiáng)制類型轉(zhuǎn)換運(yùn)算符為單目運(yùn)算符,優(yōu)先級高于其他運(yùn)算符。

采用強(qiáng)制類型轉(zhuǎn)換將高級類型數(shù)據(jù)轉(zhuǎn)換為低級類型數(shù)據(jù)會導(dǎo)致溢出或精度的下降,在使用時(shí)應(yīng)注意值的范圍。

2.5案例的初步實(shí)現(xiàn)

本節(jié)給出本章案例的一個(gè)初步實(shí)現(xiàn),用戶輸入兩個(gè)學(xué)生的成績后,程序輸出最高分、最低分和平均成績。

【程序2.4】

本章案例的初步實(shí)現(xiàn)。

importjava.util.Scanner;

publicclassch2c1{

publicstaticvoidmain(String[]args){

intfirstGrade,secondGrade;

Scannerinput=newScanner(System.in);

System.out.println("Pleaseinputthe1stgrade:"); firstGrade=input.nextInt();

System.out.println("Pleaseinputthe2ndgrade:");

secondGrade=input.nextInt();

System.out.println("Themaximumgradeis"

+((firstGrade>secondGrade)?firstGrade:secondGrade));

System.out.println("Theminimumgradeis"

+((firstGrade<secondGrade)?firstGrade:secondGrade));

System.out.println("Theaveragegradeis"+((firstGrade+secondGrade)/2.0));

}

}上面的程序使用了Java2SDK新增的一個(gè)類Scanner來實(shí)現(xiàn)數(shù)據(jù)的輸入,使用該類創(chuàng)建一個(gè)對象:

Scannerinput=newScanner(System.in);

其中System.in為標(biāo)準(zhǔn)輸入流,默認(rèn)情況下從鍵盤輸入數(shù)據(jù)。然后input對象調(diào)用nextInt()方法輸入一個(gè)整型數(shù)據(jù)。如果用戶需要輸入其他數(shù)據(jù)類型可以使用其他幾個(gè)方法,如next.Byte()、nextDouble()、nextFloat()、nextInt()、nextLine()、nextLong()、nextShort()等。nextLine()用于等待用戶輸入一個(gè)文本行并回車,該方法得到一個(gè)String類型的數(shù)據(jù)。 2.6流程控制語句

2.5節(jié)的程序結(jié)構(gòu)十分簡單,程序從main方法的第一條語句開始執(zhí)行,依次執(zhí)行下面的語句,執(zhí)行完最后一條語句后程序結(jié)束,這樣的結(jié)構(gòu)稱為順序結(jié)構(gòu)。

但是程序僅僅有順序結(jié)構(gòu)能實(shí)現(xiàn)的功能十分有限,本章案例要求輸入一個(gè)班級的學(xué)生成績,我們不可能像2.5節(jié)的程序那樣為每一個(gè)學(xué)生的分?jǐn)?shù)定義一個(gè)整型變量,因?yàn)檫M(jìn)行程序設(shè)計(jì)時(shí)并不知道學(xué)生數(shù),不可能按順序?qū)懗鏊蟹謹(jǐn)?shù)的輸入語句。要完整地實(shí)現(xiàn)本章案例要求的功能,需要更復(fù)雜的語句來控制程序的執(zhí)行流程。

Java語言的流程控制語句主要分為分支(選擇)、重復(fù)和跳轉(zhuǎn)三種類型,下面分別加以介紹。

2.6.1分支語句

分支語句提供了一種控制機(jī)制,使得程序可以根據(jù)指定的條件選擇執(zhí)行部分語句或跳過某些語句不執(zhí)行。Java語言提供了兩種分支語句:條件語句if-else和多分支語句switch。

1.條件語句if-else

if-else語句根據(jù)判定條件的真假來執(zhí)行兩種操作中的一種,格式如下:

if(布爾表達(dá)式)語句1

[else

語句2]

其中else子句是任選的,可以不出現(xiàn)。

if后表示條件的表達(dá)式只能是布爾類型的,如果該布爾表達(dá)式的值為true,則程序執(zhí)行語句1,否則執(zhí)行語句2。

語句1和語句2可以是單一的語句,也可以是復(fù)合語句(用大括號{}括起來的若干條語句)。如果是單一的語句,不要忘了語句后的分號。建議對單一的語句也用大括號括起,這樣程序的可讀性更好。

else子句不能單獨(dú)作為語句使用,它必須和if配對使用。else總是與離它最近尚未配對的if配對,可以通過使用大括號{}來改變配對關(guān)系。

【程序2.5】

比較兩個(gè)數(shù)的大小,并按從小到大的次序輸出。

publicclassCompareTwo{

publicstaticvoidmain(Stringargs[]){

doubled1=21.5,d2=33.2;

if(d2>=d1)

System.out.println(d2+“>=”+d1);

else

System.out.println(d1+“>=”+d2);

}

}

【程序2.6】

判斷某一年是否為閏年。

閏年的條件是符合下面二者之一:①能被4整除,但不能被100整除;②能被100整除,又能被400整除。

publicclassLeapYear{

publicstaticvoidmain(Stringargs[]){

intyear=2003;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論