Java語言程序設計教程_第1頁
Java語言程序設計教程_第2頁
Java語言程序設計教程_第3頁
Java語言程序設計教程_第4頁
Java語言程序設計教程_第5頁
已閱讀5頁,還剩267頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java語言程序設計教程,中國水利水電出版社,21世紀高等院校計算機系列教材,雷學生 主編,目 錄,第1章 Java語言概述 第2章 Java語言基礎 第3章 控制語句 第4章 類及其方法 第5章 繼承與多態(tài) 第6章 包和接口 第7章 異常處理 第8章 多線程編程 第9章 Applet編程 第10章 輸入與輸出 第11章 常用工具包和類,第1章 Java語言概述,Java語言是由Sun公司于1995年推出的一種新的編程語言,它是一種跨平臺、適合于分布式計算環(huán)境的純面向對象語言。Java語言及其擴展正在逐步成為互聯網應用的規(guī)范,掀起了自PC機以來的又一次技術革命。本章主要介紹Java語言的起源、

2、特點、簡單示例等。,1.1 Java語言的起源和發(fā)展 1.2 面向對象的程序設計 1.3 Java語言的特點 1.4 Java程序的運行,Return,1.1 Java語言的起源和發(fā)展,1.1.1 幾種典型語言的發(fā)展歷程 1.1.2 Java語言的起源 1.1.3 Java語言的發(fā)展,Return,一般認為,B語言導致了C語言的誕生、C語言演變出C+語言,而Java語言則明顯帶有C+語言的特征。本節(jié)將對Java語言的起源和發(fā)展作簡要介紹。,1.1.1 幾種典型語言的發(fā)展歷程,Return,Java總是和C+聯系在一起,而C+則是從C語言派生而來的,所以Java語言繼承了這兩種語言的大部分特性。

3、Java的語法是從C繼承的,Java許多面向對象特性都受到C+的影響。事實上,Java中幾個自定義的特性都來自于或可以追溯到它的這些前驅語言。略有不同的是,Java語言完全面向對象,從而摒棄了二者的不足之處。Java語言的誕生與過去約30年中計算機語言的不斷改進和發(fā)展密切相關?;谶@些原因,下面我們將簡要介紹一下這個發(fā)展歷程。,1現代編程語言的誕生:C語言 2對編程方法的新需要:C+語言 3時機的到來:Java語言的出現,1.1.2 Java語言的起源,Return,Java是由James Gosling、Patrick Naughton、Chris Warth、Ed Frank以及Mike

4、Sheridan等人于1991年在Sun Microsystems公司設計出來的,開發(fā)第一個版本花了18個月時間。該語言最初名叫“Oak”,后來發(fā)現“Oak”已經是Sun公司另外一種語言的注冊商標,于1995年更名為“Java”,即太平洋上一個盛產咖啡的島嶼的名字。從1992 的秋天Oak問世,到1995春天公開發(fā)布Java語言,許多人都對Java的設計和改進做出了貢獻。,1.1.3 Java語言的發(fā)展,Return,自從于1995年被正式推出之后,Java語言就以其獨特的優(yōu)勢迅猛發(fā)展,經過短短8、9年時間,成為迄今為止最為優(yōu)秀的面向對象語言。Java也從當初的一種語言而逐漸形成一種產業(yè),基于

5、Java語言的J2EE架構已成為微軟.NET平臺的強大競爭對手。 當初,Java語言最初的發(fā)布不亞于一場革命,但是它并不標志著Java快速革新時代的結束。在Java 1.0發(fā)布后不久,Java的設計者就已經制定出了Java 1.1、 Java 1.2、 Java 1.3、 Java 1.4 、Java 2、Java 2.1.4版。,1.2 面向對象的程序設計,1.2.1 面向對象技術的提出 1.2.2 面向對象的編程思想 1.2.3 面向對象編程的基本原則,Return,面向對象的編程思想由來已久,但真正意義上的純面向對象編程語言目前只有Java。本節(jié)將結合幾種高級語言對面向對象程序設計思想進

6、行簡要介紹。,1.2.1 面向對象技術的提出,Return,我們知道,所有的計算機程序均由兩類元素組成:代碼和數據。如何實現這兩類元素的有效結合而形成可運行的程序,是多年來程序設計人員所探索的問題。最初,程序的構筑一般圍繞“正在發(fā)生什么”而編寫代碼,這種方法被稱為面向過程的編程。使用這種方法編寫的程序都具有線性執(zhí)行的特點。面向過程的編程模型可認為是代碼作用于數據,像Pascal、C這樣的過程式語言采用此模型是相當成功的。然而,使用面向過程的方法對小程序的編寫可能是比較有效的,但當程序變得非常大且更為復雜時,就會出現種種問題,直至失去對代碼的有效控制。由此對軟件工程中的編程方法問題提出了新的要求

7、。 為了管理不斷增加的復雜性,另外一種編程方式被提了出來,即面向對象的編程(OOP,Object-Oriented Programming)。這種編程方式圍繞“誰將受到影響”進行,即以代碼的相關數據為核心點進行程序編寫。面向對象的編程著眼于它的數據(即對象)和為此數據嚴格定義的接口來組織程序,程序實際上是用數據控制對代碼的訪問。這種方式的最大特點是代碼與其相關數據被分離開來進行處理,有利于程序規(guī)模的擴大,而程序的可維護性得到增強。,1.2.2 面向對象的編程思想,Return,前面提到的面向過程程序,它遵循面向過程的問題求解方法,其中心思想是用計算機能夠理解的邏輯來描述和表達待解決的問題及其具

8、體的解決流程。數據結構和算法是面向過程問題求解的核心所在。而面向對象技術則代表了一種全新的程序設計思路,其觀察、表述、處理問題的方法,與傳統的面向過程的編程方法不同。面向對象的程序設計和問題求解力求符合人們日常自然的思維習慣,盡量分解、降低問題的難度和復雜性,從而提高整個求解過程的可監(jiān)測性、可控制性和可維護性,以此達到以較小代價和較高效率獲得較滿意效果之目的。 面向對象編程一個實質性的要素是抽象。,1.2.3 面向對象編程的基本原則,1封裝性 封裝(Encapsulation)是將代碼及其處理的數據綁定在一起的一種編程機制,該機制保證了程序和數據都不受外部干擾且不被誤用。一個對象的基本要素包括

9、屬性和作用在屬性上的操作(方法或事件)。對象的使用實現了數據抽象,它將一組數據和對這組數據的操作結合成一個內在的整體,不允許外界對這組數據任意進行訪問,這里就用到了封裝的原理。封裝的目的是為了實現數據隱藏和數據保護,為對象提供一個對外操作的接口,外界只能從對象所提供的操作接口來認識和操作該對象。,一般說來,面向對象的系統至少需具備三大特性:封裝性、繼承性、多態(tài)性。將封裝、繼承、多態(tài)(包括重載)等面向對象方法應用于程序的開發(fā)工具和開發(fā)過程中,不僅可以加快開發(fā)的速度,還可極大地增強程序的可維護性和可擴展性,提高代碼重用率。因此,在面向對象編程過程中需要遵循這三項原則。下面對它們分別作簡要介紹。,2

10、. 繼承性,繼承(Inheritance)是一個對象獲得另一個對象的屬性的過程。繼承很重要,因為它支持了層級分類的思想。眾所周知,大多數事物均可按層級(即從上到下、從高到低)分類管理。顯然,如果不使用層級的概念,在進行描述時,我們就不得不分別定義每個事物的所有屬性。使用了繼承,一個對象就只需定義使它在所屬類中獨一無二的屬性即可,因為它可以從它的父類那里繼承其他所有的通用屬性。所以,完全可以這樣說,正是繼承機制使一個對象成為一個更具通用性的類的一個特定實例成為可能。 繼承是現實生活中一個非常容易理解的概念。在面向對象的程序設計方法中,引入繼承機制的目的在于:其一,避免可公用代碼的重復開發(fā), 減少

11、數據冗余;其二,增強數據的一致性,盡量降低模塊間的耦合程度。,3多態(tài)性,多態(tài)(Polymorphism)來自于希臘語,表示“多種形態(tài)”,即允許一個接口被多個同類動作所使用的特征,具體使用哪個動作與應用場合有關。所謂多態(tài)性就是當不同的對象收到相同的消息時,產生不同動作的特性。這里所說的消息可以理解為方法或事件。通俗地講,多態(tài)性就是使用一個名稱來定義不同的方法,這些方法執(zhí)行類似的但又不同的操作,即以相同的接口來訪問功能不同的函數,從而實現“一個接口,多種方法”。,Return,4多態(tài)性、封裝性與繼承性的相互作用,如果使用得當,在由多態(tài)性、封裝性和繼承性共同組成的編程環(huán)境中可以寫出比面向過程模型環(huán)境

12、更健壯、擴展性更好的程序。精心設計的類層級結構是實現代碼可重用性的基礎;封裝可以使你在不破壞依賴于類公共接口的代碼基礎上對程序進行升級遷移;而多態(tài)性則有助于編寫清晰、易懂、易讀、易修改的程序。,1.3 Java語言的特點,1.3.1 語言特點概述 1.3.2 Java語言的具體特點 1.3.3 Java和C/C+的比較,Return,作為當前一種被廣泛使用的面向對象編程語言,Java具有多方面的特點。如果與其他眾多的編程語言作一下比較,會發(fā)現這些特點正是Java語言之所以如此風靡的原因所在。雖然Java在某些方面(例如資源耗費)也存在一些不足,但這絲毫不影響Java作為目前最優(yōu)秀面向對象編程語

13、言的地位。,1.3.1 語言特點概述,1Java的靈魂:字節(jié)碼 2Java的內涵:豐富的類庫,Return,Java是一種被廣泛使用的網絡編程語言,這是一種新的計算概念。網絡環(huán)境下的編程語言最需要解決的是可移植性和安全性問題。以字節(jié)方式進行編碼,使得程序不受運行平臺和環(huán)境的限制成為可能。Java語言還提供了豐富的類庫,使程序設計人員可以很方便地調用相關類建立起自己的系統。主要表現在:,1.3.2 Java語言的具體特點,1.簡單性 2.面向對象 3.分布性 4.魯棒性 5.可移植性,Return,Java作為一種高級程序設計語言,它除具有面向對象、編寫簡單、脫離機器結構、具有分布性、魯棒性、可

14、移植性、安全性特點外,并且提供了并發(fā)機制,解釋執(zhí)行具有很高的性能。同時,還具有動態(tài)性特點。主要表現在:,6.安全性 7.結構中立 8.高性能 9.多線程 10.動態(tài)性,1.3.3 Java和C/C+的比較,Return,對于變量聲明、參數傳遞、操作符、流控制等,Java使用了和C/C+相同的風格,這使得熟悉C/C+的程序員能很方便地進行編程語言切換。同時,Java實現并加強了其簡單、魯棒、安全等特性,也摒棄了C和C+中許多不合理的地方。主要表現在:,1.頭文件 2.全局變量 3.指針 4.內存管理,5.數據類型支持6.類型轉換 7.結構和聯合 8.預處理,1.4 Java程序的運行,1.4.1

15、 Java運行環(huán)境的安裝與配置 1.4.2 第一個Java程序 1.4.3 兩種類型的Java程序 1.4.4 Java環(huán)境的有關工具 1.4.5 Java程序的編寫開發(fā)工具,Return,由于Java是采用Java虛擬機進行解釋執(zhí)行的編程語言,它需要一定的軟件支撐環(huán)境才能夠運行起來。本節(jié)將先介紹Java的運行環(huán)境,然后介紹Java程序的編寫。,1.4.1 Java運行環(huán)境的安裝與配置,Return,編寫并運行Java程序,需要Java開發(fā)工具包(JDK,Java Development Kit)的支持。因此在編寫自己的第一個Java程序前,讀者需要先在自己的機器上安裝JDK。到目前為止,JD

16、K的發(fā)展經歷了JDK 1.0、JDK 1.1、JDK 1.2、JDK 1.3、JDK 1.4等幾個版本。,1.4.2 第一個Java程序,說明:保留字class來聲明一個新的類,其類名為HelloWorldApp,它是一個公共類(public)。整個類定義由大括號對括起來。在該類中,定義了一個main()方法,其中public表示訪問權限,指明所有的類都可以使用這一方法;static指明該方法是一個類方法,它可以通過類名直接調用;void則指明main()方法不返回任何值。對于一個應用程序來說,main()方法是必需的,而且必須按照如上的格式來定義。Java解釋器在沒有生成任何實例的情況下,以

17、main()作為入口來執(zhí)行程序。Java程序中可以定義多個類,每個類中可以定義多個方法,但是最多只有一個公共類,main()方法也只能有一個,作為程序的入口。在main()方法定義中的,括號中的String args是傳遞給main()方法的參數,參數名為args,它是類String的一個實例,參數可以為0個或多個,每個參數用“類名參數名”來指定,多個參數間用逗號分隔。在main()方法的實現中,只有一條語句: System.out.println(Hello World!); 它用來實現字符串的輸出?!?”后的內容為注釋。,下面是一個經典的Java入門程序,雖然只有短短幾行代碼,但其中的內容

18、卻很豐富,后面將作具體說明: public class HelloWorldApp public static void main (String args) / Output the first sentence: System.out.println(Hello World!); 此程序的作用是輸出下面一行信息: Hello World!,Java程序的編譯及運行,Return,首先,將其保存到一個名為HelloWorldApp.java的文件中。注意:文件名應該與類名相同,因為Java解釋器要求公共類必須放在與其同名的文件中。然后,對它進行編譯。 C:JavaBookjavac Hell

19、oWorldApp.java 編譯的結果是生成字節(jié)碼文件HelloWorldApp.class。最后,使用java命令來運行該字節(jié)碼文件。 C:JavaBookjava HelloWorldApp 其結果就是在顯示器上顯示出“Hello World!”這行文字。,1.4.3 兩種類型的Java程序,在Java中可以編寫兩類程序:應用程序(applications)和Java Applet(小應用程序)。應用程序是可以在控制臺上直接運行的程序,在創(chuàng)建應用程序時,Java與其他高級編程語言沒有太大區(qū)別,而Java的特色就在于它具有編制小應用程序的功能。小應用程序是可以在Internet中傳輸并在兼

