Java final迅脐、static 關(guān)鍵字

問:談?wù)?Java 中 final、finally豪嗽、finalize 的區(qū)別谴蔑?

答:

  • final 是一個修飾符,如果一個類被聲明為 final 則其不能再派生出新的子類龟梦,所以一個類不能既被聲明為 abstract 又被聲明為 final 的隐锭;將變量或方法聲明為 final 可以保證它們在使用中不被改變(對于對象變量來說其引用不可變,即不能再指向其他的對象变秦,但是對象的值可變)成榜,被聲明為 final 的變量必須在聲明時給定初值,而在以后的引用中只能讀取不可修改蹦玫,被聲明為 final 的方法也同樣只能使用不能重載赎婚。使用 final 關(guān)鍵字如果編譯器能夠在編譯階段確定某變量的值則編譯器就會把該變量當做編譯期常量來使用,如果需要在運行時確定(譬如方法調(diào)用)則編譯器就不會優(yōu)化相關(guān)代碼樱溉;將類挣输、方法、變量聲明為 final 能夠提高性能福贞,這樣 JVM 就有機會進行估計并進行優(yōu)化撩嚼;接口中的變量都是 public static final 的。

  • finally 用來在異常處理時提供塊來執(zhí)行任何清除操作,如果拋出一個異常完丽,則相匹配的 catch 子句就會執(zhí)行恋技,然后控制就會進入 finally 塊。

  • finalize 是一個方法名逻族,Java 允許使用 finalize() 方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作蜻底,這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的,它是在 Object 類中定義的聘鳞,因此所有的類都繼承了它薄辅,子類覆蓋 finalize() 方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作,finalize() 方法在垃圾收集器刪除對象之前對這個對象調(diào)用抠璃。

問:java 中 static站楚、final、static final 的區(qū)別是什么搏嗡?

答:

  • final 可以修飾屬性窿春、方法、類采盒、局部變量(方法中的變量)谁尸,修飾屬性的初始化可以在編譯期,也可以在運行期纽甘,初始化后不能被改變良蛮;修飾的屬性表明是一個常數(shù);修飾方法表示方法不能在子類中被重寫悍赢;修飾類表示類不能被繼承决瞳。

  • static 可以修飾屬性、方法左权、代碼段皮胡、內(nèi)部類(靜態(tài)內(nèi)部類或嵌套內(nèi)部類),修飾屬性的初始化在編譯期(類加載的時候)赏迟,初始化后可以被修改值屡贺;修飾的屬性、方法锌杀、代碼段跟該類的具體對象無關(guān)甩栈,不創(chuàng)建對象也能調(diào)用 static 修飾的屬性、方法等糕再;static 不可以修飾局部變量量没。

  • static final(或者 final static)是組合修飾,static 修飾的屬性強調(diào)它們只有一個突想,final 修飾的屬性表明是一個常數(shù)(創(chuàng)建后不能被修改)殴蹄,static final 修飾的屬性表示一旦給值就不可修改并且可以通過類名訪問究抓,static final 也可以修飾方法,表示該方法不能重寫袭灯,可以在不 new 對象的情況下調(diào)用刺下。

問:下面程序的有問題嗎,結(jié)果是什么稽荧?
    class Test {
        public static String foo() {
            System.out.println("foo called.");
            return "return called.";
        }
    }

    public class Demo {
        public static void main(String[] args) {
            Test obj = null;
            System.out.println(obj.foo());
        }
    }

答:沒有問題怠李,運行結(jié)果如下:

foo called.
return called.

因為 jvm 內(nèi)存里有棧區(qū)、堆區(qū)蛤克,棧區(qū)主要用來存放基礎(chǔ)類型數(shù)據(jù)和局部變量,堆區(qū)主要存放 new 出來的對象夷蚊,在堆區(qū)又有一個叫做方法區(qū)的內(nèi)存區(qū)域用來存放常量构挤、static 變量和 static 方法、還有類的信息惕鼓,static 的變量和方法不依賴對象筋现,即使對象沒有創(chuàng)建,在類加載的時候已經(jīng)存在信息了(Test 在聲明時就被加載了)箱歧,jvm 識別出是 static 方法就直接調(diào)用了在方法區(qū)內(nèi)存里的方法矾飞,沒有報空指針異常。

問:下面程序的運行結(jié)果是什么呀邢?為什么洒沦?
    public class Test {
        public static void main(String[] args) {
            String a = "hello2";
            final String b = "hello";
            String c = b + 2;
            String d = "hello";
            String e = d + 2;
            System.out.println((a == c));
            System.out.println((a == e));
        }
    }

答:運行結(jié)果如下:

true
false

因為當 final 變量是基本數(shù)據(jù)類型以及 String 類型時如果在編譯期間能知道它的確切值則編譯器會把它當做編譯期常量使用,也就是說在用到該 final 變量的地方相當于直接訪問了這個常量价淌,不需要在運行時確定申眼,所以上面代碼中由于變量 b 被 final 修飾從而被當做編譯器常量,故在使用到 b 的地方會直接將變量 b 替換為它的值蝉衣,而對于變量 d 的訪問卻需要在運行時通過鏈接來進行括尸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市病毡,隨后出現(xiàn)的幾起案子濒翻,更是在濱河造成了極大的恐慌,老刑警劉巖啦膜,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件有送,死亡現(xiàn)場離奇詭異,居然都是意外死亡僧家,警方通過查閱死者的電腦和手機娶眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啸臀,“玉大人届宠,你說我怎么就攤上這事烁落。” “怎么了豌注?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵伤塌,是天一觀的道長。 經(jīng)常有香客問我轧铁,道長每聪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任齿风,我火速辦了婚禮药薯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘救斑。我一直安慰自己童本,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布脸候。 她就那樣靜靜地躺著穷娱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪运沦。 梳的紋絲不亂的頭發(fā)上泵额,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音携添,去河邊找鬼嫁盲。 笑死,一個胖子當著我的面吹牛烈掠,可吹牛的內(nèi)容都是我干的亡资。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼向叉,長吁一口氣:“原來是場噩夢啊……” “哼锥腻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起母谎,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤瘦黑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奇唤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幸斥,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年咬扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了甲葬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡懈贺,死狀恐怖经窖,靈堂內(nèi)的尸體忽然破棺而出坡垫,到底是詐尸還是另有隱情,我是刑警寧澤画侣,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布冰悠,位于F島的核電站,受9級特大地震影響配乱,放射性物質(zhì)發(fā)生泄漏溉卓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一搬泥、第九天 我趴在偏房一處隱蔽的房頂上張望桑寨。 院中可真熱鬧,春花似錦忿檩、人聲如沸尉尾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扰她,卻和暖如春兽掰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徒役。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工孽尽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人忧勿。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓杉女,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸳吸。 傳聞我的和親對象是個殘疾皇子熏挎,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法晌砾,內(nèi)部類的語法坎拐,繼承相關(guān)的語法,異常的語法养匈,線程的語...
    子非魚_t_閱讀 31,598評論 18 399
  • 1哼勇、.java源文件: 一個以”.java“為后綴的源文件:只能有一個與文件名相同的類,可以包含其他類呕乎。 2积担、類方...
    Hughman閱讀 1,452評論 1 9
  • Java關(guān)鍵字final 在設(shè)計程序時,出于效率或者設(shè)計的原因猬仁,有時候希望某些數(shù)據(jù)是不可改變的帝璧。這時候可以使用fi...
    獅_子歌歌閱讀 738評論 1 4
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法先誉,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,217評論 0 2
  • 為什么文在寅當選是目前最好的選擇呢! 首先聋溜,文在寅是前前前總統(tǒng)盧武鉉的“幕僚長”谆膳,有“盧武鉉之影”之稱,...
    種花家一號閱讀 351評論 0 1