Java關(guān)鍵字解析——Java基礎(chǔ)回爐(四)

前言

本文是深入Java基礎(chǔ)系列的第四篇琼了,關(guān)于文集介紹可通過(guò)<<Java基礎(chǔ)回爐暨系列開(kāi)篇>>進(jìn)行了解。

這篇文章將整理Java中常見(jiàn)的關(guān)鍵字莹捡,通過(guò)將形似和易混淆的Java關(guān)鍵字進(jìn)行比較和區(qū)分端考,旨在讓大家底掌握常見(jiàn)Java關(guān)鍵字的用法和使用時(shí)的注意事項(xiàng)。


1. final均蜜、finally、finalize

final芒率、finally囤耳、finalize有什么不同? 這個(gè)問(wèn)題在面試的時(shí)候經(jīng)常被問(wèn)到偶芍,因?yàn)樗鼈內(nèi)齻€(gè)長(zhǎng)得有點(diǎn)像充择,但是用途卻完全不同。那你知道它們的區(qū)別嗎匪蟀?

1.1 final

(1)final可以用來(lái)修飾變量椎麦、方法、類材彪,分別有不同的意義:

  • final關(guān)鍵字修飾一個(gè)基本類型的變量時(shí)观挎,在定義的時(shí)候就需要進(jìn)行初始化,該變量不能重新賦值段化,第一次的值即為最終的嘁捷。
  • fianl關(guān)鍵字修飾一個(gè)引用類型變量時(shí),該變量不能重新指向新的對(duì)象显熏。(final只能約束這個(gè)引用不可以被賦值雄嚣,但是該引用指向的對(duì)象的行為不被final影響,這與immutable不同)
// final只能約束strList這個(gè)引用不可以被賦值喘蟆,
//但是strList對(duì)象的行為并不受final的影響
 final List<String> strList = new ArrayList<>();
 strList.add("Hello");
 strList.add("world");  
 
 //List.of方法創(chuàng)建的本身就是不可變List缓升,最后一句add是會(huì)在運(yùn)行時(shí)拋出異常的
 List<String> unmodifiableStrList = List.of("hello", "world");
 unmodifiableStrList.add("again");
  • final關(guān)鍵字修飾一個(gè)方法的時(shí)候,該方法不能被重寫(xiě)蕴轨。(主要用于將方法鎖定仔沿,防止子類修改。)
  • final關(guān)鍵字修飾一個(gè)類的時(shí)候尺棋,該類不能被繼承封锉。(當(dāng)需要一個(gè)完全封裝、無(wú)法改變的類時(shí)膘螟,可以使用final修飾增強(qiáng)安全性成福。)

(2)為什么局部?jī)?nèi)部類(包括匿名內(nèi)部類)訪問(wèn)了局部函數(shù)的形參,該變量需要使用final修飾荆残?
這個(gè)問(wèn)題在 深入類和對(duì)象——深入Java基礎(chǔ)系列(二)中已經(jīng)講過(guò)奴艾,這里就不再重復(fù)。

1.2 finally

(1)finally是異常體系中的關(guān)鍵字内斯,保證重點(diǎn)代碼一定要被執(zhí)行的一種機(jī)制蕴潦。

我們可以使用try-finally或者try-catch-finally像啼,在finally代碼塊中進(jìn)行類似關(guān)閉JDBC連接、保證unlock鎖等動(dòng)作潭苞。在使用的時(shí)候應(yīng)該注意:

  • finally塊的使用前提是必須要存在try塊才能使用忽冻。(成對(duì)出現(xiàn))
  • finally塊的代碼在任何情況下都會(huì)執(zhí)行的,除了jvm退出的情況此疹。
// 這里程序在try塊中已經(jīng)退出來(lái)了僧诚,所以finally里面的代碼并不會(huì)執(zhí)行
try {
  // do something
  System.exit(1);
} finally{
  System.out.println(“Print from finally”);
}
  • finally非常適合做資源釋放的工作,這樣子可以保證資源文件在任何情況下都會(huì)被釋放蝗碎。

(2)當(dāng)try和catch中有return時(shí)湖笨,finally中的代碼能執(zhí)行嗎?
答案是能的蹦骑,這里驗(yàn)證一下:

public class FinallyTest {
    public static void main(String[] args) {
        int n=test();
        System.out.println(n);
    }
    public static int test() {
        int m;
        try {
            m = 3;
            return m+1;
        } finally {
            m=8;
            System.out.println("Print from finally");
        }
    }
}
// output:
    Print from finally
    4

這里要清楚一點(diǎn)慈省,finally代碼塊是在return關(guān)鍵字后面的代碼執(zhí)行完后再執(zhí)行的,此時(shí)還沒(méi)有出函數(shù)體眠菇,程序先將要返回的值保存起來(lái)边败,即使在finally代碼塊中修改m的值都不影響最終的返回值。

但是琼锋,我們最好不要在finally塊中包含return,否則程序的返回值就不是trycatch中的原始保存的返回值了祟昭。

