Java 關(guān)鍵字總結(jié)及其作用

final 關(guān)鍵字

final關(guān)鍵字主要用在三個(gè)地方:變量、方法、類。

  1. 對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。
  2. 當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承。final類中的所有成員方法都會(huì)被隱式地指定為final方法。
  3. 使用final方法的原因有兩個(gè)。第一個(gè)原因是把方法鎖定,以防任何繼承類修改它的含義;第二個(gè)原因是效率。在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過(guò)于龐大,可能看不到內(nèi)嵌調(diào)用帶來(lái)的任何性能提升(現(xiàn)在的Java版本已經(jīng)不需要使用final方法進(jìn)行這些優(yōu)化了)。類中所有的private方法都隱式地指定為final。

finally 關(guān)鍵字

finally關(guān)鍵字用來(lái)定義始終在try-catch-finally語(yǔ)句中執(zhí)行的塊。
finally塊通常包含清理代碼,用在部分執(zhí)行try塊后恢復(fù)正常運(yùn)行。

try {
// 可能引發(fā)異常的塊
}
catch (<java.lang.Exception或子類> e) {
// 處理異常e的代碼
}
finally {
// 有異?;驘o(wú)異常情況下都執(zhí)行的語(yǔ)句
}

開(kāi)始和結(jié)束標(biāo)記 { 和 } 是finally子句語(yǔ)法的一部分,即使該子句只包含一個(gè)語(yǔ)句,也不能省略這兩個(gè)標(biāo)記。
每個(gè)try塊都必須至少有一個(gè)catch或finally子句。
如果執(zhí)行try塊的任何部分,不論是否出現(xiàn)異常,也不論try或catch塊是否包含return、continue或break語(yǔ)句,都一定會(huì)執(zhí)行finally塊中的代碼。
如果不出現(xiàn)異常,控件將跳過(guò)try塊,進(jìn)入finally塊。
如果在執(zhí)行try塊期間出現(xiàn)異常,并且相應(yīng)的catch塊包含break、continue或return語(yǔ)句,控件將首先穿過(guò)finally塊,之后再執(zhí)行break、continue或return。

static 關(guān)鍵字

static 關(guān)鍵字主要有以下四種使用場(chǎng)景:

  1. 修飾成員變量和成員方法: 被 static 修飾的成員屬于類,不屬于單個(gè)這個(gè)類的某個(gè)對(duì)象,被類中所有對(duì)象共享,可以并且建議通過(guò)類名調(diào)用。被static 聲明的成員變量屬于靜態(tài)成員變量,靜態(tài)變量 存放在 Java 內(nèi)存區(qū)域的方法區(qū)。調(diào)用格式:類名.靜態(tài)變量名 類名.靜態(tài)方法名()
  2. 靜態(tài)代碼塊: 靜態(tài)代碼塊定義在類中方法外, 靜態(tài)代碼塊在非靜態(tài)代碼塊之前執(zhí)行(靜態(tài)代碼塊—>非靜態(tài)代碼塊—>構(gòu)造方法)。 該類不管創(chuàng)建多少對(duì)象,靜態(tài)代碼塊只執(zhí)行一次.
  3. 靜態(tài)內(nèi)部類(static修飾類的話只能修飾內(nèi)部類): 靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類之間存在一個(gè)最大的區(qū)別: 非靜態(tài)內(nèi)部類在編譯完成之后會(huì)隱含地保存著一個(gè)引用,該引用是指向創(chuàng)建它的外圍類,但是靜態(tài)內(nèi)部類卻沒(méi)有。沒(méi)有這個(gè)引用就意味著:1. 它的創(chuàng)建是不需要依賴外圍類的創(chuàng)建。2. 它不能使用任何外圍類的非static成員變量和方法。
  4. 靜態(tài)導(dǎo)包(用來(lái)導(dǎo)入類中的靜態(tài)資源,1.5之后的新特性): 格式為:import static 這兩個(gè)關(guān)鍵字連用可以指定導(dǎo)入某個(gè)類中的指定靜態(tài)資源,并且不需要使用類名調(diào)用類中靜態(tài)成員,可以直接使用類中靜態(tài)成員變量和成員方法。

this 關(guān)鍵字

作用:this 代指當(dāng)前類的實(shí)例,使用this可以調(diào)用當(dāng)前類中的屬性,方法和構(gòu)造函數(shù)。

  1. 返回當(dāng)前方法的對(duì)象的引用
  2. 訪問(wèn)當(dāng)前類的當(dāng)前實(shí)例的變量。調(diào)用當(dāng)前類的當(dāng)前實(shí)例的方法。
  3. 當(dāng)方法參數(shù)名和成員變量名相同時(shí)用于區(qū)分參數(shù)名和成員變量名
public void setAge(int age) {
    this.age = age;
}

“this.age”代表成員變量名,“age”代表參數(shù)名。

super 關(guān)鍵字

super關(guān)鍵字用于從子類訪問(wèn)父類的變量和方法。

