溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

深入淺析Java中的this、final關(guān)鍵字

發(fā)布時間:2020-11-17 15:12:55 來源:億速云 閱讀:149 作者:Leah 欄目:編程語言

這篇文章給大家介紹深入淺析Java中的this、final關(guān)鍵字,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

this

關(guān)鍵字this引用對象自身。它也可以在構(gòu)造方法內(nèi)部用于調(diào)用同一個類的其他構(gòu)造方法。

隱藏的靜態(tài)變量可以通過”類.靜態(tài)變量”來引用,而隱藏的實例變量就需要使用”this.實例變量”來引用。

調(diào)用一個重載的構(gòu)造方法this引用是必須的。

this是個隱式參數(shù),代表當(dāng)前對象

publie class Student{
 private String name; 
 public void setName(String name){ 
 this.name=name; //this.name為當(dāng)前對象的成員變量 
} }

如果某個構(gòu)造方法的第一個語句具有形式this( ••• ),那么這個構(gòu)造方法將調(diào)用同一類中的其他構(gòu)造方法。

注意:

在構(gòu)造器中this(…)必須放在該構(gòu)造器的第一行。

this不能出現(xiàn)在靜態(tài)方法里面

super

super關(guān)鍵字代指父類,可以用于調(diào)用父類的普通方法和構(gòu)造方法。

super()表示調(diào)用父類的構(gòu)造器

super.方法來引用父類的方法

super()也和this()一樣必須放在方法的第一句

super()和this()不能同時出現(xiàn)

super可以屏蔽子類屬性和父類屬性重名時帶來的屬性遮蓋,super. 表示調(diào)用父類的方法或?qū)傩?

在子類的構(gòu)造器中如果沒有指定調(diào)用父類的哪一個構(gòu)造器,那么就會調(diào)用父類的無參構(gòu)造器,即super()

注意:

父類的構(gòu)造器不能被子類繼承

方法和屬性可以被繼承,權(quán)限不限制能否繼承過來,限制的是能否直接訪問

先構(gòu)造父類,后構(gòu)造子類

instanceof

用法:引用 instanceof 類名

判斷這個引用所指向的對象是否屬于這個類。

用在強制轉(zhuǎn)換之前,避免類型轉(zhuǎn)換異常。

 if(a instanceof Dog){ 
 Dog d=(Dog)a; 
 } 
implements

一個類實現(xiàn)一個接口必須實現(xiàn)接口中所有的方法,否則其為抽象類,并且在實現(xiàn)類中的方法要加上public(不能省略)。

類中的默認修飾符:default。

接口中的默認修飾符:public。

一個類除了繼承另一個類外(只能繼承一個類),還可以實現(xiàn)多個接口(接口之間用逗號分隔)。

static

把對象相關(guān)的變成類相關(guān)的,它可以修飾屬性、方法、代碼塊和內(nèi)部類.

static修飾屬性(類變量):

那么這個屬性就可以用” 類名.屬性名 “來訪問,也就是使這個屬性成為本類的類變量,為本類對象所共享。

類加載的過程

類本身也是保存在文件中(字節(jié)碼文件保存著類的信息)的,Java會通過I/O流把類的文件讀入JVM(java虛擬機),這個過程稱為類的 加載。

JVM會通過類路徑(CLASSPATH)來找字節(jié)碼文件。需要的時候才會進行類加載,生成對象時是先加載后構(gòu)造

類變量,會在加載時自動初始化,初始化規(guī)則和實例變量相同。

注意:

類中的實例變量是在創(chuàng)建對象時被初始化的。

static修飾的屬性,是在類加載時被創(chuàng)建并進行初始化,類加載的過程只進行一次,也就是類變量只會被創(chuàng)建一次。

static修飾方法(靜態(tài)方法):

會使這個方法成為整個類所公有的方法,可以用” 類名.方法名 “訪問。

static修飾的方法,不能直接訪問本類中的非靜態(tài)成員,但本類的非靜態(tài)方法可以訪問本類的靜態(tài)成員。

在靜態(tài)方法中不能出現(xiàn)this關(guān)鍵字。

父類中是靜態(tài)方法,子類中不能覆蓋為非靜態(tài)方法,在符合覆蓋規(guī)則的前提下,在父子類中,父類中的靜態(tài)方法可以被子類中的靜態(tài)方法覆蓋,但是沒有多態(tài)。(在使用對象調(diào)用靜態(tài)方法時其實是調(diào)用編譯時類型的靜態(tài)方法)

java中的main方法必須寫成static的原因:

在類加載時無法創(chuàng)建對象,而靜態(tài)方法可以不通過對象調(diào)用,所以在類加載時就可以通過main方法入口來運行程序。

static修飾初始代碼塊:

這時這個初始代碼塊就叫做靜態(tài)初始代碼塊,這個代碼塊只在類加載時被執(zhí)行一次。

可以用靜態(tài)初始代碼塊初始化一個類。

動態(tài)初始代碼塊,寫在類體中的“{}”,這個代碼塊是在生成對象時運行,這種代碼塊叫動態(tài)初始代碼

final

修飾符final:不允許改變,可以修飾變量、方法、類。

final修飾變量:

被fianl修飾的變量就會變成常量,一旦賦值不能改變

常量可以在初始化時直接賦值,也可以在構(gòu)造方法里賦值,只能在這兩種方法里二選一,不能不為常量賦值

常量不會有默認初始值

鎖定棧,使棧中的數(shù)據(jù)不可以改變

靜態(tài)常量只能在初始化時直接賦值

final修飾方法:

被final修飾的方法將不能被其子類覆蓋,保持方法的穩(wěn)定不能被覆蓋

final修飾類:

被final修飾的類將不能被繼承

final類中的方法也都是final的

注意:

final不能用來修飾構(gòu)造方法

abstract:

修飾符abstract:抽象的,定義框架不去實現(xiàn),可以修飾類和方法

abstract修飾類:

會使這個類成為一個抽象類,這個類將不能生成對象實例,但可以做為對象變量聲明的類型,也就是編譯時類型

抽象類就相當(dāng)于一個類的半成品,需要子類繼承并覆蓋其中的抽象方法,這時子類才又創(chuàng)建實例的能力,如果子類沒有實現(xiàn)父類的抽象方法,那么子類也要為抽象類。

abstract修飾方法:

會使這個方法變成抽象方法,也就是只有聲明而沒有實現(xiàn),實現(xiàn)部分以”;”代替,需要子類繼承實現(xiàn)。

抽象方法代表了某種標(biāo)準(zhǔn),定義標(biāo)準(zhǔn),定義功能,在子類中去實現(xiàn)功能

(子類繼承了父類并需要給出從父類繼承的抽象方法的實現(xiàn))。

方法一時間想不到怎么被實現(xiàn),或有意要子類去實現(xiàn)而定義某種標(biāo)準(zhǔn),這個方法可以被定義為抽象。

注意:

有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。

關(guān)鍵字描述
int32位整型數(shù)
boolean布爾數(shù)據(jù)類型
float32-bit單精度浮點數(shù)
long64位整型數(shù)
short16位數(shù)字
byte8-bit 有符號數(shù)據(jù)類型
double64-bit雙精度浮點數(shù)
char16-bit Unicode字符數(shù)據(jù)類型
abstract抽象方法,抽象類的修飾符
extends表示一個類是另一個類的子類
implements表示一個類實現(xiàn)了接口
assert斷言條件是否滿足
break跳出循環(huán)或者label代碼段
continue不執(zhí)行循環(huán)體剩余部分
caseswitch語句的一個條件
catch和try搭配撲捉異常信息
final表示一個值在初始化之后就不能再改變了,表示方法不能被重寫,或者一個類不能有子類
finallytry 語句不管是否發(fā)生異常都要執(zhí)行的語句塊
class定義類
const未使用
defaultswitch語句中的默認分支
enum枚舉類型
goto未使用
if條件語句
import導(dǎo)入類
instanceof測試一個對象是否是某個類的實例
interface接口,一種抽象的類型,僅有方法和常量的定義
native表示方法用非java代碼實現(xiàn)
new分配新的類實例
package一系列相關(guān)類組成一個包
private表示私有字段,或者方法等,只能從類內(nèi)部訪問
protected表示字段只能通過類或者其子類訪問,子類或者在同一個包內(nèi)的其他類
public表示共有屬性或者方法
return方法返回值
static表示在類級別定義,所有實例共享的
strictfp浮點數(shù)比較使用嚴格的規(guī)則
super表示基類
switch選擇語句
synchronized表示同一時間只能由一個線程訪問的代碼塊
this表示調(diào)用當(dāng)前實例,或者調(diào)用另一個構(gòu)造函數(shù)
throw拋出異常
throws定義方法可能拋出的異常
transient修飾不要序列化的字段
try表示代碼塊要做異常處理或者和finally配合表示是否拋出異常都執(zhí)行finally中的代碼
void標(biāo)記方法不返回任何值
volatile標(biāo)記字段可能會被多個線程同時訪問,而不做同步

關(guān)于深入淺析Java中的this、final關(guān)鍵字就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI