必威电竞|足球世界杯竞猜平台

Java
來源:互聯網

Java是由Sun Microsystems公司于1995年5月23日發布的一種面向對象的編程語言。Java是在C++基礎上改進而來,它繼承了C++的優點,同時摒棄了C++中指針等難以理解的概念。因此Java相對簡單且功能強大。除此之外,它還具備可移植、高性能、分布式、動態、健壯與安全等特點。

1991年,美國Sun Microsystem公司的“Green”的研發小組在開發一個分布式代碼系統過程中,發現C/C++語言無法滿足項目需求。于是主要成員James Gosling于1991年6月開始開發一種新的編程語言,并命名為Oak。 1995年,Oak更名為Java并發布。 1996年1月,Java 1.0發布。1997年11月,Java實現標準化,標志著Java語言走向成熟。1999年,Java平臺被分為J2ME、J2SE和J2EE,這三個平臺分別定位于嵌入式應用、桌面應用和企業級應用,使Java技術獲得了廣泛的應用。2009年4月,甲骨文公司收購Sun公司,Java的開發與維護也由其負責。自發布以來,Java經歷過多次版本更新,Java 20已于2023年3月21日發布。

Java是企業和開發人員的主要選擇使用的開發平臺,全球有數百萬開發人員運行超過60億臺Java虛擬機。在桌面應用程序、Web應用程序分布式系統的開發中都有它的身影。2023年8月,Java位列TIOBE編程社區指數中最受歡迎的編程語言第四名。

發展歷程

發展歷史

1991年,美國Sun Microsystem公司成立了一個由James Gosling,Patrick Naughton與Mike Sheridan等人組成的名為“Green”的研發小組,其目的是為家用電子產品開發一個分布式代碼系統,以實現對家用電器的集成控制。在開發過程中,Gosling發現C/C++語言無法滿足項目需求。于是Gosling于1991年6月開始開發一種新的編程語言,并命名為Oak,這就是Java的前身。1994年,互聯網火速發展,Gosling對Oak進行了一定的改造,決定用其開發一個新的web瀏覽器。Naughton與Jonathan Payne負責該項目,并于1994年秋天完成了WebRunner的開發。1995年1月,因發現Oak已被其他公司注冊,Oak改名為Java,Java 是印度尼西亞的一個重要的盛產咖啡的島嶼,中文名叫爪哇,開發人員將語言起名為Java,其寓意是為世人端上一杯熱咖啡。WebRunner改名為HotJava。1995年5月23日,Sun Microsystems公司正式發布了Java與HotJava。 美國著名雜志《PCMagazine》將Java語言評為1995年十大優秀科技產品。

1996年1月,Java 1.0發布,1.0版本包括Java虛擬機、網頁應用小程序及可以嵌套在網頁中運行的用戶界面組件,開發人員通過用戶界面組件可以開發窗口應用程序。同年,微軟網景等公司的Web瀏覽器宣布支持Applet,而IBM、Apple、 DEC、奧多比Silicon Graphics、HP、Oracle和Microsoft等公司相繼購買Java技術許可證,從此Java成為應用廣泛的程序設計語言。1997年11月,國際標準化組織式批準了Sun Microsystems等公司提出的Java 標準。Java標準化促進了它的進一步發展,也標志著Java語言走向成熟。 1998年12月,Java 1.2發布,該版本在圖形化用戶界面、數據庫互聯以及其它許多方面做了改進,如加入了strictfp關鍵字,在class文件格式中加入相應的訪問標志,引人了類裝載器的雙親委派模型以及Javalang.Class類和javalang.ClassLoader類的幾個新方法,并澄清修正了Java虛擬機規范。 1999年,Java平臺被分為J2ME、J2SE和J2EE,這三個平臺分別定位于嵌入式應用、桌面應用和企業級應用,使Java技術獲得了廣泛的應用。 2002年2月,Java 1.4發布,并因為CompaqFujitsu、SASSymbian、IBM等公司的參與,使JDK 1.4迅速發展。2004年9月30日,Java 5發布,這個版本的Java有了很大的改進,它加入了泛型、枚舉、注解等新特性,使得Java編程更加方便。為了紀念這次重大的革新,Sun公司不再延續之前使用的1.x版本號,而是直接將版本改為了5.0。2005年,Sun公司取消Java 2名稱,Java三大平臺分別被更名為Java ME、Java SE、Java EE。 2006年11月,Sun公司正式宣布Java平臺開源,全世界的所有程序員都可以免費下載并修改其源代碼。

2009年4月,Sun公司以74億美元被甲骨文公司收購,作為Sun公司的核心資產之一的Java也歸屬于Oracle公司。2011年7月,Java 7發布,該版本為Oracle公司發布的第一個Java版本,引入了菱形語法、多異常捕獲等新特性;2014年3月,Java 8發布,該版本是繼JDK 5后改革最大的一個版本,添加了很多新特性,如Lambda表達式、Stream、API、新版日期時間API等。2017年,Java 9發布,同時,Oracle公司頒布了“6個月版本升級計劃”,即每隔6個月發布一個新版本。

2023年3月21日,Java已更新到Java 20。Oracle為開發人員、最終用戶和企業提供JDK 20,但JDK 20不是長期支持版本。 2023年8月,Java位列TIOBE編程社區指數中最受歡迎的編程語言第四名。 目前,Java是企業和開發人員的首選開發平臺,全球有數百萬開發人員運行超過60億臺Java虛擬機

語言特點

Sun公司在1995年發布的Java白皮書表示:Java是一種簡單的、面向對象的、分布式的 、健壯的、安全的、體系結構中立的 、可移植的、解釋型的、高性能的、多線程的和動態的語言。

簡單性:Java通過提供最基本的方法來完成指定的任務,只需理解一些基本的概念,就可以用它編寫出適合于各種情況的應用程序。Java 略去了運算符重載、多重繼承等模糊的概念,并且通過實現自動無用信息回收,簡化了程序設計者的內存管理工作。另外,Java也適合在小型機上運行,它的基本解釋器及類的支持只有40KB左右,加上標準類庫和線程的支持也只有215KB左右。

面向對象的:Java語言是一種純粹的面向對象的語言。Java語言的設計集中于對象及其接口,它提供了簡單的類機制以及動態的接口模型。對象中封裝了它的狀態變量以及相應的方法,實現了模塊化和信息隱藏;而類則提供了一類對象的原型,并且通過繼承機制,子類可以使用父類所提供的方法,實現了代碼的復用。

分布式:Java是分布式語言。JDK中包含基于TCP/IP協議的類庫,可以輕松實現分布式應用系統,進行分布式計算。Java程序可以憑借URL打開并訪問網絡中的對象,其訪問方式與訪問本地文件系統幾乎完全相同。

健壯性:Java在編譯和運行的過程中會進行比較嚴格的檢查,以減少錯誤的發生。Java不提供指針,從而杜絕開發者對指針的誤操作,如內存分配錯誤、內存泄漏等造成系統崩潰的可能性。在內存管理方面,C/C++等采用手動分配和釋放,經常導致內存泄漏,進而導致系統崩潰。而Java采用自動的內存垃圾回收機制,程序員不需要管理內存,這樣可以減少內存錯誤的發生,提高程序的健壯性。