使用 this 和 super 要注意的問(wèn)題:

  • 在構(gòu)造器中使用 super() 調(diào)用父類中的其他構(gòu)造方法時(shí),該語(yǔ)句必須處于構(gòu)造器的首行,否則編譯器會(huì)報(bào)錯(cuò)。另外,this 調(diào)用本類中的其他構(gòu)造方法時(shí),也要放在首行。
  • this、super不能用在static方法中。

備注:
被 static 修飾的成員屬于類,不屬于單個(gè)這個(gè)類的某個(gè)對(duì)象,被類中所有對(duì)象共享。而 this 代表對(duì)本類對(duì)象的引用,指向本類對(duì)象;而 super 代表對(duì)父類對(duì)象的引用,指向父類對(duì)象;所以, this和super是屬于對(duì)象范疇的東西,而靜態(tài)方法是屬于類范疇的東西

synchronized 關(guān)鍵字

應(yīng)用于方法或語(yǔ)句塊,并為一次只應(yīng)由一個(gè)線程執(zhí)行的關(guān)鍵代碼段提供保護(hù)。

synchronized關(guān)鍵字可防止代碼的關(guān)鍵代碼段一次被多個(gè)線程執(zhí)行。

  • 如果應(yīng)用于靜態(tài)方法,那么,當(dāng)該方法一次由一個(gè)線程執(zhí)行時(shí),整個(gè)類將被鎖定。
  • 如果應(yīng)用于實(shí)例方法,那么,當(dāng)該方法一次由一個(gè)線程訪問(wèn)時(shí),該實(shí)例將被鎖定。
  • 如果應(yīng)用于對(duì)象或數(shù)組,當(dāng)關(guān)聯(lián)的代碼塊一次由一個(gè)線程執(zhí)行時(shí),對(duì)象或數(shù)組將被鎖定。

throw 關(guān)鍵字

用于引發(fā)異常。

throw語(yǔ)句將java.lang.Throwable作為參數(shù)。Throwable在調(diào)用棧中向上傳播,直到被適當(dāng)?shù)腸atch塊捕獲。
引發(fā)非RuntimeException異常的任何方法還必須在方法聲明中使用throws修飾符來(lái)聲明它引發(fā)的異常。

throws 關(guān)鍵字

應(yīng)用于方法,以便指出方法引發(fā)了特定類型的異常。

throws關(guān)鍵字將逗號(hào)分隔的java.lang.Throwables列表作為參數(shù)。
引發(fā)非RuntimeException異常的任何方法還必須在方法聲明中使用throws修飾符來(lái)聲明它引發(fā)的異常。
要在try-catch塊中包含帶throws子句的方法的調(diào)用,必須提供該方法的調(diào)用者。

transient 關(guān)鍵字

應(yīng)用于類的成員變量,以便指出該成員變量不應(yīng)在包含它的類實(shí)例已序列化時(shí)被序列化。

詳情可見(jiàn): # Why does Java have transient fields?

volatile 關(guān)鍵字

用于表示可以被多個(gè)線程異步修改的成員變量。為了確保所有線程所看到的指定變量的值都是相同的。

一旦一個(gè)共享變量(類的成員變量、類的靜態(tài)成員變量)被volatile修飾之后,那么就具備了兩層語(yǔ)義:

  • 保證了不同線程對(duì)這個(gè)變量進(jìn)行操作時(shí)的可見(jiàn)性,即一個(gè)線程修改了某個(gè)變量的值,這新值對(duì)其他線程來(lái)說(shuō)是立即可見(jiàn)的。
  • 禁止進(jìn)行指令重排序。

詳情可見(jiàn) : # Java并發(fā)編程:volatile關(guān)鍵字解析

備注:

synchronized 關(guān)鍵字和 volatile 關(guān)鍵字的區(qū)別

  • volatile關(guān)鍵字是線程同步的輕量級(jí)實(shí)現(xiàn),所以volatile性能肯定比synchronized關(guān)鍵字要好。但是volatile關(guān)鍵字只能用于變量而synchronized關(guān)鍵字可以修飾方法以及代碼塊。synchronized關(guān)鍵字在JavaSE1.6之后進(jìn)行了主要包括為了減少獲得鎖和釋放鎖帶來(lái)的性能消耗而引入的偏向鎖和輕量級(jí)鎖以及其它各種優(yōu)化之后執(zhí)行效率有了顯著提升,實(shí)際開(kāi)發(fā)中使用 synchronized 關(guān)鍵字的場(chǎng)景還是更多一些。
  • 多線程訪問(wèn)volatile關(guān)鍵字不會(huì)發(fā)生阻塞,而synchronized關(guān)鍵字可能會(huì)發(fā)生阻塞
  • volatile關(guān)鍵字能保證數(shù)據(jù)的可見(jiàn)性,但不能保證數(shù)據(jù)的原子性。synchronized關(guān)鍵字兩者都能保證。
  • volatile關(guān)鍵字主要用于解決變量在多個(gè)線程之間的可見(jiàn)性,而 synchronized關(guān)鍵字解決的是多個(gè)線程之間訪問(wèn)資源的同步性。

參考: https://github.com/Snailclimb/JavaGuide

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容