public class  FinallyTest {
    public static void main(String[] args) {
        int n=test();
        System.out.println(n);
    }
    public static int test() {
        int m;
        try {
            m = 3;
            return m+1;
        } finally {
            m=8;
            System.out.println("Print from finally");
            return m;
        }
    }
}
// output:
    Print from finally
    8

關(guān)于finally關(guān)鍵字缕坎,我們只要明確知道怎么使用就足夠了。

1.3 finalize

在介紹finalize之前篡悟,得說(shuō)明它是不推薦使用的谜叹,在Java 9中已經(jīng)將它標(biāo)記為deprecated,也就是不推薦使用的搬葬。

其實(shí)荷腊,finalize是java基礎(chǔ)類java.lang.Object中的一個(gè)方法:

protected void finalize() throws Throwable { }

它的設(shè)計(jì)目的是保證對(duì)象在被垃圾收集前完成特定資源的回收,但是finalize()能做的所有工作急凰,使用try-finally或者其他的方式都可以做得更好女仰、更及時(shí)。

2. static

(1)static 表示靜態(tài)抡锈,它可以修飾屬性疾忍,方法和代碼塊。

  • static修飾的變量即為靜態(tài)變量床三,當(dāng)JVM加載類后一罩,可以通過(guò)類名直接訪問(wèn),類的所有實(shí)例共享一個(gè)static變量撇簿。(不光創(chuàng)建多少個(gè)對(duì)象聂渊,靜態(tài)屬性在內(nèi)存中只有一個(gè))<<深入類和對(duì)象>>中提到:在類的生命周期的連接階段的準(zhǔn)備過(guò)程中差购,JVM會(huì)為類的靜態(tài)變量分配內(nèi)存并設(shè)為jvm默認(rèn)的初值,所以靜態(tài)變量是對(duì)象創(chuàng)建之前就存在的汉嗽。static不能修飾局部變量欲逃。
  • static修飾的方法即為靜態(tài)方法, 靜態(tài)方法可以直接通過(guò)類名調(diào)用诊胞,但是不能直接訪問(wèn)所屬類的實(shí)例變量和方法暖夭,只能訪問(wèn)所屬類的靜態(tài)變量和方法,這是因?yàn)閷?shí)例成員只與特定對(duì)象關(guān)聯(lián)撵孤。靜態(tài)方法不能被重寫(xiě)迈着。
  • static還可以修飾代碼塊,它是類中獨(dú)立于類成員的static語(yǔ)句塊邪码,不在任何方法體內(nèi)裕菠,當(dāng)JVM加載類時(shí),就會(huì)執(zhí)行靜態(tài)代碼塊闭专,無(wú)需等待實(shí)例化奴潘,static語(yǔ)句塊可以多個(gè),JVM會(huì)按照它們的先后順序依次執(zhí)行影钉。靜態(tài)代碼塊是在類的生命周期的初始化階段執(zhí)行的画髓,詳細(xì)過(guò)程請(qǐng)看<<深入類和對(duì)象>>

(2)static和final一起使用有什么作用平委?

  • static和final修飾的變量可看做“全局變量”奈虾,在類加載在類的生命周期的連接階段的準(zhǔn)備過(guò)程中,JVM會(huì)為類的靜態(tài)常量分配內(nèi)存并設(shè)為程序員賦予的初始值廉赔。
  • static和final修飾的方法肉微,不能被繼承,可以通過(guò)類名直接調(diào)用蜡塌。

3. this和super

3.1 this

(1)this關(guān)鍵字指向:

this關(guān)鍵字代表了this所屬函數(shù)的調(diào)用者對(duì)象碉纳,這句話的意思是,this在某個(gè)方法的內(nèi)部馏艾,若這個(gè)方法被一個(gè)對(duì)象調(diào)用劳曹,那么this就指向這個(gè)對(duì)象。

(2)this關(guān)鍵字的作用:

  • 如果存在同名成員變量局部變量時(shí)琅摩,在方法內(nèi)部默認(rèn)是訪問(wèn)局部變量的數(shù)據(jù)(就近原則)厚者,可以通過(guò)this關(guān)鍵字指定訪問(wèn)成員變量的數(shù)據(jù)。
    • 如果在方法中訪問(wèn)了成員變量迫吐,java編譯器會(huì)在該變量的前面加上this關(guān)鍵字库菲。
  • 在一個(gè)構(gòu)造函數(shù)中可以調(diào)用另外一個(gè)構(gòu)造函數(shù)初始化對(duì)象。需注意:
    • this關(guān)鍵字調(diào)用其他的構(gòu)造函數(shù)時(shí)志膀,this關(guān)鍵字必須要位于構(gòu)造函數(shù)中的第一個(gè)語(yǔ)句熙宇。
    • 如果在一個(gè)方法中訪問(wèn)了一個(gè)變量鳖擒,該變量只存在成員變量的情況下,那么java編譯器會(huì)在該變量的前面添加this關(guān)鍵字烫止。

3.2 super