安全性:Java的安全性體現在兩個層面,即Java的底層運行機制和Java提供的安全類API。在底層運行機制方面:Java沒有提供指針機制,避免了指針機制可能帶來的各類安全問題;Java通過類型安全設計和自動的垃圾回收機制來提高程序代碼的健壯性;Java提供了安全的類加載和驗證機制,確保只執行合法的Java代碼。在API層面,Java提供了大量與安全有關的應用程序接口、工具,以及常用安全算法機制和協議的實現。

體系結構中立與可移植:Java程序在Java平臺上被編譯為體系結構中立的字節碼格式 ,可以方便地被移植到網絡上的不同機器。Java的類庫中也實現了與不同平臺的接口,使這些類庫可以移植。另外,JAVA編譯器是由Java語言實現的,Java運行時系統由標準C實現,這使得Java系統本身也具有可移植性。

解釋型與高性能:程序運行時,Java解釋器直接對Java字節碼進行解釋執行。字節碼本身攜帶了許多編譯時信息使得連接過程更加簡單。和其他解釋執行的語言如BASIC、TCL不同,Java 字節碼的設計使之能直接轉換成對應于特定CPU的機器碼,從而得到較高的性能。

多線程:Java是多線程語言,能處理不同任務。Java的lang包提供一個Thread類,支持開始線程、運行線程、停止線程和檢查線程狀態的方法。

動態:Java程序在運行過程中可以動態地加載各種類庫,即使更新類庫也不必重新編譯使用這個類庫的應用程序。這個動態特點使其非常適合在網絡環境下運行,并且有利于軟件的開發。

歷史版本

自1995年5月23日發布以來,Java已更新發布多個版本。

語法語義

標識符

標識符就是用于給程序中變量、類、方法命名的字符序列,由字母、數字、下劃線、美元符組成,且必須以字母、下劃線或美元符開頭。Java語言的字符使用Unicode編碼標準,因此Java的標識符可以使用Unicode所能表示的多種語言的字符。Java標識符的字母符號區分大小寫,所以 count、Count和COUNT表示不同的標識符。此外,標識符中不可以包含空格,不能使用Java的關鍵字,標識符的長度沒有限制。

Java語言中有固定含義的標識符稱作關鍵字,共有48個,其中enum是Java 5.0新增的關鍵字,用于定義一個枚舉。

除了上面的48個關鍵字之外,Java還包含goto和const兩個保留字與三個特殊的直接量true、false和null,Java 語言的標識符也不能使用這兩個保留字和三個特殊的直接量。

變量和常量

變量

變量是一個保存數據的內存區域的名字。變量在使用時必須先定義 (或稱聲明),然后才能用賦值語句(或其他形式)來為其賦值。變量的命名必須標識符的命名規定。變量定義是指示編譯器為特定數據類型的數值保存在內存中分配適當的內存空間。變量的聲明格式為:<數據類型名><變量名表>。

變量的使用范圍稱作變量的作用域,定義該變量的程序塊,每個變量只在自己的使用范圍內有效。

常量

在整個程序運行期間保持不變的變量稱作常量。常量也是一種標識符,所以定義常量時也要符合標識符的規定。 定義常量的方法是在定義變量的語句最前面加上關鍵字final。常量定義是指示編譯器為特定數據類型的數值保存在內存中分配適當的內存空間。與變量不同的是,常量只允許在定義時給出其數值,并不允許在隨后的程序中改變其數值。常量名通常為全大寫字母。

數據類型

Java語言中共定義了8種基本數據類型,其中4種為整型數,2種為浮點型數,1 種為字符型數,1種為布爾型數。

整型數包括零和有限范圍內的正整數和負整數,不同整型數的數據位不同,所以相應的正整數和負整數的范圍也不同。

浮點型數由整數部分和小數部分組成。浮點型數可以表示精度很高的或帶有小數部分的數值。

在Java語言中,一個Unicode標準下的編碼稱作一個字符。字符型(char)用來表示字符型變量和字符型字面值。字符型字面值用一對單引號括起來,如’a’、’A’、’#’等都是字符型字面值。不能直接顯示的控制字符字面值或字符串中特殊符號表示,可以使用轉義字符的表示方法。

布爾型(boolean)也稱邏輯型,用于表示邏輯上的“真”或“假”。在Java語言中,boolean類型的數值只能是true或false,不能用0或者非0來代表。其他基本數據類型的值也不能轉換成boolean類型。

賦值語句

賦值語句的語法形式是:

其中,等號(稱作賦值號)是賦值語句的標識;<表達式>可以是一個常量,或另一個已賦過值的變量,或是由運算符組成的一個表達式。當一個變量被賦值語句重新賦值時,該變量原先的取值就沒有了。

Java語言是一種強類型語言,即對數據類型的匹配要求十分嚴格。如果一個表達式的數據類型出現不一致等問題,則編譯器給出類型不一致的出錯信息。

匹配類型相同

類型相同是指賦值號左端的數據類型和賦值號右端的數據類型完全一致,此種情況可以正確賦值。

匹配類型兼容

類型兼容是指賦值號左端的數據類型的位數長比賦值號右端的長。此時系統會自動將賦值號右端的數據類型的位數長轉化成和賦值號左端一樣的長度。

匹配類型不兼容

若賦值號右端的數據類型的位數長比賦值號左端的長,則類型不兼容。在編譯時會產生“可能存在精度損失”的編譯錯誤。

當出現類型不兼容錯誤時,有兩種解決方法:重新定義賦值號左端變量的數據類型,使之變成滿足要求的較長的數據類型;用強制類型轉換方法把賦值號右端的數據類型轉換成和賦值號左端相同的數據類型。

運算符與表達式

運算符

算術運算符:Java算術運算符分為一元運算符和二元運算符,一元運算符只有一個操作數;二元運算符有兩個操作數,運算符位于兩個操作數之間。算術運算符的操作數必須是數值類型。

比較運算符:用于程序中的變量和變量之間、變量和常量之間以及其他類型的信息之間的比較。

位運算符:位運算是以二進制位為單位進行的運算,其操作數和運算結果都是整型值。

邏輯運算符:要求操作數的數據類型為邏輯型,其運算結果也是邏輯型值。邏輯運算符有: 邏輯與(&&)、邏輯或(||)、邏輯非(!)、邏輯異或(^)、邏輯與(&)、邏輯或(|)。 兩種邏輯與(&&和&)的運算規則基本相同,兩種邏輯或(||和|)的運算規則也基本相同。其區別是:&和 | 運算是把邏輯表達式全部計算完,而&&和 || 運算具有短路計算功能。所謂短路計算,是指系統從左至右進行邏輯表達式的計算,一旦出現計算結果已經確定的情況,則計算過程即被終止。

擴展后的賦值運算符:賦值運算符可以與二元算術運算符、邏輯運算符和位運算符組合成簡捷運算符,從而簡化一些常用表達式的書寫。

方括號[ ]與圓括號():方括號是數組運算符,方括號中的數值是數組的下標,整個表達式就代表數組中該 下標所在位置的元素值。 圓括號運算符用于改變表達式中運算符的優先級。

字符串加(+)運算符:當操作數是字符串時,加(+)運算符用來合并兩個字符串;當加(+)運算符的一邊是字符串,另一邊是數值時,機器自動將數值轉換為字符串。

