在 Java 編程語言中,關(guān)鍵字是具有特殊含義的保留字,它們用于表示語言中的特定功能和操作。
了解和正確使用這些關(guān)鍵字對于編寫高效、可靠的 Java 程序至關(guān)重要。
今天通過這篇文章,我們一起來了解一下相關(guān)的關(guān)鍵字以及含義。
圖片
?表示可以訪問,x表示不能訪問
圖片
private 關(guān)鍵字是訪問控制修飾符,可以應(yīng)用于內(nèi)部類、方法或類的變量字段。只能在聲明 private(內(nèi)部)類、方法或字段的類中引用這些類、方法或字段。在類的外部或者對于子類而言,它們是不可見的。
default:關(guān)鍵字是可以應(yīng)用于類、方法或類的變量字段的訪問控制修飾符。當(dāng)沒有指定類的訪問權(quán)限的時候,虛擬機(jī)就會默認(rèn)的形式給類劃定界限!默認(rèn)修飾的類無法被其他包的類繼承!
protected:關(guān)鍵字是可以應(yīng)用于內(nèi)部類、方法或類的變量字段的訪問控制修飾符。可以在聲明 protected 類、方法或字段的類、同一個包中的其他任何類以及任何子類(無論子類是在哪個包中聲明的)中引用這些類、方法或字段。
public:關(guān)鍵字是可以應(yīng)用于類、方法或類的變量字段的訪問控制修飾符。可以在其他任何類或包中引用 public 類、方法或字段。
圖片
class 關(guān)鍵字用來聲明新的 Java 類,該類是相關(guān)變量和/或方法的集合。類是面向?qū)ο蟮某绦蛟O(shè)計(jì)方法的基本構(gòu)造單位。要使用類,通常使用 new 操作符將類的對象實(shí)例化,然后調(diào)用類的方法來訪問類的功能。
abstract關(guān)鍵字可以修改類或方法。abstract類可以擴(kuò)展(增加子類),但不能直接實(shí)例化。abstract方法不在聲明它的類中實(shí)現(xiàn),但必須在某個子類中重寫。采用 abstract方法的類本來就是抽象類,并且必須聲明為abstract。
extends 關(guān)鍵字用在 class 或 interface 聲明中,用于指示所聲明的類或接口是其名稱后跟有 extends 關(guān)鍵字的類或接口的子類。子類繼承父類的所有 public 和 protected 變量和方法(但是不包括構(gòu)造函數(shù))。子類可以重寫父類的任何非 final 方法。一個類只能擴(kuò)展一個其他類,但一個接口可以繼承多個接口。
implements 關(guān)鍵字在 class 聲明中使用,以指示所聲明的類提供了在 implements 關(guān)鍵字后面的名稱所指定的接口中所聲明的所有方法的實(shí)現(xiàn)。類必須提供在接口中所聲明的所有方法的實(shí)現(xiàn)。一個類可以實(shí)現(xiàn)多個接口。
interface 關(guān)鍵字用來聲明新的 Java 接口,接口是方法的集合。
在Java中,final關(guān)鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量)。final方法在編譯階段綁定,稱為靜態(tài)綁定(static binding)。下面就從這四個方面來了解一下final關(guān)鍵字的基本用法。
當(dāng)用final修飾一個類時,表明這個類不能被繼承,不能有子類。也就是說,如果一個類你永遠(yuǎn)不會讓他被繼承,就可以用final進(jìn)行修飾。final類中的成員變量可以根據(jù)需要設(shè)為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
下面這段話摘自《Java編程思想》:
使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實(shí)現(xiàn)版本中,會將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進(jìn)行這些優(yōu)化了。
因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設(shè)置為final的。
還有就是,類的private方法會隱式地被指定為final方法。
修飾變量是final用得最多的地方。
對于一個final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。引用變量被final修飾之后,雖然不能再指向其他對象,但是它指向的對象的內(nèi)容是可變的。
當(dāng)函數(shù)參數(shù)為final類型時,你可以讀取使用該參數(shù),但是無法改變該參數(shù)的值或者引用指向。道理同final變量。
strictfp的意思是FP-strict,也就是說精確浮點(diǎn)的意思。在Java虛擬機(jī)進(jìn)行浮點(diǎn)運(yùn)算時,如果沒有指定strictfp關(guān)鍵字時,Java的編譯器以及運(yùn)行環(huán)境在對浮點(diǎn)運(yùn)算的表達(dá)式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結(jié)果往往無法令人滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那么所聲明的范圍內(nèi)Java的編譯器以及運(yùn)行環(huán)境會完全依照浮點(diǎn)規(guī)范IEEE-754來執(zhí)行。因此如果想讓浮點(diǎn)運(yùn)算更加精確,而且不會因?yàn)椴煌挠布脚_所執(zhí)行的結(jié)果不一致的話,那就請用關(guān)鍵字strictfp。
可以將一個類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構(gòu)造函數(shù)聲明strictfp關(guān)鍵字。
static可以用于修飾屬性,可以修飾代碼塊,也可以用于修飾方法,還可以用于修飾類。
無論一個類生成了多少個對象,所有這些對象共同使用唯一一份靜態(tài)的成員變量;一個對象對該靜態(tài)成員變量進(jìn)行了修改,其他對象的該靜態(tài)成員變量的值也會隨之發(fā)生變化。如果一個成員變量是static的,那么我們可以通過‘類名.成員變量名’的方式來使用它。
static修飾的方法叫做靜態(tài)方法。對于靜態(tài)方法來說,可以使用‘類名.方法名’的方式來訪問。靜態(tài)方法只能繼承,不能重寫(Override),因?yàn)橹貙懯怯糜诒憩F(xiàn)多態(tài)的,重寫只能適用于實(shí)例方法,而靜態(tài)方法是可以不生成實(shí)例直接用類名來調(diào)用,這就會與重寫的定義所沖突,與多態(tài)所沖突,所以靜態(tài)方法不能重寫,只能是隱藏。
static方法與非static方法:不能在靜態(tài)方法中訪問非靜態(tài)成員變量;可以在靜態(tài)方法中訪問靜態(tài)的成員變量。可以在非靜態(tài)方法中訪問靜態(tài)的成員變量:因?yàn)殪o態(tài)方法可以直接用類名來調(diào)用,而非靜態(tài)成員變量是在創(chuàng)建對象實(shí)例時才為變量分配內(nèi)存和初始化變量值。
不能在靜態(tài)方法中使用this關(guān)鍵字:因?yàn)殪o態(tài)方法可以直接用類名來調(diào)用,而this實(shí)際上是創(chuàng)建實(shí)例時,實(shí)例對應(yīng)的一個應(yīng)用,所以不能在靜態(tài)方法上使用this。
靜態(tài)代碼塊。靜態(tài)代碼塊的作用也是完成一些初始化工作。首先執(zhí)行靜態(tài)代碼塊,然后執(zhí)行構(gòu)造方法。靜態(tài)代碼塊在類被加載的時候執(zhí)行,而構(gòu)造方法是在生成對象的時候執(zhí)行;要想調(diào)用某個類來生成對象,首先需要將類加載到Java虛擬機(jī)上(JVM),然后由JVM加載這個類來生成對象。
類的靜態(tài)代碼塊只會執(zhí)行一次,是在類被加載的時候執(zhí)行的,因?yàn)槊總€類只會被加載一次,所以靜態(tài)代碼塊也只會被執(zhí)行一次;而構(gòu)造方法則不然,每次生成一個對象的時候都會調(diào)用類的構(gòu)造方法,所以new一次就會調(diào)用構(gòu)造方法一次。如果繼承體系中既有構(gòu)造方法,又有靜態(tài)代碼塊,那么首先執(zhí)行最頂層的類的靜態(tài)代碼塊,一直執(zhí)行到最底層類的靜態(tài)代碼塊,然后再去執(zhí)行最頂層類的構(gòu)造方法,一直執(zhí)行到最底層類的構(gòu)造方法。注意:靜態(tài)代碼塊只會執(zhí)行一次。
這個有點(diǎn)特殊,首先,static是可以用來修飾類的,但是static是不允許用來修飾普通類,只能用來修飾內(nèi)部類,被static所修飾的內(nèi)部類可以用new關(guān)鍵字來直接創(chuàng)建一個實(shí)例,不需要先創(chuàng)建外部類實(shí)例。static內(nèi)部類可以被其他類實(shí)例化和引用(即使它是頂級類)。
其實(shí)理解起來也簡單。因?yàn)閟tatic主要是修飾類里面的成員,包括內(nèi)部類、屬性、方法這些。修飾這些變量的目的也很單純,那就是暗示這個成員在該類之中是唯一的一份拷貝,即便是不斷的實(shí)例化該類,所有的這個類的對象都會共享這些static成員。這樣就好辦了。因?yàn)槭枪蚕淼摹⑽ㄒ坏模裕簿筒恍枰趯?shí)例化這個類以后再通過這個類來調(diào)用這個成員了,顯然有點(diǎn)麻煩,所以就簡單一點(diǎn),直接通過類名直接調(diào)用static成員,更加直接。然而這樣設(shè)置之后,就出現(xiàn)了一個限制,就是,static方法之中不能訪問非static屬性,因?yàn)檫@個時候非static屬性可能還沒有給他分配內(nèi)存,該類還沒有實(shí)例化。
所以,通常,static 關(guān)鍵字意味著應(yīng)用它的實(shí)體在聲明該實(shí)體的類的任何特定實(shí)例外部可用。
可以從類的外部調(diào)用 static 方法,而不用首先實(shí)例化該類。這樣的引用始終包括類名作為方法調(diào)用的限定符。
synchronized 關(guān)鍵字可以應(yīng)用于方法或語句塊,并為一次只應(yīng)由一個線程執(zhí)行的關(guān)鍵代碼段提供保護(hù)。
synchronized 關(guān)鍵字可防止代碼的關(guān)鍵代碼段一次被多個線程執(zhí)行。
transient 關(guān)鍵字可以應(yīng)用于類的成員變量,以便指出該成員變量不應(yīng)在包含它的類實(shí)例已序列化時被序列化。
當(dāng)一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進(jìn)去的。
volatile 關(guān)鍵字用于表示可以被多個線程異步修改的成員變量。
注意:volatile 關(guān)鍵字在許多 Java 虛擬機(jī)中都沒有實(shí)現(xiàn)。volatile 的目標(biāo)用途是為了確保所有線程所看到的指定變量的值都是相同的。
native 關(guān)鍵字可以應(yīng)用于方法,以指示該方法是用Java以外的語言實(shí)現(xiàn)的,方法對應(yīng)的實(shí)現(xiàn)不是在當(dāng)前文件,而是在用其他語言(如C和C++)實(shí)現(xiàn)的文件中。。
Java不是完美的,Java的不足除了體現(xiàn)在運(yùn)行速度上要比傳統(tǒng)的C++慢許多之外,Java無法直接訪問到操作系統(tǒng)底層(如系統(tǒng)硬件等),為此Java使用native方法來擴(kuò)展Java程序的功能。
枚舉類型(Enumerated Type) 很早就出現(xiàn)在編程語言中,它被用來將一組類似的值包含到一種類型當(dāng)中。而這種枚舉類型的名稱則會被定義成獨(dú)一無二的類型描述符,在這一點(diǎn)上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變量提供更大的取值范圍。
if(布爾值) { ...} else { ...}
for (int i = 0; i < 10; i++) { ...}
for (數(shù)據(jù)類型 變量值 : 數(shù)組) { ...}
while (布爾值) { ...}
do { ...} while (布爾值);
switch(變量){ case 值1 : //語句 break; //可選 case 值2 : //語句 break; //可選 //你可以有任意數(shù)量的case語句 default : //可選 //語句}
result = 需要判斷的對象 instanceof 已知對象result為布爾值
continue:表示跳過當(dāng)前程序,繼續(xù)下一個,一般用于循環(huán)語句
for (int i = 0; i < 10; i++) { if(i == 6){ //如果i等于6 ,就跳過,進(jìn)行下一次循環(huán) continue; }}
break:表示跳過當(dāng)前程序,結(jié)束,一般用于循環(huán)語句
for (int i = 0; i < 10; i++) { if(i == 6){ //如果i等于6 ,就跳過,結(jié)束循環(huán)語句 continue; }}
return:結(jié)束當(dāng)前流程,返回結(jié)果!
return null;
assert:斷言是為了方便調(diào)試程序,并不是發(fā)布程序的組成部分。理解這一點(diǎn)是很關(guān)鍵的,后面會單獨(dú)介紹!
斷言是通過關(guān)鍵字assert來定義的,一般的,它有兩種形式。
#例如:assert <bool expression>;boolean isStudent = false; assert isStudent;
#例如:assert <bool expression> : <message>;boolean isSafe = false; assert isSafe : "Not Safe at all";
try { ...} catch (Exception e) { //異常} finally { //異常最終執(zhí)行語句}
throw new Exception();
對應(yīng)的方法需要聲明跑出異常
throws Exception
例如:
public static void main(String[] args) throws Exception { try { System.out.println("hello world"); } catch (Exception e) { throw new Exception(); } finally { System.out.println("異常結(jié)束"); }}
圖片
圖片
import 關(guān)鍵字使一個包中的一個或所有類在當(dāng)前 Java 源文件中可見。可以不使用完全限定的類名來引用導(dǎo)入的類。
當(dāng)多個包包含同名的類時,許多 Java 程序員只使用特定的 import 語句(沒有“*”)來避免不確定性。
package 關(guān)鍵字指定在 Java 源文件中聲明的類所駐留的 Java 包。
package 語句(如果出現(xiàn))必須是 Java 源文件中的第一個非注釋性文本。例:java.lang.Object。如果 Java 源文件不包含 package 語句,在該文件中定義的類將位于“默認(rèn)包”中。請注意,不能從非默認(rèn)包中的類引用默認(rèn)包中的類。
正確識別java語言的關(guān)鍵字(keyword)和保留字(reserved word)是十分重要的。Java的關(guān)鍵字對java的編譯器有特殊的意義,他們用來表示一種數(shù)據(jù)類型,或者表示程序的結(jié)構(gòu)等。保留字是為java預(yù)留的關(guān)鍵字,他們雖然現(xiàn)在沒有作為關(guān)鍵字,但在以后的升級版本中有可能作為關(guān)鍵字。識別java語言的關(guān)鍵字,不要和其他語言如c/c++的關(guān)鍵字混淆。const和goto是java的保留字。所有的關(guān)鍵字都是小寫。
goto 保留關(guān)鍵字,但無任何作用。結(jié)構(gòu)化程序設(shè)計(jì)完全不需要 goto 語句即可完成各種流程,而 goto 語句的使用往往會使程序的可讀性降低,所以 Java 不允許 goto 跳轉(zhuǎn)。
const 保留字,是一個類型修飾符,使用const聲明的對象不能更新。與final某些類似。
以上內(nèi)容,只是簡單的介紹一下java所有的關(guān)鍵字。
其實(shí)每個關(guān)鍵字都有很深的含義和應(yīng)用場景,而且每個 java 的版本,一些關(guān)鍵字的應(yīng)用可能還會有些變動,比如 jdk1.8 接口里面的方法可以用default修飾,實(shí)現(xiàn)接口的類,不必顯式的進(jìn)行重寫改方法,所以,大家可以在實(shí)際的工作中去不斷的深入了解這些關(guān)鍵字,后面小編可能還會深入的分析每個關(guān)鍵字的作用,謝謝大家閱讀本文!
本文鏈接:http://www.tebozhan.com/showinfo-26-94297-0.html盤點(diǎn)歷屆 Java 語言的關(guān)鍵字,一定有你不認(rèn)識的
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com