20、容Java的Web瀏覽器中運行的應用程序。小應用程序實際上就是小型的Java程序,能像圖像文件、聲音文件和視頻片段那樣通過網絡動態(tài)下載,它與其他文件的重要差別是,小應用程序是一個智能的程序,能對用戶的輸入作出反應,并且能動態(tài)變化,而不是一遍又一遍地播放同一動畫或聲音。 前面對applications作了介紹,下面我們來介紹一下Java Applet的結構和應用。,Java Applet的結構和應用,Return,import java.awt.*; import java.applet.*; public class HelloWorldApplet extends Applet / This

21、 is an applet. public void paint(Graphics g) g.drawString(Hello World!, 30, 30); 該程序的功能是:在坐標(30,30)處輸出字符串“Hello World!”。 在這個程序中,沒有實現main()方法,這是Applet與Application(應用程序)的區(qū)別之一。為了運行該程序,首先也應將其保存到一個名為HelloWorldApplet.java的文件中,然后對其進行編譯: C:JavaBookjavac HelloWorldApplet.java 這樣將得到字節(jié)碼文件HelloWorldApplet.class

22、。由于Applet中沒有main()方法作為Java解釋器的入口,我們必須編寫HTML文件,然后將Applet嵌入其中,接著使用appletviewer來運行,或在支持Java的瀏覽器上運行。,該HTML文件如下。 An Applet 其中,使用標記來啟動HelloWorldApplet,code屬性指明字節(jié)碼所在的文件,width和height屬性指明applet所占區(qū)域范圍。最后,我們將此HTML文件存入AppletExp.htm,然后運行: C:JavaBookappletviewer AppExp.htm 此時,將彈出一個Applet瀏覽窗口,在其中指定區(qū)域顯示“Hello World

23、!”。,下面再看一個例子,1.4.4 Java環(huán)境的有關工具,Return,Java提供了一些常用的語言工具,主要包括: 1、java:解釋器 2、javac:編譯器 3、appletviewer:小應用程序瀏覽器 4、javah:頭文件生成器 5、javadoc:API文檔生成器 6、javap:類文件反匯編器 7、jdb:Java語言調試器 這些文件包括在/java/bin/目錄中,并可以在任何目錄中運行,前提是設置了運行程序的相應系統路徑。,1.4.5 Java程序的編寫開發(fā)工具,Return,最后將要說明一下Java程序的編寫開發(fā)工具。對于一般簡單程序的編寫,幾乎使用任何文本編輯器都可

24、以進行。例如操作系統所帶的記事本、寫字板等程序。本書中所涉及的Java程序一般使用UltraEdit編寫。UltraEdit是一個非常理想的Java程序編寫器,它目前的最新版本是Version 10。 如果要進行比較復雜的Java應用系統開發(fā),可使用專門的Java集成開發(fā)工具,如JBuilder、Visual J+、Visual Age、JCreator等。其中優(yōu)秀的開發(fā)工具支持與應用服務如BEA WebLogic、IBM WebSphere的集成。具體選用哪種開發(fā)工具要視項目的具體情況而定。,第2章 Java語言基礎,本章將介紹Java語言的基礎知識,包括基本語言要素、基本數據類型、變量、數

25、組、運算符等。扎實地掌握這些內容對后續(xù)學習是很有必要的。,2.1 預備知識 2.2 基本語言要素 2.3 基本數據類型 2.4 變量 2.5 數組 2.6 運算符,Return,2.1 預備知識,2.1.1 一個簡單的Java程序 2.1.2 兩種控制語句 2.1.3 關于程序塊,Return,在第1章中,我們已經學會了編寫“Hello World”這種極為簡單的Java程序。為了便于本章后面內容的敘述,本節(jié)將再介紹一個稍復雜的Java程序,使讀者在學習Java語言的基礎知識前也能夠編寫簡單的Java程序。,2.1.1 一個簡單的Java程序,class MyExample public st

26、atic void main(String args) int num; num = 200; System.out.println(This is num: + num); num = num * 2; System.out.print(The value of num * 2 is:); System.out.println(num); ,下面是一個簡單的Java程序。讀者將會看到,這個程序雖然不是很復雜,但其中所包含的內容和功能卻很豐富。,運行結果: This is num: 200 The value of num * 2 is: 400,對大多數的編程語言來說,程序源代碼文件的命名是

27、任意的,只要符合所運行的操作系統平臺的要求即可。但這對于Java來說就行不通。在開始進行Java編程前,讀者需要知道的第一件事情就是:源文件的名稱必須與主類名一致。這一點非常重要。對于上面的例子,源程序文件名就應該是MyExample.java。下面我們將解釋其中的原因。 在Java中,一個源程序文件被稱為一個編譯單元(Compilation Unit),它是包含一個或多個類定義的文本文件。Java編譯器要求源程序文件使用.java作為擴展名。請注意,文件擴展名的長度是4個字符,因此所用操作系統一定要有支持長文件名的能力。這就意味著DOS和Windows 3.x是不支持Java文件命名規(guī)則的。

28、 從上述示例程序中可以看出,程序中定義的類名也是MyExample,這不是巧合。在Java中,所有的代碼都必須駐留在類中。按照約定,類名必須與源程序的文件名相同,同時還要確保文件名的大小寫字母與類名一樣,因為Java是區(qū)分大小寫的。雖然文件名與類名必須一致的約定顯得似乎有些死板,但是這個約定有助于編程人員輕松地維護和組織程序。,1關于該程序的命名,在第1章中曾經涉及到這方面的內容。要編譯并運行示例程序MyExample,首先要運行編譯器程序javac,并在命令行上指定源程序文件名,具體格式如下。 C:javac MyExample.java 這樣,編譯器javac產生一個名為MyExample

29、.class的文件,該文件包含程序的字節(jié)碼。前面已討論過,Java字節(jié)碼中包含的是Java解釋程序將要執(zhí)行的指令碼,因此javac的輸出結果并不是可以直接運行的代碼。 要真正運行該程序,必須使用名為java的Java解釋器。具體方法是將類名MyExample作為一個命令行參數輸入,格式如下: C:java MyExample 如果程序運行正常,將輸出如下內容: This is num: 200 The value of num * 2 is: 400,2編譯和運行程序,提示:當Java源代碼被編譯后,每個單獨的類都被放入自己的輸出文件中,并以類的名字加.class擴展名為其文件名。這就是為什么

30、Java源程序文件必須與其中包含的類同名的原因源程序文件將與.class文件同名。運行Java解釋器,實際上是指定想要解釋器運行的類的名字,它會自動搜索包含該名字且?guī)в?class擴展名的文件。如果找到,它將運行包含在該指定類中的代碼。,Return,2.1.2 兩種控制語句,1.if控制語句 Java中的if控制語句與其他編程語言中的IF語句非常相似,并且與C/C+語言中的if語句的語法完全相同。它最簡單的形式如下: if(condition) statement; 其中:condition是一個布爾表達式。如果其值為真,那么執(zhí)行語句statement;如果其值為假,則語句statement

31、將被繞過而不被執(zhí)行。 例如下列語句: if (num 2008) println(You are welcome!); 該語句的功能是:如果變量num的值小于2008,那么條件表達式的值為真,方法println()將被調用執(zhí)行,否則方法println()被繞過而不被執(zhí)行。,盡管在后面的第3章中將詳細討論Java控制語句,這里我們還是先簡要介紹兩種控制語句,以便能在本章后面的例程中使用它們。,class IfSample public static void main(String args) int a,b; a = 100; b = 200; if(a b) System.out.print

32、ln(a now greater than b); ,下面的程序說明了if控制語句的用法。,運行結果: a is less than b a now equal to b a now greater than b,在幾乎所有的編程語言中,循環(huán)語句都是很重要的組成部分,這對于Java也不例外。事實上,在后面的有關章節(jié)中讀者將會看到,Java提供了一套功能強大的循環(huán)結構,而for循環(huán)也許是最通用的。如果讀者對C/C+熟悉,會發(fā)現Java的for循環(huán)和C/C+語言中的for循環(huán)操作完全一樣。 最簡單的for循環(huán)結構的形式如下: for(initialization; condition; itera

33、tion) statement; 其中,循環(huán)體的初始化部分(initialization)設置循環(huán)變量并為變量賦初始值。條件判斷部分(condition)是測試循環(huán)控制變量的布爾表達式。若測試結果為真,循環(huán)體(statement)繼續(xù)反復執(zhí)行;若測試結果為假,循環(huán)結束。迭代部分(iteration)的表達式決定循環(huán)控制變量在每次循環(huán)后是如何改變的。,2.for循環(huán)語句,class ForTest public static void main(String args) int a; for(a = 0; a10; a = a+1) System.out.println(This is a: +

34、 a); ,下面的這個短程序說明了for循環(huán)的使用方法。,運行結果如下: This is a: 0 This is a: 1 This is a: 2 This is a: 3 This is a: 4 This is a: 5 This is a: 6 This is a: 7 This is a: 8 This is a: 9,在該例子中,a是循環(huán)控制變量,它在for的初始化部分被初始化為零。在每次重復迭代(包括第一次)的開始,執(zhí)行條件測試a 10。如果測試的結果為真,則println()語句被執(zhí)行,然后執(zhí)行循環(huán)體的迭代部分。此過程將持續(xù)進行下去,直到條件測試的結果為假。,注意:通常在Ja

35、va專業(yè)程序員編寫的程序中,循環(huán)體的迭代部分很少會看到象“a = a + 1;”的語句。原因是:Java語言中有一個特殊的增量運算符,即“+”和“-”,它們的作用分別是為對象加1和為對象減1 。 這樣,前述的for循環(huán)語句通常寫成下列這樣: for(a = 0; a10; a+),Return,2.1.3 關于程序塊,在Java語言中,可以將2個或2個以上的語句組成一個語句組,這樣的一組語句被稱為程序塊(Codeblocks)。程序塊通過將所屬語句放在大括號中來實現。一旦創(chuàng)建了程序塊,它就成為一個邏輯單元,可以作為一個單獨的語句來使用。例如,程序塊可以作為Java中if控制語句和for控制語句

36、的目標。下面我們來看一下如下的if控制語句: if (a b) / begin a block a = b; b = 0; / end of block 本例中,如果a小于b,那么在程序塊內的兩條語句都將被執(zhí)行。因此,程序塊中的這2條語句組成一個邏輯單元,不能出現一條語句運行,而另一條語句不運行的情況。其中的關鍵點是如果你需要將兩個或多個語句在邏輯上連接起來,就可以將其放入一個程序塊中。,2.1.3 關于程序塊,又例如,下面的程序將for循環(huán)作為一個程序塊使用: class BlockTest public static void main(String args) int a,b; b =

37、20; / the target of this loop is a block for (a = 0; a 1 is true,Return,下面對以上程序代碼作幾點說明。首先,讀者已經看到了,當用方法println()輸出布爾類型的值時,顯示的是“true”或“false”;其次,布爾變量的值本身就足以用來對if語句進行控制,沒有必要將if語句寫成如下的形式。 if (b = true) . 另外,關系運算符(例如1的值就是“true”。在表達式111的兩邊額外地加上括號,是由于加號“+”運算符的優(yōu)先級比運算符“”的優(yōu)先級要高。,2.3.6 對字面量的進一步討論,在本章2.2.3小節(jié)中我們

38、曾簡要介紹過字面量(或常量)。現已介紹完基本數據類型,讓我們對字面量作進一步討論。,1整數型字面,整數可能是程序中最常用的類型。任何一個數字的值就是一個整數字面量。例如1、2、3、42等。這些都是十進制的值,這意味著對它們的描述基于數字10。在Java中,還有另外兩種進制被整數字面量使用:八進制(Octal,基數是8)和十六進制(Hexadecimal,基數是16)。八進制的值通過在它的前面加一個前導0來表示,而正常的十進制數字則不用前導零。這樣看起來有效的值09對八進制來說將產生一個編譯錯誤,因為9超出了八進制的范圍07。對編程人員來說,十六進制更常用,它清楚地與8的大小相匹配,如8、16、

39、32、64等。通過前導的0 x或0X表示一個十六進制的字面量。十六進制數的范圍是015,用AF(或af)來替代1015。 整數字面量產生int值,在Java中它是32位的整數值。既然Java對類型要求嚴格,你可能會納悶,為什么將一個整數字面量賦給Java的其他整數類型如byte或long而沒有產生類型不匹配的錯誤呢。慶幸的是,這個問題已很好解決。當一個字面量的值被賦給一個byte或 short型的變量時,如果字面量的值沒有超過對應類型的范圍則不會產生錯誤。所以,一個字面量總是可以被賦給一個long變量。但是,指定一個long字面量,你需要清楚地告訴編譯器字面量的值是long型,這可以通過在字面

40、量的后面加一個大寫或小寫的L來做到這一點。例如0 x7ffffffffffffffL(或9223372036854775807L)就是long型中最大的。,2浮點型字面量,浮點數是指具有小數部分的十進制數值,它們可以通過標準記數法或者科學記數法來表示。 標準記數法(Standard notation)由整數部分加小數點加小數部分組成。例如2.0、3.14159、0.6667等都是有效的標準記數法的浮點數值??茖W記數法(Scientific notation)是浮點數加一表明乘以10的指定冪次的后綴,指數是緊跟E或e的一個十進制的數字,它可以是正值、零或者負值。例如6.022E23、314159

41、E-05、2e+100等。 Java中的浮點字面量默認是雙精度。為了指明一個浮點字面量,編程人員必須在字面量后面加F或f。當然,你也可以通過在字面量后面加D或d來指明一個雙精度浮點字面量,但這樣做當然是多余的。默認的雙精度類型要占用64位存儲空間,而精確度低些的浮點類型僅僅需要32位。,3布爾型字面量,布爾型字面量很簡單,因為布爾型字面量只有兩個邏輯值:treu(真)或false(假)。真值或假值不會改變任何數字的表示。在Java中,真字面量的值不等于1,假字面量的值也不等于0,它們僅僅能被賦給已定義的布爾變量,或在布爾的運算符表達式中使用。這一點與C/C+中是不同的。,4字符型字面量,我們已

42、經知道,Java采用Unicode字符集來表示字符。Java的字符是16位值,可以被轉換為整數并可進行像加或減這樣的整數運算。通過將字符包括在單引號之內來表示字符字面量。所有可見的ASCII字符都能直接被包括在單引號之內,例如a,z,and 。對于那些不能直接被包括的字符,有若干轉義序列,這樣允許你輸入所需要的字符。例如,代表單個引號字符本身,n代表換行符字符。 為直接得到八進制或十六進制字符的值也有一個機制。對八進制來說,使用反斜線加3個阿拉伯數字。例如,141是字母a。對十六進制來說,使用反斜線和u加上4個十六進制阿拉伯數字。例如,u0061因為高位字節(jié)是零,代表ISO-Latin-1字符

43、集中的a。ua432是一個日文片假名字符。教材P41頁表2-5列出了Java中的字符轉義序列。,5字符串字面量,同其他大多數編程語言一樣,Java中的字符串字面量使用雙引號括起來。字符串字面量的例子如下。 Hello World! threenlines This is in quotes 為字符型字面量所規(guī)定的字符轉義序列和八進制/十六進制記法,在字符串內同樣是適用的。對于Java字符串,應特別注意的是它們必須在代碼的同一行開始、同一行結束,而不像某些語言有換行連接轉義序列。 注意:讀者可能知道,在其他大多數語言(包括C/C+)中,字符串作為字符的數組被實現,然而在Java中卻并非如此。在J

44、ava中,字符串實際上是對象類型,Java是將字符串作為對象實現的。因此,它有廣泛的字符串處理能力,而且功能既強又好用。 在Java中,如果要聲明真正意義上的常量(即使用標識符代表某個常值),可使用關鍵字final(類似于C/C+中的const)。例如,在下面的例子中就聲明了一個int類型常量: final int ARRAY_SIZE = 5;,Return,2.4 變量,2.4.1 Java變量的聲明 2.4.2 變量的作用域和生存期 2.4.3 類型轉換,Return,變量是Java程序中的一個基本存儲單元。變量由一個數據類型、標識符以及一個可選初始值的組合來進行定義。此外,所有的變量都

45、有一個作用域,指定變量的可見性和生存期。本節(jié)將對Java變量及其相關問題作詳細說明。,2.4.1 Java變量的聲明,在Java中,所有的變量必須先聲明再使用?;镜淖兞柯暶鞣椒ㄈ缦?。 type identifier = value,identifier = value . ; 其中,type應是Java的基本類型之一,或者類及接口類型的名字(關于類和接口將在本書后面有關章節(jié)中討論)。identifier(標識符)是變量的名字,其后用一個等號和一個值來初始化變量。需要注意的是,初始化表達式的取值必須與指定變量類型一樣或兼容。在聲明指定類型的多個變量時,使用逗號將各變量分開。 以下是變量聲明的幾

46、個例子,其中有一些已經進行了初始化: int a, b, c; / declares three ints, a, b, and c. int d = 3, e, f = 5; / declares three more ints, initializing d and f. byte g = 123;/ initializes g. double pi = 3.1416;/ declares an approximation of pi. char x = x;/ the variable x has the value x. 不難知道,你所選擇的標識符名稱沒有任何表明它們相應類型的成分。許

47、多讀者可能還記得FORTRAN語言中預先規(guī)定從I到N的所有標識符都為整型變量,而其他標識符為實型變量。Java則允許任何合法的標識符具有任何它所聲明的數據類型。,1聲明一個變量,Return,盡管前面的例子中僅將字面量作為其初始值,Java語言也允許在變量聲明時使用任何有效的表達式來動態(tài)地初始化變量。例如,下面的程序代碼用于在給定直角三角形兩個直角邊長度的情況下,求其斜邊長度。 / Demonstrate dynamic initialization. class DynInit public static void main(String args) double a = 3.0, b =

48、4.0; / c is dynamically initialized: double c = Math.sqrt(a * a + b * b); System.out.println(Hypotenuse is: + c); 在這里,我們定義了3個局部變量a、b、c。前兩個變量a和b被初始化為常量,而直角三角形的斜邊c則被動態(tài)地初始化(使用勾股定理)。該程序用了Java中另外一個內置的方法sqrt(),它是Math類的一個成員,計算它的參數的平方根。這里關鍵的一點是初始化表達式可以使用任何有效的元素,包括方法調用、其他變量或字面量。,2動態(tài)初始化,2.4.2 變量的作用域和生存期,大多數計算

49、機編程語言定義了兩大類作用域:全局和局部。然而,這些傳統型的作用域并不適合Java的嚴格的面向對象編程模型。將一個變量定義為全局變量當然是可行的,但這是例外而不是規(guī)則。在Java中,兩個主要的作用域是通過類和方法定義的。盡管類的作用域和方法的作用域的區(qū)別有點人為規(guī)定,因為類的作用域有若干獨特的特點和屬性,而且這些特點和屬性不能應用到方法定義的作用域,但這些差別還是很有意義的。類(以及在其內定義的變量)的作用域問題我們將在本書后面的章節(jié)中介紹。到現在為止,我們將僅僅考慮由方法或在一個方法內定義的作用域。,到目前為止,我們所使用的所有變量都是在方法main()后面被聲明。事實上,Java允許變量在

50、任何程序塊內被聲明。前面已經說明過了,程序塊被包括在一對大括號中。一個程序塊定義了一個作用域。這樣,每當開始一個新塊,你就創(chuàng)建了一個新的作用域。不難發(fā)現,一個作用域決定了哪些對象對程序的其他部分是可見的,也決定了這些對象的生存期。,下面對作用域問題作幾點說明: (1)方法定義的作用域以它的左大括號開始。但是,如果該方法有參數,那么它們也被包括在該方法的作用域中。參數問題在后面章節(jié)中將作進一步的討論,因此現在可認為它們與方法中其他變量的作用域是一樣的。 (2)作為一個通用規(guī)則,在一個作用域中定義的變量對于該作用域外的程序是不可見(即訪問)的。因此,當你在一個作用域中定義一個變量時,你就將該變量局

51、部化并且保護它不被非授權訪問和/或修改。實際上,作用域規(guī)則為封裝提供了基礎。 (3)作用域可以進行嵌套。例如,每當你創(chuàng)建一個程序塊,就創(chuàng)建了一個新的嵌套的作用域。這樣,外面的作用域包含內部的作用域。這意味著外部作用域定義的對象對于內部作用域中的程序是可見的。但反過來就不是,內部作用域定義的對象對于外部是不可見的。,考察下面的程序。 / Demonstrate block scope. class ScopeExample public static void main(String args) int x; / known to all code within main x = 10; if

52、(x = 10) / start new scope int y = 20; / known only to this block / x and y both known here. System.out.println(x and y: + x + + y); x = y * 2; / y = 100; / Error! y is not known here. / x is still known here. System.out.println(x is + x); ,正如注釋中說明的,在方法main()的開始定義了變量x,因此它對于main()中的所有的隨后代碼都是可見的。在if程序

53、塊中定義了變量y,因為一個塊定義一個作用域,y僅僅對在它的塊以內的其他代碼可見。這就是在它的塊之外的程序行y=100;被注釋掉的原因。如果你將該行前面的注釋符號去掉,編譯程序時就會出現錯誤,因為變量y在它的程序塊之外是不可見的。在if程序塊中可以使用變量x,因為塊(即一個嵌套作用域)中的程序代碼可以訪問被其包圍作用域中所定義的任意變量。顯然,變量可以在程序塊內的任何地方被聲明,但是只有在他們被聲明以后才是合法有效的。因此,如果你在一個方法的開始定義了一個變量,那么它對于在該方法以內的所有程序都是可用的。反之,如果你在一個程序塊的末尾聲明了一個變量,它就沒有任何用處,因為沒有程序會訪問它。,另一

54、個需要注意的地方是:變量在其作用域內被創(chuàng)建,離開其作用域時被撤消。這意味著一個變量一旦離開它的作用域,將不再保存它的值了。因此,在一個方法內定義的變量在幾次調用該方法之間將不再保存它們的值。同樣,在塊內定義的變量在該塊被舍棄時,也將丟掉它的值。因此,一個變量的生存期就被限定在它的作用域之內。 如果一個聲明定義包括了動態(tài)初始化,那么每次進入聲明它的程序塊時,該變量都要被重新初始化。例如,考慮如下的程序。,/ Demonstrate lifetime of a variable. class LifeTime public static void main(String args) int x;

55、for(x = 0; x 3; x+) int y = -1; / y is initialized each time block is entered System.out.println(y is: + y); / this always prints -1 y = 100; System.out.println(y is now: + y); ,可以看到,每次進入內部的for循環(huán),y都要被重新初始化為-1。這樣,即使它隨后被賦值為100,該值還是被丟棄了。,運行結果如下: y is: -1 y is now: 100 y is: -1 y is now: 100 y is: -1 y

56、is now: 100,Return,另外還有一點,盡管程序塊能被嵌套,但不能將內部作用域聲明的變量與其外部作用域聲明的變量重名。在這一點上,Java不同于C和C+。下面的例子企圖為兩個獨立的變量起同樣的名字。在Java中,這是不合法的。但在C/C+中,它將是合法的,而且兩個變量bar將是獨立的。 / This program will not compile class ScopeErr public static void main(String args) int bar = 100; / creates a new scope here. int bar = 200; / Compile-time error bar already defined! ,2.4.3 類型轉換,如果讀者以前有一定的編程經驗,那么就應該知道將一種類型的值賦給另外類型的一個變量是相當常見的。如果這兩種類型是兼容的,那么Java將自動地進行轉換。例如,將int類型的值賦給long類型的變量,總是可行的。然而,不是所有的類型都是兼容的

溫馨提示

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

評論

0/150

提交評論