條件運算符:語法形式為〈表達式 1〉?〈表達式 2〉:〈表達式 3〉。條件運算符的運算方法是先計算〈表達式 1〉的值,當〈表達式 1〉的值為 true 時,則將〈表達式 2〉的值作為整個表達式的值;當〈表達式 1〉的值為 false 時,則將〈表達式 3〉 的值作為整個表達式的值。

強制類型轉換符:能將一個表達式的類型強制轉換為某一指定數據類型,其語法形式為(〈類型〉)〈表達式〉

對象運算符instanceof :用來測試一個指定對象是否是指定類(或它的子類)的實例,若是則返回 true,否則返回 false。

點運算符(·):功能有兩個:引用類中成員;指示包的層次等級。

運算符優先級

按優先級從高到低的次序列出Java語言中的所有運算符。

表達式

用運算符和圓括號把運算對象連接起來的、符合Java語言語法規則的式子稱作表達式。 表達式按照運算符的優先級逐個進行計算,最后求得整個表達式的值。由于運算對象是有數據類型的,所以最終得到的計算結果也是有數據類型的,表達式結果的數據類型不一定和運算對象相同,它還取決于表達式的運算符。

Java表達式既可以單獨組成語句,也可出現在循環語句、條件語句的條件部分,還可以出現在函數的實際參數調用等場合。賦值語句也是一個表達式,其運算方法是先計算出賦值運算符右邊的表達式的值(因賦值運算符的優先級最低),然后把該值賦給賦值運算符左邊的變量(因賦值運算符的結合性是先右后左的)。

流程控制語句

在Java程序中,一個以分號結束的符號串稱為一條語句。流程控制語句用來控制程序的執行流程,有條件選擇語句,循環語句和轉移語句三種。 任何程序的結構都是由順序結構、分支結構和循環結構三種基本結構組成的。在順序結構的程序或程序段中,程序是按語句次序順序執行的。在分支結構或循環結構的程序或程序段中,程序按分支結構語句或循環結構語句所規定的執行流程來執行。

分支語句

分支結構是指程序按照當前的分支條件控制程序流程的執行。Java語言有兩種分支結構的語句:if語句和switch語句。

基本的if語句的語法形式為:

if 語句的含義是:當〈邏輯表達式〉的值為true時,執行 if 后面的〈語句組 1〉;當〈邏輯表達式〉的值為false時, 執行else后面的〈語句組 2〉。當執行的語句組中的語句多于一條時,語句組必須用一對花括 號“{}”括起來。在Java語言的語法中,一對方括號“[ ]”括起來的部分,表示該部分(除數組定義外)是任選的。因此,else語句是任選的,當沒有else語句時,若〈邏輯表達式〉 的值為false,就執行分支語句外的語句。if語句的邏輯表達式中的條件可能多于一個,這稱為復合條件,復合條件需要用邏輯運算符。如果if語句中又包括另一個if語句,則稱為if語句嵌套。 Java語言規定:else總是與最近的一個if語句匹配。

switch語句的語法形式為:

switch語句中〈表達式〉的值必須是整型或字符型常量。switch語句首先計算表達式的值,如果表達式的值和某個case后面的變量值相同,則執行該case語句后的若干個語句直到遇到break語句為止,如果該case語中沒有break語句,將繼續執行后面case中的若干個語句,直到遇到break語句為止。若沒有一個常量的值與表達式的值相同,則執行default后面的語句。default語句為可選的,如果它不存在,且switch語句中表達式的值不與任何case的常量值相同,switch則不做任何處理。

循環語句

循環結構是指程序按照當前的循環條件控制程序流程的執行。Java 語言有三種循環結構的語句:for語句、while語句和do-while語句。這三種循環語句雖然控制循環的方式不同, 但實現循環的功能相同。

for語句的語法形式為:

for語句的語義是:首先計算〈表達式 1〉的值,然后計算〈表達式 2〉的值,當〈表 達式 2〉值為true時,執行一次〈循環體〉,再計算〈表達式 3〉的值,并進行下一次循環過程;當〈表達式 2〉的值為false時,循環過程結束。 在for語句中,〈表達式 1〉是給循環變量賦初值,通常是一個賦值表達式;〈表達式 2〉給出循環結束條件,因此,必須是一個關系表達式或邏輯表達 式;〈表達式 3〉改變循環變量,必須是一個賦值表達式(或類似 i++形式的改變變量i的數值的語句);〈循環體〉可以是一條語句,也可以是多條語句,當為多條語句時,必須用一對花括號“{}”括起來。

while語句的語法形式為:

while語句的語義是:如果〈邏輯表達式〉的計算結果為true,則執行循環體;如果〈邏輯表達式〉的計算結果為false,則結束while語句的執行。當〈循環體〉中的語句多于一條時,需要用一對花括號“{}”括起來。

do-while語句的語法形式為:

do-while語句的語義是:首先執行語句組(或稱循環體),然后計算〈邏輯表達式〉的值, 當〈邏輯表達式〉的值為true時,執行一次循環體;當〈邏輯表達式〉的值為false時,結束循環。 從語義上看,do-while語句和while語句的唯一差別是:do-while語句至少執行一次循環體 (因其結束條件判斷在后面進行);而對于 while 語句來說,當循環條件一開始就不滿足時, 循環體將一次也不執行。從語法結構上看,與while語句的一個明顯區別是do-while語句在結尾處多了一個分號。

如果循環語句的循環體內又有循環語句,則構成多重循環結構。多重循環結構中的循環語句,可以是for語句、while語句或do-while語句中的任何一種。

跳轉語句

Java語言中提供了3種跳轉語句,分別是break語句、continue語句和return語句。

break語句通常是和switch語句或循環語句配合使用的。switch語句本身并不能保證執行完一組case后的語句或語句組后,跳過隨后的case判斷。 通常情況下,需要用break語句來跳過隨后的case語句。switch語句中的break語句的語義是:跳過break語句所在位置后所有的case語句,即結束switch語句的執行。 break語句應用在for、while和do-while循環語句中可強行退出循環,也就是忽略循環體中任何其他語句和循環條件的限制。

continue語句用于循環語句,語義是:若循環體中遇到 continue語句,則本次循環體的后續語句被忽略,回到循環條件判斷處,判斷是否執行下一次循環。

return語句的語法形式為:

return語句的語義是:使函數返回原調用處,且帶回<返回值>。如果函數為 void 類型, 則 return 語句后沒有<返回值>;如果函數為非void類型,則return語句后需要有<返回值>, 并且<返回值>的類型必須和函數的類型一致。 當return語句不帶<返回值>,并且位于函數的最后時,return語句可以省略。

注釋

Java語言允許在程序中添加注釋,以增加程序的可讀性。Java語言有單行注釋、多行注釋與文件注釋三種形式的注釋。單行注釋以“//”開頭,至該行行尾;多行注釋以“/*”開頭,以“*/”結束;文件注釋以“/**”開頭,以“*/”結束,用來自動生成一個HTML文檔,從而為程序自動提供網絡環境下的文檔說明。

數組

數組定義

數組要先定義,再經過內存單元分配,才能使用。一維數組變量定義的語法形式為:

其中,方括號[]表示定義的是數組變量,〈數據類型〉定義了數組元素的數據類型,〈數組名〉 定義了數組名的標識符。也可以把數組類型看成Java語言在基本數據類型的基礎上的擴展。

如果一維數組的每個數組元素都是一個一維數組,則構成 了Java語言的二維數組。二維數組常用于表示表,表中的信息以行和列的形式組織,第一個下標代表元素所在的行,第二個下標代表元素所在的列。

分配內存單元

在Java語言中,new是一個特殊的運算符,它的語義是:向系統申請指定數據類型所需的內存單元空間。new運算符返回所申請內存單元的首地址。數組元素本身的內存空間必須用new運算符申請。為數組類型變量分配內存單元的語法形式為:

其中,〈數組名〉必須是已定義的數組類型變量,〈數據類型〉必須和定義數組名時的數據類型一致,方括號[ ]內的〈長度〉為當前數組元素的個數。在數組分配內存單元后,系統將自動給每個數組元素賦初值,并規定: 數值類型的數組元素初值為0,邏輯類型的數組元素初值為false,類類型的數組元素初值為null。

字符串

字符串是n(n≥0)個字符組成的序列。為了把一個字符串和別的語言成分區分開來, Java中的字符串用一對雙引號括起來,一個字符串中的字符個數稱作字符串的長度。Java中的字符串變量用String來定義,但和char,int等基本數據類型不同的是,String不是一個數據類型,而是一個類。

字符串常量

一對雙引號括起來的任何字符序列都是一個字符串常量,如""和"sun" 都是字符串常量。 字符串常量""的長度為 0,字符串常量"sun"的長度為3。

字符串變量

定義字符串變量的方法和定義基本數據類型變量的方法類同,在定義字符串變量時可以同時賦值,或在字符串變量定義后給該變量賦值。字符串變量名是引用類型,即字符串變量名是指向內存中一片連續內存單元的首地址。

類聲明

類是對一組相似對象的抽象描述,是面向對象方法中軟件設計的主體。

類聲明的格式如下:

其中,〈修飾符〉分為訪問控制符和類型說明符兩部分,訪問控制符和類型說明符一起使用時,訪問控制符在前,類型說明符在后。類聲明中的class是定義類的關鍵字;〈類名〉是所定義的類的名字;〈父類名〉是已經定義過的類名;〈接口名表〉是已經定義過的若干個接口名,當接口名多于一個時,用逗號分隔開;類主體設計包括類的成員變量設計和類的成員方法設計兩部分。

成員變量

定義在類中的變量都是成員變量,聲明一個成員變量就是聲明該成員變量的名字及其所屬的數據類型,同時指定其他一些附加特性。聲明成員變量的格式為:

成員方法

聲明成員方法的格式為:

其中,〈修飾符〉和成員變量的修飾符一樣,有 private、public、protected三種與默認修飾符。static指明該方法是一個類方法。方法聲明中必須給出方法名和方法的返回值類型,如果沒有返回值,用關鍵字void標記。方法名后的一對圓括號是必須的,即使參數列表為空,也要加一對空括號。方法體是方法的具體實現。

構造方法

構造方法是一種專門被用來進行對象初始化的類方法,也稱作構造函數,其實現過程是:在創建對象時,將調用相應類中的構造方法為對象的成員變量進行初始化賦值。構造方法在語法上等同于其他方法,但它的名字必須與其類名完全相同,并且沒有返回值。構造方法一般應定義為public。構造方法用來在對象創建時為對象的成員變量進行初始化賦值。

主方法

主方法是類的入口點,它定義了程序從何處開始,提供對程序流向的控制。JAVA編譯器通過主方法來執行程序。主方法的特點:是靜態的,要直接在主方法中調用其他方法,則該方法必須也是靜態的;沒有返回值;形參為數組。

類中可以沒有主方法,但是要運行的類中必須有主方法,因為程序是從主方法開始執行的。

方法重寫

類的各種方法都允許重寫,也稱重載,是指一個方法名定義多個方法實現。方法重寫時要求,不同的方法,其參數類型或參數個數要有所不同。若類的某個方法被重寫,該類的對象在訪問該方法時,以對象調用該方法的參數個數和參數類型與類的同名方法進行匹配,對象調用該方法的參數個數和參數類型與類定義中哪個方法的參數個數和參數類型完全一樣,則調用類中的哪個方法。

對象

對象是類的實例化,對象就是軟件系統中對具體問題的客觀事物進行的具體模擬或具體描述。

創建和初始化

對象定義后,系統將給對象標識符分配一個內存單元,用于存放實際對象在內存中的存放位置。定義對象的語句格式為:

為對象分配內存空間需使用new運算符。為對象分配內存空間的語句格式為:

其中,new運算符申請對象所需的內存空間,new運算符返回所申請的內存空間的首地址。 系統將根據〈類名〉和〈參數列表〉調用相應的構造方法,為對象進行初始化賦值,即把參數值存入相應的內存單元中。賦值語句把new運算符分配的連續地址的首地址賦給對象名。 因為構造方法名和類名完全相同,所以這里的類名既用來作為new運算符的參數向系統申請對象所需的內存空間,又作為構造方法名為對象進行初始化賦值。程序設計時最經常使用的方法是在定義對象的同時為對象分配內存空間和進行初始化賦值。

相關操作

定義并創建了對象后,就可以使用對象的成員變量或方法,還可以修改對象的成員變量的數值。

對象可以像變量一樣賦值,但對象賦值并不是真正把一個對象的取值賦給另一個對象,而是讓另一個對象名存儲的對象的首地址和這個對象名存儲的對象的首地址相同,即對象的賦值是對象的首地址的賦值。

對象可以作為方法的參數使用,對象作為方法的實參時,系統把實參對象名(該對象必須已創建)指示的對象的首地址賦給虛參對象名。

垃圾對象回收

對象有作用范圍,超出作用范圍的對象(或稱不再被使用的對象)稱作垃圾對象。在Java中,收集和釋放內存由自動垃圾回收線程責任。自動垃圾回收線程在系統空閑時自動運行,這個線程監視用戶程序中所有對象的有效作用范圍;當某個對象超出其作用范圍時,該線程就對這樣的對象做上垃圾對象標識,并在適當的時候一次性回收這些垃圾對象。 因此,用戶只需考慮為對象分配內存空間,不需考慮垃圾對象內存空間的回收。

包(package)是Java提供的文件(即公共類)的組織方式。一個包對應一個文件夾,一 個包中可以包括許多類文件。包中還可以再有子包,稱為包等級。Java 語言規定:同一個包中的文件名必須惟一,不同包中的文件名可以相同。

系統定義的包

Java語言提供了許多方便用戶程序設計的基礎類,這些系統定義的類以包的形式保存在系統包文件夾中。如果要使用這些包中的類,必須在源程序中用import語句導入。

用戶定義的包

包的定義語句格式為:

其中,package是關鍵字,〈包名〉是包的標識符。package語句指出該語句所在文件所有的類屬于哪個包,package語句必須寫在Java源程序的第一行。當多個Java源程序文件中都有package語句,且package語句后的包名相同時,則說明這些類同屬于一個包。 一個包還可以有子包,子包下還可以有子子包。在 package 語句中,圓點(.)起分隔作用。

應用程序接口

Java API(Java Application Programming 接口,Java 應用程序接口),是 Java 語言提供的組織成包結構的許多類和接口的集合,包含在JDK中。Java API按照內容分別組織和存放在不同的包中。 Java API包含的內容很多,其中語言包(java.lang)與實用包(java.util)是兩個最基本的包。

語言包

java.lang包是用Java語言編程時使用最頻繁的包。為了簡化編程,系統默認導入了 java.lang包,所以使用java.lang包中的類時可以不用import語句導入。常用的類有 Object 類、System 類、Class 類、Runtime 類、String 類、數學 類和 Float 類。

Object類是Java中所有類的根,所有其他的類都是由Object類派生出來的,因此任何Java對象都可以調用Object類的方法。

System類提供了許多獲取或重新設置系統資源的靜態方法,它無法實例化。System類提供標準輸入、標準輸出和錯誤輸出流;訪問外部定義的屬性和環境變量;加載文件和庫的方法;以及一種用于快速復制陣列的一部分的實用方法。

Class類的實例代表一個正在運行的Java應用程序的類或接口。Java的基本數據類型 (boolean,byte,char,shart,int,long,float,double)以及數組和關鍵字void都是由Class對象來表達。

Runtime類是每一個Java應用程序都有一個的實例,從而允許應用程序與其運行的環境進行交互。用戶可利用 Runtime 類直接訪問運行時環境資源。

Float類將基本體類型Float的值包裝在對象中。Float類型的對象包含一個類型為Float的字段。這個類還提供了幾個將浮點轉換為String和將String轉換為浮點的方法,以及處理浮點時有用的其他常量和方法。

String類表示字符串。Java程序中的所有字符串文字都是作為此類的實例實現的。String類包含用于檢查序列中的各個字符、比較字符串、搜索字符串、提取子字符串以及創建所有字符都轉換為大寫或小寫的字符串副本的方法。

Math類包含了一組基本的數學運算的方法和常數。Math類中的所有方法都定義為靜態的。Math類把E和PI定義為類的靜態成員變量,E和PI代表數學上的相應常數。 Math類是最終類(final),所以不能從Math類中派生其他的新類。

實用包

java.util包主要包含集合框架、事件模型、日期和時間機制、國際化等的類和接口,常用的類和接口有Arrays類、Vector類、Data類和Enumeration接口。

Arrays類是Java集合框架的成員。這個類包含各種操作數組的方法(例如排序和搜索)。此類還包含一個靜態工廠,該工廠允許將數組作為列表進行查看。如果指定的數組引用為null,則該類中的所有方法都會拋出NullPointerException,除非另有說明。

Vector類稱作向量類,它實現了動態的數組,用于元素數量變化的對象數組。像數組一樣,Vector類也用從0開始的下標表示元素的位置;但和數組不同的是,當Vector對象創建后,數組的元素個數會隨著Vector對象元素個數的增大和縮小變化。

Data類提供了獲取當前精確到毫秒時間的方法,并提供了許多方法截取當前時間的年、 月、日等數值。

Calendar類是一個抽象類,它提供了在特定時刻和一組日歷字段(如YEAR、MONTH、DAY_of_MONTH、HOUR等)之間進行轉換的方法,以及操作日歷字段的方法。

Enumeration接口主要用于集合類對象的序列化。任何一個類,只要實現了Enumeration接口,其對象就是序列化的。所謂對象是序列化的,就是說若連續調用 nextElement()方法,每次將返回該集合對象當前元素的后續元素。

工具

JDK

Java開發工具包(Java Development Kit)是Java開發工具包,包括Java類庫、Java編譯器、Java解釋器、Java運行環境和Java命令行工具。JDK提供Java程序的編譯和運行命令,但沒有提供程序編輯環境。Java運行環境(Java Runtime Environment,JRE):Java運行環境主要包含Java虛擬機(Java Virtual Machine,JavaOS)和Java函數庫。JVM是一套支持Java語言運行的軟件系統,定義了指令集、寄存器集、類文件結構棧、垃圾收集堆、內存區域等,提供了跨平臺能力的基礎框架。

在選擇JDK開發Java程序時,需使用文本編輯器編寫Java源程序,在DOS窗口中編譯與運行Java程序。

IDE

Eclipse

Eclipse是IBM公司開發的Java IDE。Eclipse具有開放的功能擴展包,可以依照開發者自己的習慣進行配置。其web開發工具Wild Web Developer為最新版本的TypeScriptAngularJS提供版本支持。Eclipse具有安全功能,如強制使用https協議、PGP密鑰吊銷處理、跟蹤受信任的主機和不受信任的工件處理

MyEclipse

MyEclipse是IBM公司開發的Java IDE。MyEclipse提供Java EE庫和功能,支持部署到幾十個企業友好的應用服務器進行快速檢測。使用MyEclipse內置功能連接到云,支持探索和連接服務。MyEclipse支持快速添加技術功能到Web項目中,使用可視化編輯器以便編碼和配置,并且還可以在多種應用服務器上測試任務。MyEClipse支持使用Java、HTML和JQuery進行編碼,使用移動工具創建擁有良好編碼的應用,并嵌入到原生iOS和Android應用中,便于移動應用開發。

IntelliJ IDEA

IntelliJ IntelliJ IDEA簡稱IDEA,是由JetBrains公司開發的Java編程語言開發集成環境程序,具有智能代碼補全、框架針對性輔助、遠程開發的特點。用戶使用該程序編輯器時,可通過編碼輔助功能搜索可能的錯誤并在輸入時獲得改進建議,同時了解編碼、新語言功能等方面的內容。IntelliJ IDEA具備深度代碼理解,可以為用戶提供相關編碼建議,實現極快的導航和智能體驗。IntelliJ IDEA有豐富的工具集,任務關鍵型工具和多種支持語言與框架的使用較為方便,無需另外安裝插件。

構建工具

Maven

Apache Maven是一個構建和項目管理工具,可以用于構建和管理任何基于Java的項目。基于項目對象模型(POM)的概念,Maven可用于管理項目的生成、報告和文檔記錄。

Maven的特點有:開發人員可以在幾秒鐘內啟動新項目或模塊;優秀的依賴關系管理,包括自動更新、依賴關系關閉(也稱為傳遞依賴關系);能夠輕松地同時處理多個項目;擁有一個龐大且不斷增長的庫和元數據存儲庫,使用便捷且可以實時獲得其最新版本;可擴展,能夠輕松地用Java或腳本語言編寫插件;只需很少或根本不需要額外配置即可即時訪問新功能;能夠將任意數量的項目構建為預定義的輸出類型,在大多數情況下不需要執行任何腳本;使用與構建過程相同的元數據,Maven能夠生成一個網站或PDF,包括想要添加的任何文檔,并添加到有關項目開發狀態的標準報告中;在沒有太多額外配置的情況下,Maven將與用戶的源代碼管理系統集成,并基于某個標簽管理項目的發布,它還可以將其發布到分發位置,供其他項目使用;Maven能夠發布單獨的輸出;Maven鼓勵使用JAR和其他依賴關系的中央存儲庫。

Gradle

Gradle Build Tool是一款快速、可靠、適應性強的開源構建自動化工具,具有優雅且可擴展的聲明性構建語言,可以構建任何規模和復雜性的項目,支持Android、Java、 KotlinGroovyScala、Javascript和C/C++。Gradle是JVM流行的構建系統,也是Android和Kotlin多平臺項目的默認系統。它有一個豐富的社區插件生態系統,可以使用其內置功能、第三方插件或自定義構建邏輯來自動化各種軟件構建場景。Gradle提供了一種高級、聲明性和表達性的構建語言,使其易于閱讀和編寫構建邏輯。Gradle可以產生可靠的結果,同時受益于增量構建、構建緩存和并行執行等優化。

