版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章Java語言概述2.1Java語言的優(yōu)勢與特點2.2Java語言的基本語法2.3流程控制語句1991年,Sun公司的JamesGosling等人,為在電視機、烤面包箱等家用消費類電子產品上進行交互式操作而開發(fā)了一個名叫Oak(一種橡樹的名字)的語言。由于商業(yè)上的種種原因,這種語言始終沒有投放到市場中,而且連Oak這個名字也成了問題,因為已經有上百家公司在使用這個名字,所以Sun公司根本無法將之注冊為商標。最終,Sun公司決定,將這種語言改名為Java,并且在互聯網上發(fā)布,免費提供下載。
當時,由于Oak的失敗,有一些傳謠者鼓吹Java這些字母代表"只是又一個無意義的縮寫詞"(JustAnotherValuelessAcronym)。Sun公司否認了這一說法,而且說Java是語言開發(fā)者在喝一種原產于印度尼西亞爪哇群島的咖啡時,出于一時的靈感而碰撞出的火花。
幾個月后,出乎所有人的意料,Java成為賽博空間最熱門的話題。Java被越來越多的用戶使用,受到越來越多的重視。上百個Java小應用程序在互聯網上的多媒體應用中流行起來。一些著名的公司,如微軟、IBM、蘋果電腦、數字設備公司,紛紛購買了Java語言的使用權,隨之大量出現了用Java編寫的軟件產品。Java受到業(yè)界的重視與好評。微軟總裁比爾·蓋茨在悄悄地觀察了一段時間后,也感慨地說:"Java是長時間以來最卓越的程序設計語言"。Java為什么會在短時期內受到如此多的程序員歡迎?為什么在計算機行業(yè)競爭激烈的今天,一個計算機硬件公司開發(fā)出來的語言,會一下子得到幾乎世界上各大計算機軟、硬件公司的支持呢?
Java最重要的特征在于它的操作平臺無關性,這是以往任何一種語言都不具備的特征。也就是說,用Java語言編寫的程序可以在任何一臺計算機上運行,而不管該計算機使用何種操作系統,要知道,這可是廣大程序員的一個夢想。
其次,Java是一種面向對象的語言。長期以來,人們一直在設法爭取問題空間同求解空間在結構上的一致,以使我們在分析、設計和實現程序時,同我們認識客觀世界的過程盡可能一致,因此產生了面向對象的程序方法。Java就是這樣一種面向對象的語言,不僅如此,它還代表了面向對象程序設計方法在目前的最高應用水平。對一個程序員來說,這意味著可以將注意力集中在應用程序的數據和處理數據的方法上,而無需過多地考慮處理過程。
此外,Java還是一種非常簡單的語言。Java的前身Oak,是為家用電器產品設計的,只有簡單易用才能推廣開來,因此,這種語言被設計得簡單而高效。程序員只需理解一些基本的概念,就可以用它編寫適合各種情況的應用程序了。最后,安全性也成為Java受青睞的一個方面。因為在網絡環(huán)境中,安全是需要認真考慮的一個問題。沒有安全的保障,用戶絕對不會從Internet上隨意一個站點上下載一個Java小應用程序,并在自己的計算機上運行。Java語言提供了若干種安全機制來抵御病毒產生或侵入文件系統。這一點也讓用戶們非常放心。Java的出現確實給計算機行業(yè)吹來了一股清風;它帶來了很多新鮮而有趣的思想和觀念;它甚至改變了人們使用計算機的方式。就連環(huán)球信息網WWW的創(chuàng)始人也說:"計算機行業(yè)發(fā)展的下一個浪潮就是Java,并且很快就會發(fā)生。"
如今,在美國硅谷,不懂得Java的人是無法找到工作的。在我國,許多計算機權威人士都斷言,誰先掌握了Java,誰就號準了世界的脈搏,就能在信息時代找到自己的立足之地。
研究機構EvansData公司最近公布的調查結果顯示,Java將在2003年超過C/C++成為全球軟件開發(fā)人員的首選語言。參加本次調查的編程人員來自60多個國家,他們中60%的人在2003年將更多地使用Java,所用時間超過使用C/C++或VB。公布本次調查結果的EvansData公司副總裁Garvin說,自該公司1998年首次開始跟蹤Java的使用情況起,Java用戶總數不斷增加。她說:"Java在北美之外的發(fā)展更強勁。至少一半被調查的來自各國的開發(fā)人員目前使用Java。事實上,他們使用Java的平均時間由1999年的9.1%上升到目前的17.7%。"盡管最初存在由于Sun公司的專有立場和該公司與操作系統社區(qū)的矛盾而造成的有關Java的爭議,但是Java不斷作為技術"熱點"蠶食C/C++市場。其主要原因是Java具有許多C++所沒有的優(yōu)點,如簡單性、更好的內存管理和跨平臺功能。相反,在過去三年里,C++在各國開發(fā)人員中的占有率減少。EvansData說,目前被調查的開發(fā)人員有25%的時間使用C++,而這一數字將在2002年進一步減少。但是這家市場研究機構仍認為C/C++由于其已經生成的巨大代碼量,不可能很快消逝。
至于C#,一種與C++相似但與Microsoft.Net倡議密切相連,具備類似Java語言特性的新語言,這份調查顯示,3/4的開發(fā)人員表示還沒有采用它的計劃。Garvin說,有可能采用C#的開發(fā)人員可能是那些已經使用某種Microsoft編程語言的用戶。2.1Java語言的優(yōu)勢與特點Sun公司這樣形容自己的Java語言:它是一種簡單、面向對象、分布式、解釋型、穩(wěn)定、安全、結構中立、易移植、高性能、多線程的動態(tài)語言。這段長長的定語準確地描述了Java語言的基本特征,也道出了Java為何流行的秘密。
可以說,程序設計語言的優(yōu)點,Java幾乎全都擁有。從實際的應用開發(fā)來看,也確實如此。但有一點需注意的是,由于Java是經過編譯器生成字節(jié)碼后再通過解釋器對其解釋執(zhí)行,其運行速度會比較慢。下面就上述的特點逐一進行闡述。1.簡單性
Java是一種簡單的語言。這點主要表現為簡單易學,在形式上它和C/C++極為相似,而且其運行系統小(Java的基本解釋器只有40KB,加上標準庫和線程支持也不過215KB)。我們知道,C++中的結構、聯合和類的概念重合之處很多,而Java只保留了類的概念,減少了復雜性。運算符重載是C++的一大特點,一度被認為簡化了程序設計,但實際上用得非常少,作用也不大,反而加重了程序員的負擔,Java把它也給去掉了。
多重繼承一直是一個有爭議的問題,贊成者認為它為面向對象語言帶來了方便性和通用性,增加了語言的表達能力,反對者聲稱它是一個不必要的特征,容易混淆,難以使用,浪費機器資源,實際價值有限,所以Java把它也取消了,而帶之以接口“interface"。Gosling同時認為,C++的預處理程序、標題文件、goto語句和隱式類型轉換,都增加了程序的不可讀性,容易出問題,所以全部給取消了。2.面向對象在程序的開發(fā)設計過程中,程序員一直在設法爭取問題空間同求解空間在結構上盡可能一致,以使我們在分析、設計和實現程序時,同我們認識客觀世界的過程盡可能地一致,因此產生了面向對象程序設計方法。所謂面向對象的設計方法,是基于信息隱藏和抽象數據類型概念,把系統中所有資源,如數據、模塊以及系統都看成是對象。每個對象封裝數據和方法,而方法實施對數據的處理,并且通過繼承機制實現代碼復用。
傳統的面向對象語言各有不足,如C++語言,由于繼承了C的大量特性,如獨立的函數概念,因而變得復雜而難用,而純粹的面向對象語言如Smalltalk、Eiffel,卻是動態(tài)性有余,效率不高。Java完全具備面向對象的四大特點:封裝、繼承、多態(tài)和動態(tài)。其封裝性比C++好,它沒有全程變量,沒有主函數main。在Java中絕大部分成員是對象,只有簡單數字類型、字符類型、布爾類型除外,以便保持高性能。Java提供給用戶一系列的類(class),一個或多個class可以組成一個包(package)。Java的class和C++的一樣有層次結構,子類可以繼承父類的屬性和方法。Java類中方法均缺省為虛函數。Java的面向對象與許多語言都有相通之處,與C++自不必說,因為Java幾乎是C++的一個子集,熟悉C++編程的人很快會習慣Java編程。學過Pascal的讀者對Java可能也有似曾相識的感覺,因為Java的package和Pascal中的Unit非常相似,都是表示某些程序塊的輸入。運算符重載在C++中一向被認為是一種優(yōu)雅的多態(tài)機制,但在實踐中,人們發(fā)現,運算符重載會使程序變得難以理解,Java的設計者最后取消了運算符重載,只在字符串連接運算中留了一些運算符重載的痕跡,例如用“+”實現字符串的連接。Java語言面向對象結構的動態(tài)性很高,C++中,如果修改了某一個類,整個程序都得重新編譯。在Java中,可以在類庫中自由地加入新的方法和實例變量,而不影響用戶的程序執(zhí)行。雖然C++也可以實現這種動態(tài)性,但使用起來非常復雜,代價也很高。3.分布式
Java是一種面向對象的程序設計語言,它也支持網絡上的應用程序,是一種分布式(distributed)程序設計語言。使用Java提供的類庫,比如,可以方便地支持TCP/IP協議,完成各種層次上的網絡連接。請看下面一個簡單的ftp登錄的例子:...FtpClientf_client;f_client=newFtpClient("hostname");f.login("anonymous","");f.binary();...
另外,Java提供一個Socket類,這個類可以提供可靠的流式網絡連接。這樣,我們可以非常方便地創(chuàng)建分布式的Client和Server應用程序。傳統的網絡編程是一件復雜的事情,但是通過Java提供的網絡類庫,可以輕易地構造出網絡應用,如客戶機/服務器應用,瀏覽器/服務器應用,大大簡化了工作難度。正如Java的設計者Gosling所說,Java的設計就是為了“最大限度地利用網絡”。4.解釋型我們知道,Java的編譯器產生的是字節(jié)代碼,可把它理解為一種中間代碼,而不是特定的機器碼。該字節(jié)碼必須運行在一個解釋器上,所以說,Java是一種解釋型語言。由于產生的是中間代碼——字節(jié)代碼,因而可達到與平臺無關的目的,從而可高效地在不同平臺之間傳輸。同時,該程序可在任何平臺上運行,只要這個平臺上安裝了Java解釋器和運行系統即可。在解釋環(huán)境中,程序開發(fā)過程中標準的“鏈接”過程沒有了,Java的“鏈接”實際上是把一個新類加載到當前的環(huán)境中,這和傳統的程序開發(fā)過程中的編譯、鏈接、測試有較大的區(qū)別。5.健壯性分布式計算環(huán)境要求軟件具有高度的健壯性。C++程序員都知道其在穩(wěn)定性方面的最大問題在于指針的使用和缺乏自動的內存管理。這使得程序員可能編寫出在語法和語義上均正確,但卻可能對系統產生巨大破壞作用的軟件。Java是一種比C++還強的強壯型語言。它要求顯式的方法聲明,保證編譯器可以發(fā)現方法調用錯誤。Gosling認為指針的主要作用在于數組和結構的訪問及使用。Java的數組可以解決前者的問題,但加強了對數組下標的檢查。結構的訪問和使用可通過類及類的方法訪問變量解決,因而可以取消指針的概念。Java語言穩(wěn)定性的另一個方面是自動的內存管理。用過C/C++的讀者知道,比如我們可以調用函數malloc()來進行內存的分配,但在使用完后,必須要對占用的資源進行釋放,即再調用free()函數釋放掉分配的內存,如果稍不小心,就可能造成系統故障或空間的浪費。Java中專門有一個后臺垃圾自動收集程序——GarbageCollector。它以較低的線程優(yōu)先級對存儲器進行掃描,自動釋放掉不再使用的存儲碎片,從而使程序員不用再擔心內存的使用,只是專注于程序的設計即可。
異常處理也是Java健壯性的一個方面。一般認為,異常處理是成熟語言的標志。在Java中,通過使用try/catch/finally語句,程序員可以把一組錯誤處理代碼放在一個集中的地方統一處理,這可簡化錯誤的處理及錯誤的恢復。6.安全性
Java的安全性和健壯性是緊密聯系的,由于其主要應用于網絡程序的開發(fā),因而如果沒有較高的安全性作為保障的話,用戶從網絡上下載程序將是非常危險的。正如我們前面所描述的,Java取消了指針,杜絕了不懷好意的程序對內存惡意篡改。
Java語言的安全機制基于“不存在可信任的代碼”的概念。其運行環(huán)境提供了以下四級安全保障機制:①字節(jié)碼校驗器②類裝載器③運行時內存布局④文件訪問機制
當Java字節(jié)碼進入解釋器時,首先必須經過字節(jié)碼校驗器的檢查。校驗器就象一個忠誠的衛(wèi)士,不能通過檢查的一律不準入內。即使是Java編譯器生成的完全正確的字節(jié)碼,校驗器也必須再次對其檢查,因為Java程序的編譯和解釋執(zhí)行期間,字節(jié)碼可能會無意或惡意地被篡改過。然后,Java解釋器將決定程序中類的內存布局,這就意味著不懷好意的程序無法預先知道一個類的內存布局結構,因而也就無法利用該信息來修改或破壞系統。
隨后,類裝載器負責把來自網絡的類加載到單獨的內存區(qū)域,類和類之間相互不會干擾。最后,客戶端用戶還可以限制從網絡上加載的類只能訪問某些被允許的系統,如文件和硬盤。所以,當這幾種機制加在一起,再加上其他的增強辦法,如傳輸過程中使用加密解密算法,程序中做上特殊的標記等,使得Java成為了最安全的系統之一。7.可移植性
Java語言的可移植性具有深遠的意義,它不僅給軟件開發(fā)者帶來了“一次性開發(fā)”的方便,而且迎合了網絡計算的思想。在Java以前,人們只是將Internet當作一個巨大的硬盤,里面有無數的靜止信息。當Java出現后,Internet則變成了一個巨大的操作系統,Java就是這個系統的語言。用這個語言寫的任何程序,如電子表格軟件,存放在某臺機器上,Internet網上的任何用戶只要得到許可,就可以下載并運行這個程序,從而節(jié)省了大量的硬盤空間,也省去了管理的麻煩。Java的設計者采用了多種機制來保證可移植性,最主要的有:
(1)Java從本質上講是解釋型的,這意味著任何一臺機器,只要配備了Java解釋器,就可以運行Java程序。
(2)Java的數據類型在任何機器上都是一致的,它不支持特定硬件環(huán)境的數據類型??傊琂ava的可移植性決定了它將成為未來網絡環(huán)境的“世界語”。8.高性能由前所述,我們知道Java是一個解釋型語言。按照系統結構的觀點,解釋型語言除不可能達到編譯型語言的速度外,其他一些性能并不比編譯型語言差。有人作過測試,Java程序的平均運算速度是C語言的1/20倍。為了解決高性能問題,Java的設計者正在努力開發(fā)出一種更具效率的編譯器,這種編譯器可以在運行時把Java的字節(jié)碼翻譯成特定CPU的機器碼,從而使轉化成機器碼的字節(jié)碼在性能上接近于C或C++。9.多線程
Java高性能的另一個方面是它的多線程能力,他可以同時運行多個線程,處理多個任務。多線程可稱為“輕量級進程”,它有點像Unix下的進程概念,多線程即多個模塊并行運行;通過消息協調操作;通過信號燈和鎖保證關鍵模塊的執(zhí)行不被中斷。線程之間可以共享內存和全局變量,比進程的開銷要小得多,因此也可以將線程看作可以同時運行的函數。多個線程的并行執(zhí)行,仿佛有多個CPU在運行。比如說,一個線程在執(zhí)行復雜的計算,而另一個線程完成與用戶的交互。用戶不必停下來等待Java程序完成冗長的操作,所以,多線程能夠增強用戶的實時交互能力,提高程序的運行效率。
傳統的語言程序中,多線程編程是相當繁瑣的,因為同一時刻要發(fā)生許多事情,程序員必須考慮它們的執(zhí)行順序、同步管理、資源爭用等情況。例如當使用C或C++語言開發(fā)多線程應用程序,首要的困難是要保證多個例程可被若干并發(fā)線程運行。如果一個例程改變了狀態(tài)變量的值,那么一次只可能有一個線程執(zhí)行。同時,它還需要程序員負責例程的鎖定與釋放,且非常容易形成“死鎖”。Java還通過關鍵字synchronized來保證兩個或更多的線程不會同時執(zhí)行一個被聲明為同步的方法,從而保證某些關鍵操作(如寫數)順利進行而不會被中斷。當然,Java的同步策略也有問題,當被標記為synchronized的函數執(zhí)行時間較長時,就可能造成很多線程在等待該同步函數,而阻止了程序的其他非同步部分的執(zhí)行,降低了執(zhí)行效率。2.2Java語言的基本語法
與C/C++相似,Java的數據類型可以分為兩大類型:基本類型(簡單數據類型)和引用類型(復合數據類型)。簡單類型包括整型(integer)、浮點型(float)、字符型(char)及布爾型(boolean)。簡單數據類型用戶通常是不能修改的,它用來實現一些基本的數據類型。
復合數據類型有類(class)、接口(interface)和數組(array)。復合數據類型是用戶根據用戶的需要定義并實現其運算的類型。簡單類型的數據在函數調用中是以傳值方式進行的,而復合數據類型在函數調用中則是以傳地址的方式進行的。Java的數據類型可用圖2.1表示。
圖2.1
整數類型byte、short、int、long
浮點類型float、double
字符型char
布爾類型boolean
類class
接口interface
數組array基本類型引用類型數據類型
變量是Java程序中的基本存儲單元,它由類型和標識符構成。Java字符集支持擴展的16位字節(jié)碼(Unicode字符集),提供多語言支持。表達式是常量、變量、方法調用以及一個或多個運算符的任意組合,是構成Java語言的基本單元。本節(jié)我們將介紹Java中簡單數據類型、變量、表達式及運算符的基本內容。2.2.1數據類型
Java程序都是由數據和對數據進行的操作構成的。數據是計算機用的基本數據,數據類型決定了數據的取值范圍和運算符號。
1.整型
Java語言的整型數據與C/C++相似,按照存儲位的不同,分為byte、short、int、long四種,分別表示從8位到64位的整數。
表2.1列出了整型所占內存位數和取值范圍。其中,int和long類型是最常用的類型,而byte類型經常用在字節(jié)碼數據中,比如網絡傳輸數據或進行二進制數據的輸入/輸出時。由于short類型在使用時要求數據的存儲須先高字節(jié)后低字節(jié),在某些機器中可能會出錯,故使用較少。表2.1整型數屬性表
數據類型
占用長度/bit
取值范圍byte8-27~27-1short16-215~215-1int32-231~231-1long64-263~263-1
同C語言一樣,Java的整數也可以用十進制、八進制和十六進制來表示。八進制數以O打頭,數字字符為0~7;十六進制數用Ox(OX)打頭,數字字符為0~9、a~f或A~F。一個整型數隱含為int型,如果需要long類型的數,必須在該數后加上字母l(L)。
2.浮點型
Java的浮點類型分為兩種:單精度浮點數和雙精度浮點數,分別用關鍵字float和double來表示。與C/C++不同,它們的存放位長與機器無關。表2.2給出了浮點數的屬性。表2.2實型數屬性表
數據類型
占用長度/bit
取值范圍float321.4e-045~3.4e+038double644.9e-324~1.8e+308
浮點數的隱含類型為double型,當我們要float型的數時,就需要顯示說明,即在該數后跟一個字母f,告訴編譯器該數為float類型。不管是double型還是float型,當對實數使用比較運算符“==”時,由于精度的取值問題,必須小心使用。單精度實數的有效位為:二進制23位,十進制為7位精度。雙精度實數有效位為:二進制52位,十進制為15位精度,多余位四舍五入。下面是實型變量定義的例子:
floatvariable1; //variable1為單精度浮點數
doublevariable2; //variable2為雙精度浮點數3.布爾型
Java中布爾型變量只有兩個值:真(true)或假(false)。與C/C++不同,布爾型數據是獨立的數據類型,所以既不能將整數值賦給布爾變量,也不能將布爾類型的數轉換成整型或其他類型。布爾型數據在機器中位長為8位。布爾型數據的定義舉例如下:
booleansign=true;
上例定義sign為布爾變量,且初值為true。4.字符型
Java中字符型變量的類型為char,它是一個16位的Unicode碼,而不是我們在C中所見到的8位ASCII碼。下面用關鍵字char定義一個字符變量:
chara='b'; //定義一個初值為“b”的字符型變量在C語言中,字符與無符號整數是一樣的,因而可以混合運算,不會產生什么問題??墒窃贘ava中,由于Java沒有無符號整型類型,因而字符型數據不能用作整數。但可以通過轉換來進行變通,如:
chara='a';charb=(char)(a+1);
即字符變量a轉換為整數97后與1相加,最后轉換成字符“b”。同C/C++相同,Java字符集中一些不能顯示的控制字符可以用轉義序列來表示,如表2.3所示。表2.3轉義字符表
轉義字符
功能描述\ddd1~3位八進制所表示的字符\uxxxx1~4位十六進制所表示的字符\'
單引號\"
雙引號\\
反斜杠\r
回車\n
換行\(zhòng)f
換頁\t
水平制表\b
退格2.2.2變量變量是Java程序中的基本存儲單元。實際上,數據在存儲器中地址的代號,包括變量名、變量類型和作用域三個不同部分。與C/C++相似,Java變量必須先定義,后使用。1.變量標識符
Java中標識符是類、對象、界面、方法、變量和用戶定義的對象的集合。為使非英語國家的程序員方便地用自己的母語定義標識符,Java標識符采用Unicode字符集,可為任意長度。Java中規(guī)定,標識符必須以字母、下劃線(_)或美元符($)為首字母,后面字符由一個或多個字母、下劃線、美元符或數字組成。下面我們對Java中兩個特殊的標識符——注釋和關鍵字加以說明。1)注釋注釋用來解釋程序的正文,增強程序的可讀性。它只是為程序起一個說明的作用,在編譯系統作詞法分析前會被忽略掉。Java語言提供了三種形式的注釋:
//text:行注釋,從“//”到本行結束的所有字符均作為注釋而被忽略。
/*text*/:多行注釋,從“/*”到“*/”之間所有字符被忽略。
/**text*/:這是Java語言特有的注釋,同“/*”相似,表示從“/**”到“*/”之間所有的字符均為注釋。它只能緊鄰在某一個聲明之前使用,作為該聲明的注釋,注釋的內容被包含進java.doc程序自動生成的文檔中。
上面注釋的使用中,我們必須要注意的是,Java的注釋不允許有嵌套注釋,注釋串不允許出現在字符值或字符串內。下面舉例說明:
/*trythis/*again!///*everybody.*///it'sacomment/*anothercomment*/
上兩例均表示一個注釋。
System.out.println("Isthisacomment?//deleteme");
該語句輸出為“Isthisacomment?//deleteme”,而不是我們想當然的“Isthisacomment?”。2)關鍵字
Java中的關鍵字是編譯器預留的,不能挪作他用,如果用戶拿關鍵字作為自己的變量標識符,則會出錯。下面我們給出Java中的關鍵字。abstract boolean break byte byvaluecase cast catch char class const continue default do doubleelse extends false final finallyfloat for future generic gotoif implementsimportinstanceof intInterfaceinner long native newnull operator outer package privateProtectedpublic rest return shortstatic super switch synchronized thisThrow transient true tryvoidwhile var volatile2.變量缺省初始值任何一門編程語言中定義的變量都對應一個值,不存在沒有值的變量。當定義一個變量而沒有對其初始化時,系統默認其初始值為缺省初始值。不同數據類型的缺省初始值如表2.4所示。表2.4變量的缺省初始值
類型缺省值
byte(byte)0
short(short)0
int0
long0L
float0.0f
double0.0d
char‘\n0000’
booleanfalse
Objectnull3.變量的作用域我們知道,變量在使用前必須先要進行聲明,其基本格式為
[accesstype]variabletypevariablename[=value],[,variablename[=value]…];
例如:
protectedfloatgrade;booleansign;
在上面的描述中,第一個參數為訪問類型,它是可選項。Java的變量訪問類型有四種:public、protected、privateprotected、private。后面會對這四種類型作詳細說明。數據類型可以是基本的數據類型、類和接口。變量的說明可在使用位置之前的任何地方進行。在使用變量時,需考慮其作用范圍,即作用域的問題。從變量的定義格式我們可以知道,確定變量的作用域包含兩個方面:一個是其訪問類型;另一個為變量在程序中聲明的位置。Java中變量四種訪問類型的具體作用如表2.5所示。表2.5變量訪問類型的說明
訪問類型
功能描述public能被包內和包外的任何類型訪問protected可被該變量所在類的子類及同一包中的類訪問privateprotected可被該變量所在類及其子類訪問private只能被定義該變量的類中的方法訪問
另一個影響變量作用域的因素是變量聲明的位置。在程序中,當我們用“{}”括起一段代碼時,相當于定義了一個新的域層次。作用域層次的作用是判斷一個變量是否可以訪問和在什么時候失去效用。與C/C++相同,一個變量只有當它在當前的作用域層次或比它更高的層次中被聲明時,才能在當前作用域層次中使用訪問,一旦離開一個作用域層次,在該層次中定義的所有變量就不能被訪問了。2.2.3運算符及表達式運算符是對一個或多個操作數進行某種特定運算的標志符號。在Java中,運算符很豐富,有常用的算術運算符、邏輯運算符、位運算符和對象操作運算符。如果我們按操作數的多少來分,又有單目運算符、兩目運算符及三目運算符。表達式是運算符、常量和變量的組合。在這節(jié)中,先介紹運算符的基本概念,然后討論表達式的用法。1.算術運算符與C/C++相似,Java算術運算符用于整型或實型數的運算,可分為一元運算符和二元運算符兩種。一元運算符如表2.6所示。表2.6一元算術運算符表
運算符
用法
功能描述++OP
正值??OP
負值++++OP,OP++
加1(自增)????OP,OP??
減1(自減)
上表中,自增、自減運算符既可以放于操作數之前,也可以放于操作數之后,這是初學者需注意的地方。當放在操作數之前,則是先進行自增/自減運算,再把其結果用于后繼的操作;如果放在操作數之后,則是先進行別的運算,然后再進行自增/自減運算。另外,自增/自減運算符只能作用于變量,而不能作用于常量或表達式??聪旅娴睦樱?/p>
inti=2; intj=3;intm=++j+i; intk=m+i++;
在運行完上述四條指令后,i,j的值均加1成為3,4,而m,k的值變成了6,8。需要注意的是,由于第三條語句中出現了++j,故m的值為6,第四條語句中是i++,所以k的值為8。從上面的例子中,可以知道,自增/自減運算符使用靈活,但容易造成副作用,實際應用時須十分小心。再看一個例子:
inti=2;intj=3;System.out.println(i+++j);System.out.println(+++j);
當運行上述的四條指令時,第三條指令的輸出結果為5,而第四條指令出錯。這是因為對于第三條指令而言,系統把i+++j解釋為i++(+j),結果為5,而第四條指令被解釋為++(+j),由于自增/自減運算符不能作用于表達式,所以出錯。
Java的二元運算符有+,?,*,/,%五種,其用法與C/C++類似,見表2.7所示。表2.7二元運算符用法表
運算符
用法
功能描述+OP1+OP2
加?OP1?OP2
減*OP1*OP2
乘/OP1/OP2
除%OP1%OP2
求余
前四條運算符都是常用的算術運算,第四條運算符為取模運算,即求兩操作數相除的余數:當被除數為正時,結果為正,當被除數為負數結果為負。實際應用中,算術運算的操作數常常具有不同的類型,比如說,一個操作數為int型,另一個操作數為long型,一旦碰到這種情況,就需要進行類型的轉換。一般原則是保證結果的數據類型與精度最高的操作數數據類型一致。轉換規(guī)則如表2.8所示。表2.8類型轉換規(guī)則
類型1
類型2
結果byte/shortbyteintbyte/shortintintbyte/short/intlonglongbyte/short/int/longfloatfloatbyte/short/int/long/floatdoubledouble2.關系運算符關系運算符用于兩個值之間的關系比較,其返回值為布爾類型,表2.9給出了關系運算符的使用方法。
表2.9關系運算符表
運算符
用法
功能描述>OP1>OP2
大于為真>=OP1>=OP2
大于等于為真<OP1<OP2
小于為真<=OP1<=OP2
小于等于為真==OP1==OP2
等于為真!=OP1!=OP2
不等于為真
我們知道,在C/C++中,真或假的值是用“1”或“0”來表示的,而在Java中關系運算符的結果則要么為true,要么為false。另外,在關系運算符的使用中,算術類型只能與算術類型比較,布爾類型、復合類型也只能與同類型相比較。
3.布爾運算符與C/C++不同,Java中,邏輯運算符只能對布爾邏輯型數據進行操作,其返回值同樣為邏輯型布爾值。其用法如表2.10所示。表2.10邏輯運算符表
操作數OP1操作數OP2OP1&&OP2OP1||OP2!OP1truetruetruetruefalsetruefalsefalsetruefalsefalsefalsefalsefalsetruefalsetruefalsetruetrue
邏輯運算符中,邏輯與(&&)/邏輯或(||)運算符為二元操作符,而邏輯非(!)為一元操作符。下例是判斷某一年是否為閏年的程序,我們只給出部分語句。
...intyear;if(year%4==0&&year%100!=0||year%400==0)System.out.println("所給年份"+year+"是閏年!");...4.位運算符位運算符用來對二進制數進行測試、置位或移位等操作,操作數只能為整型或字符型數據,其用法如表2.11所示。對于上表中前四種運算符,其真值表如表2.12所示。
表2.11位運算符表
運算符
用法
功能描述~~OP
按位取反&OP1&OP2
按位與|OP1|OP2
按位或^OP1^OP2
按位異或>>OP1>>OP2OP1右移OP2位<<OP1<<OP2OP1左移OP2位>>>OP1>>>OP2OP1無符號右移OP2位表2.12位操作真值表OP1位值OP2位值~OP1OP1&OP2OP1|OP2OP1^OP2001000100011011011110110下面我們看一個按位異或的例子:
...intx=17;inty=10;System.out.println("Thevalueis"+x^y);...
該段程序的輸出結果為27,其實際運算如下:
x:10001y:01010^:11011=27
至于后面三種運算符,均屬于移位運算符。在不產生溢出的情況下,左移一位相當于乘2,故有:
x*12=x*(8+4)=x<<3+x<<2
右移運算符“>>”將操作數移出右端的低位舍棄,把最高位作為補位,所以,右移一位相當于除2取商,與左移相似,有:x/8=x>>3
運算符“>>>”是無符號右移,不考慮最高位的符號位,所以補位均為0。例2.1importjava.lang.Math;publicclassMove{publicstaticvoidmain(Stringargs[]){intx,y;intn=1;longresult=0;x=(int)(Math.random()*300);y=(int)(Math.random()*400);for(inti=0;i<=32;i++){if((y&n)!=0)result+=x<<i;n<<=1;}System.out.println("Theresultis"+result);}}
在本程序中,我們利用類Math中的隨機函數random()來產生兩個整數,由于該函數返回值為double型,因而我們利用了強制類型轉換來進行賦值。運行結果為
SystemOutput: Theresultis21357SystemOutput: Theresultis186555.賦值運算符賦值運算符“=”把一個數據賦給一個變量,其一般形式為
variable_typevariable_name=expression;
例如:
intx=100;inty=200;floatz=100.0;Java中賦值語句與C/C++相似,可以分為簡單賦值運算符和復合賦值運算符兩類。比如,上面的例子就是簡單的賦值語句。當賦值符號“=”前面加上不同的運算符組成一些復雜的賦值語句后,就成了復合賦值運算符。如:
x/=2;//等價于x=x/2;x%=4;//等價于x=x%4;
賦值運算符的基本用法可見表2.13。表2.13復合賦值運算符用法表運算符用法等價于+=OP1+=OP2OP1=OP1+OP2?=OP2?=OP2OP1=OP1?OP2*=OP1*=OP2OP1=OP1*OP2/=OP1/=OP2OP1=OP1/OP2%=OP1%=OP2OP1=OP1%OP2|=OP1|=OP2OP1=OP1|OP2&=OP1&=OP2OP1=OP1&OP2^=OP1^=OP2OP1=OP1^OP2>>=OP1>>=OP2OP1=OP1>>OP2<<=OP1<<=OP2OP1=OP1<<OP2>>>=OP1>>>=OP2OP1=OP1>>>OP26.條件運算符條件運算符是一個三元運算符,其一般形式為
expression?statement1:statement2;
其語義為:首先計算表達式expression的值,如果該值為真(true),則將statement1的值作為整個表達式的值,反之,將statement2作為整個表達式的值。如:
max=x>y?x:y;該語句取x,y的最大值。需要注意的是,該運算符規(guī)定statement1和statement2需返回相同類型的數據,且不能為void。7.對象運算符
Java中對對象的操作有專門的對象運算符instanceof。它用來測試一個對象是否是某個類或其子類的實例,若是則返回true,反之返回false。例如:
...if(e.targetinstanceofMenuItem){Stringnam=(String)e.arg;...}
該段代碼功能是測試組件上產生的事件是否對應于菜單。8.運算符的優(yōu)先級運算符是有優(yōu)先級的,它決定表達式中各運算執(zhí)行的先后順序??偟膩碚f,運算符優(yōu)先級具有如下規(guī)則:(1)一元運算符比二元運算符優(yōu)先級高。(2)算術運算符比關系運算符優(yōu)先級高。(3)關系運算符比按位運算符優(yōu)先級高。(4)大于和小于運算符比等于和不等于運算符優(yōu)先級高。(5)按位運算符比邏輯運算符優(yōu)先級高。(6)邏輯與(&&)比邏輯或(||)優(yōu)先級高。(7)賦值運算符優(yōu)先級最低。表2.14運算符的優(yōu)先級及結合性運算符優(yōu)先級結合性[]()最高
最低左向++??!~instanceof右向New右向*/%左向+?左向>>>>><<左向<><=>=左向==!=左向&左向^左向|左向&&左向||左向?:右向=+=?=*=/=%=^=右向&=/=<<=>>=>>>=右向,左向9.表達式表達式是由運算符和操作數組合而成的,包含常量、變量、方法以及一個或多個運算符。一個表達式包含的多個操作,其順序是由各運算符的優(yōu)先級和是否有括號操作符決定。當表達式在完成運算之后,返回一個值,其數據類型由參加運算的數據的類型決定。2.3流程控制語句
流程控制語句提供了控制程序執(zhí)行步驟的基本手段,可以說是程序的核心部分。我們知道,任何程序決不會只是順序地執(zhí)行語句序列,程序運行時需要同用戶進行交互,需根據用戶的輸入決定執(zhí)行序列,這就需有條件轉移及循環(huán)執(zhí)行。Java同其他編程語言一樣,提供了許多流程控制語句。本節(jié)我們討論其流程控制語句的基本語法及特點。2.3.1概述
Java所提供的流程控制語句幾乎與C/C++完全相同。具體來說,Java的流程控制可通過如下一些語句來實現:①while和do-while語句②for語句③if-else語句④switch語句⑤異常處理語句⑥分支語句Java與C/C++之間的差別很細微,可歸納為兩點:
(1)在C語言中,條件表達式可以是數值型,而在Java條件語句中,條件表達式必須是布爾型,不能是數值。
(2)Java取消了對goto語句的支持。goto語句的使用一直是程序設計者爭論的話題,這是因為goto語句的使用不僅降低了程序的可讀性,而且往往會帶來一些不可預測的錯誤。對于Java中流程控制語句的使用情況,我們可通過表2.15來描述。表2.15控制語句的用法類型用法描述if-elseif(boolean)statement1;elsestatement2;switchswitch(expression0){caseexpression1:statement1;…caseexpressionN:statementN;default:statementN+1;}breakBreak[label];continueContinue[lable];returnReturnexpression;forfor(expression1;expression2;expression3)statement;whilewhile(boolean)statement;do-whiledostatement;while(boolean);labellable:statement;2.3.2條件語句條件語句if-else控制條件的轉移。if語句對給定的條件加以判斷,根據判定結果執(zhí)行相應操作;如果表達式為真,執(zhí)行if語句體,如果為假,則執(zhí)行else后面的語句體。
if語句可以使程序根據一些條件有選擇地執(zhí)行語句。比如可在程序中設置boolean變量DEBUG的值來打印調試信息。如果DEBUG是true,程序就打印出調試信息;反之就不打印。
具體的程序如下:
if(DEBUG){System.out.println("DEBUGInformation:x="+x);}
上面是一個簡單的if語句的例子??偟恼f來,if語句分為簡單條件語句和復合條件語句,其語法格式為①簡單條件語句if(condition)或 if(condition){ statement1;
statement; else} statement2;②復合條件語句if(condition1)statement1;
elseif(condition2)statement2;elseif(condition3)statement3; ...elsestatementN;
比如當程序需要根據不同的輸入信息執(zhí)行不同的操作(例如經常碰到的對話框的選項操作)時,可以使用if和else語句來實現這個目的:
…//responseiseitherOKorCanceldepending//onthebuttonthattheuserpressed
…if(response==OK){//在這里添加執(zhí)行OK動作的代碼
}else{//在這里添加執(zhí)行Cancel動作的代碼
}…
使用Java復合條件語句時,一個if語句后可以跟任意個elseif語句,但只能有一個else語句。例2.2將學生的考試成績轉換成不同的等級:90分以上為A,80分以上但小于90分為B,依次類推,F表示不及格。例2.2publicclassMyClass1{publicstaticvoidmain(String[]args){inttestscore=DialogBox.requestInt("Pleaseinputaintnumber:");//類DialogBox見附錄chargrade;if(testscore>=90){grade='A';}elseif(testscore>=80){grade='B';}elseif(testscore>=70){grade='C';}elseif(testscore>=60){grade='D';}else{grade='F';}Transcript.println("Grade="+grade);//類Transcript見附錄,以下同}}
程序運行時,會彈出一個對話框,如圖2.2所示。如果我們在其中輸入的值為55,則結果為不及格F,輸出如圖2.3所示。圖2.2 圖2.3
我們在前面討論運算符的時候知道,Java編程語言支持運算符“?:”,它不僅是Java中惟一的三元運算符,也是一個簡化的if語句。下面看一段代碼:
...if(a>b){System.out.println("TheMaxnumberis:"+a);}else{System.out.println("TheMaxnumberis:"+b);}...2.3.3循環(huán)語句編程過程中,我們往往會碰到循環(huán)控制。幾乎所有的實用程序都包含循環(huán),而循環(huán)結構是程序設計的基本結構之一,它和順序結構、選擇結構共同作為各種復雜程序的基本構造單元。與C/C++一樣,Java提供了三種格式的循環(huán)控制語句:while語句、do-while語句和for語句,下面我們分別加以介紹。1.while語句
while語句的功能是當條件成立時,重復執(zhí)行子語句。while語句的語法為
while(expression){statement;}
首先,while語句執(zhí)行并檢查條件表達式expression,它返回一個boolean類型數(true或者false)。如果表達式返回true,while語句執(zhí)行語句statement。之后while語句繼續(xù)測試條件表達式并執(zhí)行直到條件返回false。
使用循環(huán)語句須注意的是,在循環(huán)體中必須有能夠對循環(huán)條件進行修改的語句,否則會導致死循環(huán)。下面我們給出一個例子WhileDemo。此函數的功能是:首先接收用戶輸入的字符串(該字符串以字符‘*’結束),然后使用while語句來測試字符串的各個字符,并復制字符串到另一串中,直到碰到字符‘*’才結束。字符串的用法讀者可參閱第四章。例2.3publicclassWhileDemo{publicstaticvoidmain(String[]args){StringsourceString=DialogBox.request("Pleaseinputastringendedwithcharacter*");StringBufferresultString=newStringBuffer();inti=0;charc=sourceString.charAt(i);while(c!='*'){resultString.append(c);c=sourceString.charAt(++i);}Transcript.println("Thesourcestringis:");Transcript.println(sourceString);Transcript.println("Theresultstringis:");Transcript.println(resultString);}}當我們輸入字符串“WelcometoJavaWrold!*”時,結果如圖2.4所示。圖2.42.do-while語句如果需要循環(huán)執(zhí)行的語句至少執(zhí)行一次,可使用do-while語句,它實現“直到型until”結構,do-while的基本格式為
do{statement;
}while(boolean_expression);
不像while語句,do-while語句是先執(zhí)行循環(huán)中的語句再判斷循環(huán)條件,所以do-while語句的循環(huán)體至少執(zhí)行一次。實際上,do-while語句完全可以與while語句互換,比如例2.3也可以改寫成例2.4所示的程序,效果是一樣的。例2.4publicclassDoWhileDemo{publicstaticvoidmain(String[]args){StringsourceString=DialogBox.request("Pleaseinputastringendedwithcharacter*");StringBufferresultString=newStringBuffer();inti=0;charc=sourceString.charAt(i);do{
resultString.append(c);c=sourceString.charAt(++i);}while(c!='*');Transcript.println("Thesourcestringis:");Transcript.println(sourceString);Transcript.println("Theresultstringis:");Transcript.println(resultString);}}3.for語句
for語句是最標準的循環(huán)語句。與C/C++相同,它是Java語言中最靈活的一種控制結構,它有多種變形,可實現不同的循環(huán)功能。for語句的一般格式為
for(初始條件;終止條件;增量){statement;}
初始條件是為循環(huán)變量置初值,它在循環(huán)開始的時候就執(zhí)行一次。終止條件決定循環(huán)是否繼續(xù),該條件表達式在每次循環(huán)的時候均作判斷,如表達式結果為false,則循環(huán)結束。
量是循環(huán)一次增加多少(即步長)的表達式。括號內的三個表達式均可以為空。實際上,為了實現無限循環(huán),這三個表達式都可以省略。例如:
...for(;;)
//表示無限循環(huán)
{...}
例2.5中使用了一個for循環(huán)語句
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度全國多品種動物養(yǎng)殖基地購銷合作合同3篇
- 2024版ISO9000質量認證咨詢及全面質量管理體系建立合同4篇
- 2024天津二手房買賣合同范本獨家提供裝修監(jiān)理3篇
- 2024年新型建筑材料設備拆除及環(huán)?;厥蘸贤侗?篇
- 2024年度國際貿易市場調研與分析合同3篇
- 2024年度智能化工廠建設項目施工合同2篇
- 2024年度房地產銷售代理合同詳細條款和標的3篇
- 2024年度企業(yè)內部培訓課程設計與實施服務合同范本3篇
- 2024版塔吊施工材料采購合同2篇
- 2024年標準環(huán)保協議樣式版B版
- 安規(guī)考試題庫500題(含標準答案)
- GB/T 3452.2-2007液壓氣動用O形橡膠密封圈第2部分:外觀質量檢驗規(guī)范
- NB∕T 13007-2021 生物柴油(BD100)原料 廢棄油脂
- GB/T 20624.2-2006色漆和清漆快速變形(耐沖擊性)試驗第2部分:落錘試驗(小面積沖頭)
- GB/T 12771-2019流體輸送用不銹鋼焊接鋼管
- GB/T 10125-2012人造氣氛腐蝕試驗鹽霧試驗
- 維修電工-基于7812穩(wěn)壓電路(中級)-動畫版
- PV測試方法簡介-IV
- 病理學實驗切片考試圖片授課課件
- 2021離婚協議書電子版免費
- 國家開放大學《組織行為學》章節(jié)測試參考答案
評論
0/150
提交評論