常用的 Java 關鍵字解讀!
一、關鍵字匯總
圖片
二、訪問控制
?表示可以訪問,x表示不能訪問
圖片
2.1、private(私有化)
private 關鍵字是訪問控制修飾符,可以應用于內部類、方法或類的變量字段。只能在聲明 private(內部)類、方法或字段的類中引用這些類、方法或字段。在類的外部或者對于子類而言,它們是不可見的。
2.2、default(缺省)
default:關鍵字是可以應用于類、方法或類的變量字段的訪問控制修飾符。當沒有指定類的訪問權限的時候,虛擬機就會默認的形式給類劃定界限!默認修飾的類無法被其他包的類繼承!
2.3、protected(受保護的)
protected:關鍵字是可以應用于內部類、方法或類的變量字段的訪問控制修飾符。可以在聲明 protected 類、方法或字段的類、同一個包中的其他任何類以及任何子類(無論子類是在哪個包中聲明的)中引用這些類、方法或字段。
2.4、public(公共的)
public:關鍵字是可以應用于類、方法或類的變量字段的訪問控制修飾符。可以在其他任何類或包中引用 public 類、方法或字段。
三、類、接口、方法修飾符
圖片
3.1、class類
class 關鍵字用來聲明新的 Java 類,該類是相關變量和/或方法的集合。類是面向對象的程序設計方法的基本構造單位。要使用類,通常使用 new 操作符將類的對象實例化,然后調用類的方法來訪問類的功能。
3.2、abstract 聲明抽象
abstract關鍵字可以修改類或方法。abstract類可以擴展(增加子類),但不能直接實例化。abstract方法不在聲明它的類中實現,但必須在某個子類中重寫。采用 abstract方法的類本來就是抽象類,并且必須聲明為abstract。
3.3、extends 繼承
extends 關鍵字用在 class 或 interface 聲明中,用于指示所聲明的類或接口是其名稱后跟有 extends 關鍵字的類或接口的子類。子類繼承父類的所有 public 和 protected 變量和方法(但是不包括構造函數)。子類可以重寫父類的任何非 final 方法。一個類只能擴展一個其他類,但一個接口可以繼承多個接口。
3.4、implements實現
implements 關鍵字在 class 聲明中使用,以指示所聲明的類提供了在 implements 關鍵字后面的名稱所指定的接口中所聲明的所有方法的實現。類必須提供在接口中所聲明的所有方法的實現。一個類可以實現多個接口。
3.5、interface 接口
interface 關鍵字用來聲明新的 Java 接口,接口是方法的集合。
3.6、final 最終、不可改變
在Java中,final關鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量)。final方法在編譯階段綁定,稱為靜態綁定(static binding)。下面就從這四個方面來了解一下final關鍵字的基本用法。
3.6.1、修飾類
當用final修飾一個類時,表明這個類不能被繼承,不能有子類。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變量可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
3.6.2、修飾方法
下面這段話摘自《Java編程思想》:
使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過于龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。
因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設置為final的。
還有就是,類的private方法會隱式地被指定為final方法。
3.6.3、修飾變量
修飾變量是final用得最多的地方。
對于一個final變量,如果是基本數據類型的變量,則其數值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。引用變量被final修飾之后,雖然不能再指向其他對象,但是它指向的對象的內容是可變的。
3.6.4、final參數
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值或者引用指向。道理同final變量。
3.7、strictfp 嚴格,精準
strictfp的意思是FP-strict,也就是說精確浮點的意思。在Java虛擬機進行浮點運算時,如果沒有指定strictfp關鍵字時,Java的編譯器以及運行環境在對浮點運算的表達式是采取一種近似于我行我素的行為來完成這些操作,以致于得到的結果往往無法令人滿意。而一旦使用了strictfp來聲明一個類、接口或者方法時,那么所聲明的范圍內Java的編譯器以及運行環境會完全依照浮點規范IEEE-754來執行。因此如果想讓浮點運算更加精確,而且不會因為不同的硬件平臺所執行的結果不一致的話,那就請用關鍵字strictfp。
可以將一個類、接口以及方法聲明為strictfp,但是不允許對接口中的方法以及構造函數聲明strictfp關鍵字。
3.8、static 靜態
static可以用于修飾屬性,可以修飾代碼塊,也可以用于修飾方法,還可以用于修飾類。
3.8.1、static修飾屬性
無論一個類生成了多少個對象,所有這些對象共同使用唯一一份靜態的成員變量;一個對象對該靜態成員變量進行了修改,其他對象的該靜態成員變量的值也會隨之發生變化。如果一個成員變量是static的,那么我們可以通過‘類名.成員變量名’的方式來使用它。
3.8.2、static修飾方法
static修飾的方法叫做靜態方法。對于靜態方法來說,可以使用‘類名.方法名’的方式來訪問。靜態方法只能繼承,不能重寫(Override),因為重寫是用于表現多態的,重寫只能適用于實例方法,而靜態方法是可以不生成實例直接用類名來調用,這就會與重寫的定義所沖突,與多態所沖突,所以靜態方法不能重寫,只能是隱藏。
static方法與非static方法:不能在靜態方法中訪問非靜態成員變量;可以在靜態方法中訪問靜態的成員變量。可以在非靜態方法中訪問靜態的成員變量:因為靜態方法可以直接用類名來調用,而非靜態成員變量是在創建對象實例時才為變量分配內存和初始化變量值。
不能在靜態方法中使用this關鍵字:因為靜態方法可以直接用類名來調用,而this實際上是創建實例時,實例對應的一個應用,所以不能在靜態方法上使用this。
3.8.3、static修飾代碼塊
靜態代碼塊。靜態代碼塊的作用也是完成一些初始化工作。首先執行靜態代碼塊,然后執行構造方法。靜態代碼塊在類被加載的時候執行,而構造方法是在生成對象的時候執行;要想調用某個類來生成對象,首先需要將類加載到Java虛擬機上(JVM),然后由JVM加載這個類來生成對象。
類的靜態代碼塊只會執行一次,是在類被加載的時候執行的,因為每個類只會被加載一次,所以靜態代碼塊也只會被執行一次;而構造方法則不然,每次生成一個對象的時候都會調用類的構造方法,所以new一次就會調用構造方法一次。如果繼承體系中既有構造方法,又有靜態代碼塊,那么首先執行最頂層的類的靜態代碼塊,一直執行到最底層類的靜態代碼塊,然后再去執行最頂層類的構造方法,一直執行到最底層類的構造方法。注意:靜態代碼塊只會執行一次。
3.8.4、static修飾類
這個有點特殊,首先,static是可以用來修飾類的,但是static是不允許用來修飾普通類,只能用來修飾內部類,被static所修飾的內部類可以用new關鍵字來直接創建一個實例,不需要先創建外部類實例。static內部類可以被其他類實例化和引用(即使它是頂級類)。
其實理解起來也簡單。因為static主要是修飾類里面的成員,包括內部類、屬性、方法這些。修飾這些變量的目的也很單純,那就是暗示這個成員在該類之中是唯一的一份拷貝,即便是不斷的實例化該類,所有的這個類的對象都會共享這些static成員。這樣就好辦了。因為是共享的、唯一的,所以,也就不需要在實例化這個類以后再通過這個類來調用這個成員了,顯然有點麻煩,所以就簡單一點,直接通過類名直接調用static成員,更加直接。然而這樣設置之后,就出現了一個限制,就是,static方法之中不能訪問非static屬性,因為這個時候非static屬性可能還沒有給他分配內存,該類還沒有實例化。
所以,通常,static 關鍵字意味著應用它的實體在聲明該實體的類的任何特定實例外部可用。
可以從類的外部調用 static 方法,而不用首先實例化該類。這樣的引用始終包括類名作為方法調用的限定符。
3.9、synchronized線程、同步
synchronized 關鍵字可以應用于方法或語句塊,并為一次只應由一個線程執行的關鍵代碼段提供保護。
synchronized 關鍵字可防止代碼的關鍵代碼段一次被多個線程執行。
3.10、transient 短暫
transient 關鍵字可以應用于類的成員變量,以便指出該成員變量不應在包含它的類實例已序列化時被序列化。
當一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。
3.11、volatile 易失
volatile 關鍵字用于表示可以被多個線程異步修改的成員變量。
注意:volatile 關鍵字在許多 Java 虛擬機中都沒有實現。volatile 的目標用途是為了確保所有線程所看到的指定變量的值都是相同的。
3.12、native 本地
native 關鍵字可以應用于方法,以指示該方法是用Java以外的語言實現的,方法對應的實現不是在當前文件,而是在用其他語言(如C和C++)實現的文件中。。
Java不是完美的,Java的不足除了體現在運行速度上要比傳統的C++慢許多之外,Java無法直接訪問到操作系統底層(如系統硬件等),為此Java使用native方法來擴展Java程序的功能。
3.13、enum 枚舉
枚舉類型(Enumerated Type) 很早就出現在編程語言中,它被用來將一組類似的值包含到一種類型當中。而這種枚舉類型的名稱則會被定義成獨一無二的類型描述符,在這一點上和常量的定義相似。不過相比較常量類型,枚舉類型可以為申明的變量提供更大的取值范圍。
四、程序控制
4.1、流程判斷
if(布爾值) {
...
} else {
...
}
4.2、for循環
for (int i = 0; i < 10; i++) {
...
}
4.3、fore循環
for (數據類型 變量值 : 數組) {
...
}
4.4、while循環
while (布爾值) {
...
}
4.5、do...while循環
do {
...
} while (布爾值);
4.6、switch選擇
switch(變量){
case 值1 :
//語句
break; //可選
case 值2 :
//語句
break; //可選
//你可以有任意數量的case語句
default : //可選
//語句
}
4.7、instanceof對象類型判斷
result = 需要判斷的對象 instanceof 已知對象
result為布爾值
4.8、continue關鍵字
continue:表示跳過當前程序,繼續下一個,一般用于循環語句
for (int i = 0; i < 10; i++) {
if(i == 6){
//如果i等于6 ,就跳過,進行下一次循環
continue;
}
}
4.9、break關鍵字
break:表示跳過當前程序,結束,一般用于循環語句
for (int i = 0; i < 10; i++) {
if(i == 6){
//如果i等于6 ,就跳過,結束循環語句
continue;
}
}
4.10、return關鍵字
return:結束當前流程,返回結果!
return null;
4.11、assert關鍵字
assert:斷言是為了方便調試程序,并不是發布程序的組成部分。理解這一點是很關鍵的,后面會單獨介紹!
斷言是通過關鍵字assert來定義的,一般的,它有兩種形式。
// 例如:assert <bool expression>;
boolean isStudent = false; assert isStudent;
// 例如:assert <bool expression> : <message>;
boolean isSafe = false; assert isSafe : "Not Safe at all";
五、錯誤處理
5.1、異常捕捉
try {
...
} catch (Exception e) {
//異常
} finally {
//異常最終執行語句
}
5.2、異常拋出
throw new Exception();
對應的方法需要聲明跑出異常
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("異常結束");
}
}
六、基本數據類型
圖片
七、變量引用
圖片
八、包相關
8.1、import 引入
import 關鍵字使一個包中的一個或所有類在當前 Java 源文件中可見。可以不使用完全限定的類名來引用導入的類。
當多個包包含同名的類時,許多 Java 程序員只使用特定的 import 語句(沒有“*”)來避免不確定性。
8.2、package 包
package 關鍵字指定在 Java 源文件中聲明的類所駐留的 Java 包。
package 語句(如果出現)必須是 Java 源文件中的第一個非注釋性文本。例:java.lang.Object。如果 Java 源文件不包含 package 語句,在該文件中定義的類將位于“默認包”中。請注意,不能從非默認包中的類引用默認包中的類。
九、保留字
正確識別java語言的關鍵字(keyword)和保留字(reserved word)是十分重要的。Java的關鍵字對java的編譯器有特殊的意義,他們用來表示一種數據類型,或者表示程序的結構等。保留字是為java預留的關鍵字,他們雖然現在沒有作為關鍵字,但在以后的升級版本中有可能作為關鍵字。識別java語言的關鍵字,不要和其他語言如c/c++的關鍵字混淆。const和goto是java的保留字。所有的關鍵字都是小寫。
9.1、goto 跳轉
goto 保留關鍵字,但無任何作用。結構化程序設計完全不需要 goto 語句即可完成各種流程,而 goto 語句的使用往往會使程序的可讀性降低,所以 Java 不允許 goto 跳轉。
9.2、const 靜態
const 保留字,是一個類型修飾符,使用const聲明的對象不能更新。與final某些類似。
十、總結
以上內容,只是簡單的介紹一下java所有的關鍵字。
其實每個關鍵字都有很深的含義和應用場景,而且每個java的版本,一些關鍵字的應用可能還會有些變動,比如 jdk1.8 接口里面的方法可以用 default 修飾,實現接口的類,不必顯式的進行重寫改方法,