異常處理

異常是指程序在執行過程中出現的意外事件,它通常會使程序的正常流程被打斷。Java采用面向對象的異常處理機制,使正常代碼和錯誤處理代碼分開,這樣程序的業務邏輯更加清晰明了,并且能夠簡化錯誤處理任務。

異常類

Java的所有異常類都繼承自Throwable類,可以分為兩大類:Error類和 Exception類。

Error類指的是系統異常或運行環境出現的異常,這些異常一般是很嚴重的異常。程序一般不用捕捉Error錯誤,由系統進行這類錯誤的捕捉和處理。Error類及其子類定義了系統中可能出現的大多數Error錯誤。

Exception類指的是一般的異常,如輸入/輸出(I/O)異常、數據庫訪問(SQL)異常等,對這些異常應用程序可以進行處理。Exception類有較多的子類,可分為檢查性常類和運行時異常。Exception類異常和任何不屬于RuntimeException子類的子類都是已檢查的異常 。 RuntimeException是Java虛擬機正常操作期間可以拋出的異常的超類。RuntimeException及其子類是未檢查的異常。

異常處理

在Java程序中,用try-catch(或 try-catch-finally)語句來拋出、捕捉和處理異常。try-catch-finally語句的語法格式是:

try模塊中的語句是程序正常流程要執行的語句,但是在執行過程中有可能出現異常。程序中沒有try模塊時,若出現了系統定義的異常,系統也會自動拋出,并由系統負責捕捉和處理。

try模塊中的語句可能拋出很多不同類型的異常,可針對不同類型的異常分別設計catch模塊。如果try模塊拋出異常,系統會按catch模塊的排列順序依次查找。當所有的catch模塊中都匹配不上時,由虛擬機來處理異常。

finally模塊中的語句是必須執行的語句。無論try模塊中是否拋出異常,finally模塊中的 語句都要被執行。這個模塊是可選的。finally模塊通常被用來做一些資源回收的工作。

異常拋出

throws

throws通常用于方法聲明,當方法中可能存在異常,卻不想在方法中對異常進行處理時,就可以在聲明方法時使用throws聲明出的異常,然后在調用該方法的其他方法中對異常進行處理。throws可以聲明拋出多個異常類,多個異常類之間以逗號隔開,語法格式如下:

使用throws聲明拋出異常時有一個限制:子類方法中聲明拋出的異常類型應該是父類方法聲明拋出的異常類型的子類或相等,子類方法中不允許比父類方法聲明拋出更多異常。

throw

當程序出現錯誤時,系統會自動拋出異常;除此之外,Java也允許程序自行拋出異常,自行拋出異常使用throw語句完成。throw語句可以單獨使用,throw語句拋出的不是異常類,而是一個異常實例,且每次只能拋出一個異常實例。throw語句語法格式:

自定義異常類

應用程序中除了可能出現系統定義的異常外,有時還可能出現系統沒有考慮的異常,此時則需要在應用程序中自定義異常類。一般情況下,自定義的異常類都是一些應用程序可以處理的異常。用戶自定義異常都應該繼承Exception基類。定義異常類時通常需要提供兩種構造器:一個是無參數的構造器;另一個是帶一個字符串的構造器,這個字符串將作為該異常對象的詳細說明,即異常對象的getMessage方法的返回值。

輸入輸出

數據流

輸入輸出流

Java把所有輸入和輸出都當作流來處理。流是按一定順序排列的數據的集合,例如,字符文件、聲音文件或圖像文件等都可以看作是一個個的數據流。輸入和輸出的方向是以程序為基準的。向程序輸入數據的流定義為輸入流,從程序輸出數據的流定義為輸出流。Java的輸入/輸出流中,根據它們的數據類型,主要可分為兩類:字節流和字符流。

標準數據流

Java的標準數據流指程序和DOS交互時的輸入/輸出方式。java.lang包的System類定義了三個成員變量:標準輸入static final InputStream in、標準輸出static final PrintStream out、標準錯誤輸出static final PrintStream err。因為這三個成員變量都是靜態成員變量,即類成員變量,所以可以直接使用, 不需要創建對象。

基本輸入輸出類

Java語言定義了許多類專門負責各種方式的輸入/輸出,這些類都被放在java.io包中。其中,所有輸入流類都是抽象類InputStream(字節輸入流)或抽象類Reader(字符輸入流)的子類,而所有輸出流都是抽象類OutputStream(字節輸出流)或抽象類Writer(字符輸出流)的子類。

InputStream類稱作字節輸入流類,為其他輸入字節流子類提供了一些基本方法和標準接口。Reader類稱作字符輸入流類,Reader類為通用的輸入字符流提供了一些基本方法和標準接口。 Reader類和InputStream類的很多方法很相似,它們的主要區別是:InputStream類操作的是字節,Reader類操作的是字符

OutputStream類稱作字節輸出流類,為其他的輸出字節流子類提供了一些基本方法和標準接口。Writer類及其子類Writer類稱作字符輸出流類,為通用的輸出字符流提供了一些基本方法和標準接口。Writer類和OutputStream類的很多方法很相似,它們的主要區別是:OutputStream類操作的是字節,Writer類操作的是字符。

對象流

對象都有一定的生命周期。對象流可以將一個對象生命周期的某一階段的狀態保存下來,當需要的時候,再將保存的對象狀態恢復。對象流有對象輸入流ObjectInputStream類和對象輸出流ObjectOutputStream類。 ObjectInputStream類是 InputStream類的子類,它主要用于對象的恢復。ObjectOutputStream類是 OutputStream類的子類,它主要用于對象的保存。

對象流中的對象通常不止一個,為了保證保存和恢復的對象不會出錯,必須保證這些對象都是序列化的對象。序列化的對象是指能夠按順序操作對象流中的對象。一個類如果實現了Serializable接口,它的對象就是序列化的對象。Serializable接口的定義如下:

這個接口是空的,其中沒有定義任何方法,因此實現這個接口非常簡單,僅需在類定義時,包含implements Serializable就可以了。

進行對象流的保存(或稱寫)時需要注意,只能保存對象的非靜態成員變量,不能保存 任何靜態的成員變量,而且保存的只是變量的當前值,對于變量的任何修飾符都不能保存。

文件操作

File類是io包中唯一代表磁盤文件本身的對象,定義了一些與平臺無關的方法來操作文件,可以通過調用File類中的方法,實現創建、刪除、重命名文件等。File類的對象主要用來獲取文件本身的一些信息。

RandomAccessFile類被稱作隨機存取文件類,它提供了隨機訪問文件的方法。和輸入/輸出流類相比,RandomAccessFile類有兩點不同:RandomAccessFile類是直接繼承自對象類Object,同時實現了DataInput接口和DataOutput接口;RandomAccessFile 類既可以作為輸入流,又可以作為輸出流。 RandomAccessFile類之所以允許隨機訪問文件,是由于它定義了一個文件當前位置指針, 文件的存取都是從文件當前位置指針指示的位置開始的。通過移動這個指針,就可以從文件的任何位置開始進行讀/寫操作。

多線程

Java是原生支持多線程編程的。采用多線程機制可以并發處理多個任務,并且互不干涉,不會由于某一任務處于等待狀態而影響其他任務的執行。

Thread類和Runnable接口

Thread(線程)類和 Runnable(可運行)接口提供了支持線程的功能。由于Thread 類和Runnable接口是在java.lang(語言)包中,所以使用Thread類和Runnable接口時不需要使用import導入語句。

Thread類

Thread類是Java中支持多線程機制的一個重要類,它提供了很多控制和調度線程的方 法。這些方法包括:啟動、睡眠、運行等。

如果要設計一個包含線程的程序,一種常用的方法是繼承Thread類,并要在這個類中實現run()方法。程序設計時,把想要運行的程序代碼(即線程) 放入run()方法中。當創建了一個線程對象后,可以用start()方法來啟動這個線程,start()方法通過自動調用run()方法來執行當前線程包含的代碼。

Runnable接口

任何實現Runnable接口的類都支持多線程。在Runnable接口中只有一個方法:run()。

要設計線程程序,用繼承Thread類方法比用實現Runnable接口方法更簡單,因為用實現Runnable接口方法設計時,要使用Thread類提供的方法必須定義Thread類的對象,即通過Thread類的對象來調用Thread類的方法。Runnable接口主要用于多繼承。

線程的狀態和狀態控制

線程狀態

線程的生命周期是指線程從創建、運行到死亡的過程。在一個線程的生命周期內,可以有五種狀態,即創建、可運行、運行中、不可運行(或稱阻塞)和死亡狀態。通過對線程的控制和調度,一個線程可以在這五種狀態之間轉換。Thread類中提供的方法和Object類提供的wait()和notify()方法可以在程序中改變線程的狀態。

創建:當程序使用new關鍵字創建了一個線程之后,該線程就處于新建狀態。此時的線程對象沒有表現出任何線程的動態特征,程序也不會執行線程執行體中的線程執行體。

可運行:在調用了新創建線程對象的start方法后,線程就處于可運行狀態。 可運行狀態的線程可能會同時有很多,這些可運行狀態的線程在一個優先級隊列中排隊, 等待操作系統的線程調度程序調度。

運行中:若處于可運行狀態的線程獲得了CPU,并開始執行run方法的線程執行體,則該線程處于運行狀態。如果計算機只有一個CPU,那么在任何時刻只有一條線程處于運行狀態。

不可運行狀態:不可運行狀態也稱為阻塞狀態,是指因為某種原因系統不能執行線程的狀態。這時就是處理器空閑也不能執行該線程。 進入不可運行狀態的原因通常有:線程調用了sleep()方法;線程調用了Object類的wait()方法; 輸入/輸出流中發生了線程阻塞。

死亡狀態:線程會以正常結束、拋出異常結束或stop()方法結束等三種方式之一結束,結束后就處于死亡狀態。

線程分組

每一個線程都是一個線程組的成員。線程分組提供了一個統一管理多個線程而不需單獨管理的機制。Java語言的java.lang包中的ThreadGroup子包提供了實現線程分組的類。

線程互斥

為了避免多個并行運行的線程對共享資源操作時出現問題,Java語言引入了互斥鎖。互斥鎖是基于共享資源的互斥性設計的,用來標記那些多個并行運行的線程共享的資源。 被互斥鎖標記的共享資源,在一個時間段內,只能有一個線程使用;只有當加互斥鎖的線程使用完了該共享資源,另一個線程才可以使用。這樣就可以保證線程對共享資源操作的正確性。

關鍵字synchronized是用來給共享資源加互斥鎖的。當某個共享資源被用synchronized修飾時,就表明該共享資源在某段時間內只能由加鎖的線程訪問。為共享資源加互斥鎖有鎖定一個對象和一段代碼或鎖定一個方法兩種方法。

鎖定一個對象和一段代碼聲明格式為:

對象表示要鎖定的共享資源;花括號內的語句組表示鎖定對象期間執行的語句,表示對象的鎖定范圍。此格式可以用來在一個線程的一部分代碼上加互斥鎖。 當一個線程執行這段代碼時,就鎖定了指定的對象。此時,如果其他線程也要對加了互斥鎖的對象進行操作,就無法進行;其他線程必須等候,直到該對象的鎖被釋放為止。加鎖的線程執行完花括號內的語句后,將釋放對該對象加的鎖。這就形成了多個線程對同一個對象的“互斥”使用方式,因此該對象也稱為互斥對象。

鎖定一個方法聲明格式為:

此格式鎖定的是方法所屬類的對象,鎖定的范圍是整個方法,即在一個線程執行整個方法期間對該方法所屬類的對象加互斥鎖。

線程同步

Object類提供了一組關于線程同步的方法:wait()方法和 notify()方法。wait()方法是把當前線程從運行狀態轉為阻塞狀態;notify()方法是把等待線程從阻塞狀態轉為可運行狀態,從而有機會讓線程調度程序調度進入運行狀態。wait()方法所在的代碼段一定要加互斥鎖synchronized,因為wait()方法在把當前線程從運行狀態轉為阻塞狀態后,還要釋放互斥鎖鎖定的共享資源(否則其他同步線程無法運行),這樣的操作不允許中間被打斷。

代碼示例

設計一個日期類,判斷某個日期坐在年份是否為閏年,若為閏年則輸出所在月份的總天數,若不是閏年則輸出幾年后為閏年。

安全模型

Java的安全模型是其多個重要結構特點之一,它使Java成為適于網絡環境的技術。

Java沙箱是一種讓Java應用程序在一個受限的環境中運行的機制,其目的是保護系統和用戶的安全。沙箱能夠在應用程序中啟用一些安全管理功能,以保護系統和用戶的安全,防止應用程序意外或惡意地破壞系統。

類裝載器

類加載器可以在將類加載到虛擬機中的時候檢查類的完整性。在Java沙箱中,類裝載器體系結構是第一道防線。類裝載器體系結構在三個方面對Java的沙箱起作用:防止惡意代碼去干涉善意的代碼;守護了被信任的類庫的邊界;將代碼歸入某類(保護域)。

類裝載器體系結構可以防止惡意的代碼去干涉善意的代碼,這是通過為不同的類裝載器裝入的類提供不同的命名空間來實現的。命名空間由一系列唯一的名稱組成,每一個被裝載的類有一個名字,這個命名空間是由Java虛擬機為每一個類裝載器維護的。

類裝載器體系結構守護了被信任的類庫的邊界,這是通過分別使用不同的類裝載器裝載可靠的包和不可靠的包來實現的。雖然通過賦給成員受保護(或包訪問)的訪問限制,可以在同一個包中的類型間授予彼此訪問的特殊權限,但這種特殊的權限只能授給在同一個包中的運行時成員,而且它們必須是由同一個類裝載器裝載的。

類裝載器要知道一個類是否來源于一個被禁止的包,需要通過它的類名來檢測。除了屏蔽不同命名空間中的類以及保護被信任的類庫的邊界外,類裝載器還起到另外的安全作用。類裝載器必須將每一個被裝載的類放置在一個保護域中,一個保護域定義了這個代碼在運行時將得到怎樣的權限。

字節碼校驗器

當類加載器將新加載的Java平臺類的字節碼傳遞給虛擬機時,這些字節碼首先要接受校驗器的校驗。校驗器負責檢查那些指令無法執行的明顯有破壞性的操作。除了系統類外,所有的類都要被校驗。

字節碼檢驗器要進行大量的檢查,以確保采用任何路徑在字節碼流中都得到一個確定的操作碼,確保操作數棧總是包含正確的數值以及正確的類型。它必須保證局部變量在賦予合適的值以前不能被訪問,而且類的字段中必須總是被賦予正確類型的值,類的方法被調用時總是傳遞正確數值和類型的參數。字節碼檢驗器還必須保證每一個操作碼都是合法的,即每一個操作碼都有合法的操作數,以及對每一個操作碼,合適類型的數值位于局部變量中或是在操作數棧中。這些僅僅是字節碼檢驗器所做的大量檢驗工作中的一小部分,在整個檢驗過程通過后,它就能保證這個字節碼流可以被Java虛擬機安全地執行。

安全管理器

安全管理器是一個負責控制具體操作是否允許執行的類。安全管理器負責檢查的操作包括:創建一個新的類加載器;退出虛擬機;使用反射訪問另一個類的成員;訪問本地文件;打開socket連接;啟動打印作業;訪問系統剪貼板;訪問AWT事件隊列;打開一個頂層窗口。

每個類都有一個保護域,它是一個用于封裝類的代碼來源和權限集合的對象。當Security Manager類需要檢查某個權限時,它要查看當前位于調用堆棧上的所有方法的類,然后它要獲得所有類的保護域,并且詢問每個保護域,其權限集合是否允許執行當前正在被檢查的操作。如果所有的域都同意,那么檢查得以通過。否則,就會拋出一個 Security Exception異常。在運行Java應用程序時,默認設置不安裝安全管理器。

應用

圖形用戶界面編程

Java使用AWT和Swing類完成圖形用戶界面編程,其中AWT的全稱是抽象窗口工具集(Abstract Window Toolkit),它是Sun公司最早提供的GUI庫,這個GUI庫提供了一些基本功能,但這個GUI庫的功能比較有限,所以后來又提供了Swing庫。通過使用AWT和Swing提供的圖形界面組件庫,程序只要依次創建所需的圖形組件,并以合適的方式將這些組件組織在一起,就可以開發出用戶界面。在設計圖形用戶界面后,通過相關的類或接口進行事件處理,就可以實現使用界面來控制相關程序的執行。

Web開發

Web應用提供Internet的瀏覽服務。Java早期采用Applet技術實現動態Web頁面設計,目前采用JSP等技術實現服務端的動態Web頁面設計。

Java Applet是運行于各種網頁文件中, 用于增強網頁的人機交互、動畫顯示、聲音播放等功能的程序。 Java Applet能夠跨平臺地運行于網絡中各種不同類型的計算機上。客戶端的計算機,只要安裝了支持Java的瀏覽器,并且和網絡中的服務器建立了連接,就可以從服務器下載嵌入了Applet的網頁文件,并在本地機的瀏覽器上運行含有 Applet的網頁。

JSP(Java Server Pages)是Sun公司1999年推出的一種動態網頁技術標準,它在HTML文檔中嵌入Java語言,是運行于Web服務端的標記語言。JSP基于Java體系的Web開發技術,可以建立跨平臺安全、高效的動態網站。

數據庫應用

Java提供Java數據庫連接,支持數據庫應用。JDBC(Java DataBaseConnectivity,Java數據庫連接) 是Java訪問關系數據庫的應用程序接口,提供多種數據庫驅動程序類型,提供執行SQL來操縱關系數據庫的方法,使Java應用程序具有訪問不同類型數據庫的能力。

網絡通信

在Java中有許多與網絡通信有關的類和接口,利用它們可以方便地實現網上資源的定位和獲取,以及實現計算機之間的通信和文件的傳輸等。Java用于網絡通信的包是 java.net,它包含了多個用于各種標準網絡協議通信的類和接口。java.net提供了兩個類:Socket類和ServerSocket類,分別用來表示雙向連接的客戶機端Socket和服務器端Socket。在創建了Socket對象和ServerSocket對象后調用相應的方法,就可以實現網絡通信。

企業級應用

Java EE是Java的企業級應用平臺,它以Java SE為基礎向外延伸,增加了許多支持企業內部使用的擴充類,提供分布式企業軟件組件架構規范,具有開放性、可擴展性、集成性和Java EE服務器之間的互操作性。它支持使用多層架構的企業應用如企業資源計劃 (ERP)系統、移動CRM(CRM))系統。

嵌入式系統與移動終端

嵌入式系統開發所選擇的語言有很多種,由于Java語言具有跨平臺,純面向對象以及網絡編程等優點,使其在嵌入式系統軟件開發中嶄露頭角。 Java ME套件是Java SE套件中的子集 ,它被設計出來的主要目的是提供嵌入式系統 、掌上型系統等小型操作系統的開發套件,這些系統包括了PDA、手機 、Ic卡 、家電產品和工廠自動化設備。對內存需求較小。

Android操作系統是當下流行的移動端系統,它是由Java語言開發的,其運行程序均為Java。Java 的可移植性使不同手機操作系統的不同手機格式無法進行信息交流的問題得到了有效解決 。在開發安卓軟件時,Java編程語言可對硬件與軟件功能進行區分,建立的通訊軟件系統也更完善。

未來發展

物聯網開發

互操作性是物聯網應用的關鍵因素。Java具有很好的互操作性,因此是復雜物聯網項目的優秀選擇。Java具有多功能性和靈活性,以及跨平臺性,因此物聯網的開發人員一般傾向于使用Java語言進行開發。

云計算

2021年,Oracle推出了Oracle Java管理服務,這是一種Oracle云基礎設施(OCI)本機服務,可幫助組織在本地或任何云上管理Java運行時和應用程序。2022年,甲骨文公司推出Java Management Service(JMS),這是一款云端基礎設施(OCI)原生服務,可協助管理內部部署或任何云端的Java程序實際執行和應用程序。 Java在Web、移動設備及云計算等方面有著前景廣闊,隨著云計算及移動領域的擴張,更多的企業考慮將其應用部署在Java上。

參考資料 >

..2022-11-03

..2023-08-28

..2023-08-28

主要功能、新功能.IntelliJ IDEA:JetBrains功能強大、符合人體工程學的Java IDE.2022-10-30

Desktop IDE.Eclipse Desktop & Web IDEs.2022-10-30

Java EE開發、Web開發.Myeclipse中文網官方正版.2022-10-30

Java Downloads.Oracle.2023-08-29

..2023-08-29

..2023-08-28

..2023-08-28

..2023-08-29

..2023-08-29

Java Naming Scheme.Oracle.2023-09-06

..2023-08-29

The Arrival of Java 20!.Inside Java.2023-08-28

Java 軟件.Oracle 中國.2023-08-28

TIOBE index.TIOBE.2023-08-30

Java FAQ.中國科學院科普云平臺.2023-09-18

..2023-08-30

..2023-08-28

..2023-08-29

..2023-08-28

The javadoc Command.oracle.2023-08-29

Java 10正式版發布:包含109項新特性(附下載地址).閩南網.2023-08-30

Oracle Releases Java 17.Oracle.2023-08-30

甲骨文正式推出 Java 18.Oracle.2023-08-30

甲骨文正式發佈Java 19.oracle.2023-08-30

The Arrival of Java 20.Java.2023-08-30

Java Platform SE 8.Oracle.2023-08-31

Welcome to Apache Maven.Maven.2023-09-07

Introduction.Maven.2023-09-07

Feature Summary.Maven.2023-09-07

Gradle User Manual.Gradle.2023-09-07

生活家百科家居網