(1)super 關(guān)鍵字的指向:
super關(guān)鍵字代表的是父類的引用空間

(2)super關(guān)鍵字的作用:

  • 如果子父類存在同名的成員時(shí)蒋荚,在子類中默認(rèn)是訪問(wèn)子類的成員,可以通過(guò)super關(guān)鍵字指定訪問(wèn)父類的成員馆蠕。
  • 創(chuàng)建子類對(duì)象時(shí)期升,默認(rèn)會(huì)先調(diào)用父類的無(wú)參構(gòu)造函數(shù),可以通過(guò)super關(guān)鍵字指定調(diào)用父類的構(gòu)造函數(shù)互躬。需注意:
    • 如果在子類 的構(gòu)造函數(shù)中沒(méi)有指定調(diào)用具體父類構(gòu)造函數(shù)播赁,那么java編譯器會(huì)在子類的構(gòu)造函數(shù)上添加super()語(yǔ)句。
    • super關(guān)鍵字調(diào)用構(gòu)造函數(shù)時(shí)必須出現(xiàn)構(gòu)造函數(shù)中第一個(gè)語(yǔ)句吼渡。

4. 總結(jié)

本文就 final容为、finally、finalize寺酪、staticthis坎背、super三組關(guān)鍵字進(jìn)行分析,讓大家清楚每組關(guān)鍵字中的差別和用法寄雀,以及使用的時(shí)候的注意事項(xiàng)得滤。當(dāng)然Java中還有許多的關(guān)鍵字,例如synchronized盒犹、volatile等關(guān)鍵字懂更,這將在后面的多線程、高并發(fā)中講到阿趁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末膜蛔,一起剝皮案震驚了整個(gè)濱河市坛猪,隨后出現(xiàn)的幾起案子脖阵,更是在濱河造成了極大的恐慌,老刑警劉巖墅茉,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件命黔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡就斤,警方通過(guò)查閱死者的電腦和手機(jī)悍募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)洋机,“玉大人坠宴,你說(shuō)我怎么就攤上這事”疗欤” “怎么了喜鼓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵副砍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我庄岖,道長(zhǎng)豁翎,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任隅忿,我火速辦了婚禮心剥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘背桐。我一直安慰自己优烧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布牢撼。 她就那樣靜靜地躺著匙隔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪熏版。 梳的紋絲不亂的頭發(fā)上纷责,一...
    開(kāi)封第一講書(shū)人閱讀 49,856評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音撼短,去河邊找鬼再膳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛曲横,可吹牛的內(nèi)容都是我干的喂柒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禾嫉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼灾杰!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起熙参,我...
    開(kāi)封第一講書(shū)人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艳吠,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后孽椰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昭娩,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年黍匾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栏渺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锐涯,死狀恐怖磕诊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤霎终,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布融痛,位于F島的核電站,受9級(jí)特大地震影響神僵,放射性物質(zhì)發(fā)生泄漏雁刷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一保礼、第九天 我趴在偏房一處隱蔽的房頂上張望沛励。 院中可真熱鬧,春花似錦炮障、人聲如沸目派。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)企蹭。三九已至,卻和暖如春智末,著一層夾襖步出監(jiān)牢的瞬間谅摄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工系馆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留送漠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓由蘑,卻偏偏與公主長(zhǎng)得像闽寡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尼酿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 既已爷狈,齊人徐巿等上書(shū),言海中有三神山裳擎,名曰蓬萊涎永、方丈、瀛洲句惯,仙人居之土辩。請(qǐng)得齋戒支救,與童男女求之抢野。於是遣徐巿發(fā)童男女?dāng)?shù)...
    小蘇書(shū)九州閱讀 357評(píng)論 2 2
  • 大家好,我是水日京子各墨,要是問(wèn)我為什么是這個(gè)名字的話指孤,這個(gè)由來(lái)于我侄子的名字哈哈,好了今天呢,我想和大家分享一篇周末...
    水日京子閱讀 355評(píng)論 1 3
  • 我在去年5月中旬跳槽到一家本地知名投行公司恃轩,在這之前我在政府部門(mén)工作结洼,從事留學(xué)生的創(chuàng)業(yè)輔導(dǎo)及申報(bào)工作。我想聊聊我進(jìn)...
    JulienYu閱讀 859評(píng)論 3 2
  • 1993年10月叉跛,在湖北省荊門(mén)市郭店村松忍,中國(guó)考古學(xué)界有一個(gè)重大的發(fā)現(xiàn),在郭店一號(hào)楚墓發(fā)掘出竹簡(jiǎn)804枚筷厘,其中有字的...
    北池魚(yú)閱讀 3,099評(píng)論 18 21
  • 在做閱讀理解的時(shí)候 會(huì)被干擾選項(xiàng)帶偏 忘記了原本的方向 于是就錯(cuò)了 人在前行的路上 也會(huì)被身邊的人鸣峭、事、環(huán)境而干擾...
    朵貓Nicole閱讀 474評(píng)論 0 0