<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 89,  comments - 98,  trackbacks - 0
    final:
    final可以讓你控制你的成員、方法或者是一個(gè)類是否可被覆寫(xiě)或繼承等功能,這些特點(diǎn)使final在Java中擁有了一個(gè)不可或缺的地位,也是學(xué)習(xí)Java時(shí)必須要知道和掌握的關(guān)鍵字之一。
    final成員
    當(dāng)你在類中定義變量時(shí),在其前面加上final關(guān)鍵字,那便是說(shuō),這個(gè)變量一旦被初始化便不可改變,這里不可改變的意思對(duì)基本類型來(lái)說(shuō)是其值不可變,而對(duì)于對(duì)象變量來(lái)說(shuō)其引用不可再變。其初始化可以在兩個(gè)地方,一是其定義處,二是在構(gòu)造函數(shù)中,兩者只能選其一。
    下面程序很簡(jiǎn)單的演示了final的常規(guī)用法:
    public?class?Test{
    ????final?int?t?=?1;?//?在定義時(shí)給值
    ????//?或者(兩者只能選其一)
    ????final?int?t;
    ????public?Test(){
    ????????t?=?3;?//?構(gòu)造時(shí)給值
    }
    }

    還有一種用法是定義方法中的參數(shù)為final,對(duì)于基本類型的變量,這樣做并沒(méi)有什么實(shí)際意義,因?yàn)榛绢愋偷淖兞吭谡{(diào)用方法時(shí)是傳值的,也就是說(shuō)你可以在方法中更改這個(gè)參數(shù)變量而不會(huì)影響到調(diào)用語(yǔ)句,然而對(duì)于對(duì)象變量,卻顯得很實(shí)用,因?yàn)閷?duì)象變量在傳遞時(shí)是傳遞其引用,這樣你在方法中對(duì)對(duì)象變量的修改也會(huì)影響到調(diào)用語(yǔ)句中的對(duì)象變量,當(dāng)你在方法中不需要改變作為參數(shù)的對(duì)象變量時(shí),明確使用final進(jìn)行聲明,會(huì)防止你無(wú)意的修改而影響到調(diào)用方法。
    另外方法中的內(nèi)部類在用到方法中的參變量時(shí),此參變也必須聲明為final才可使用,如下代碼所示:
    public?class?Test{
    ???void?print(final?String?str){
    ????????class?InnerTest{
    ????????????InnerTest?(){
    ????????????????System.out.println(str);
    ????????????}
    ????????}
    ????????InnerTest?it=new?InnerTest?();
    ????}
    ??public?static?void?main(String[]?args){
    ??????Test?test=new?Test();
    ??????test.print("Hello?word!!!");
    ??}
    }
    final方法
    將方法聲明為final那有兩個(gè)原因,第一就是說(shuō)明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來(lái)覆寫(xiě)這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說(shuō)可以直接使用。第二就是允許編譯器將所有對(duì)此方法的調(diào)用轉(zhuǎn)化為inline(行內(nèi))調(diào)用的機(jī)制,它會(huì)使你在調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用,例如保存斷點(diǎn),壓棧等,這樣可能會(huì)使你的程序效率有所提高,然而當(dāng)你的方法主體非常龐大時(shí),或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會(huì)迅速膨脹,可能反而會(huì)影響效率,所以你要慎用final進(jìn)行方法定義。
    final類
    當(dāng)你將final用于類身上時(shí),你就需要仔細(xì)考慮,因?yàn)橐粋€(gè)final類是無(wú)法被任何人繼承的,那也就意味著此類在一個(gè)繼承樹(shù)中是一個(gè)葉子類,并且此類的設(shè)計(jì)已被認(rèn)為很完美而不需要進(jìn)行修改或擴(kuò)展。對(duì)于final類中的成員,你可以定義其為final,也可以不是final。而對(duì)于方法,由于所屬類為final的關(guān)系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個(gè)final,但這顯然沒(méi)有意義。

    finally:
    finally?關(guān)鍵字是對(duì)?Java?異常處理模型的最佳補(bǔ)充。?finally?結(jié)構(gòu)使代碼總會(huì)執(zhí)行,而不管有無(wú)異常發(fā)生。使用?finally?可以維護(hù)對(duì)象的內(nèi)部狀態(tài),并可以清理非內(nèi)存資源。如果沒(méi)有?finally,您的代碼就會(huì)很費(fèi)解。例如,下面的代碼說(shuō)明,在不使用?finally?的情況下您如何編寫(xiě)代碼來(lái)釋放非內(nèi)存資源:

    public?void?writeFile(String?filePath,?String?fileName,?String?args)
    ????????????throws?IOException

    ????{

    ????????FileWriter?fw?=?new?FileWriter(filePath?+?fileName);
    ????????try?{

    ????????????fw.write(args);
    ????????}?catch?(IOException?e)?{
    ????????????//1
    ????????????fw.close();
    ????????????throw?e;
    ????????}
    //2
    ????????fw.close();
    ????}
    這段代碼創(chuàng)建了一個(gè)FileWriter?object,并調(diào)用?write?方法。在退出該方法之前,您必須關(guān)閉FileWriter?object,以避免資源漏洞。為了完成這一任務(wù),我們?cè)?//2?處調(diào)用?close,它是該方法的最后一條語(yǔ)句。但是,如果?try?塊中發(fā)生一個(gè)異常會(huì)怎么樣呢?在這種情況下,//2?處的?close?調(diào)用永遠(yuǎn)不會(huì)發(fā)生。因此,您必須捕獲這個(gè)異常,并在重新發(fā)出這個(gè)異常之前在?//1?處插入對(duì)?close?的另一個(gè)調(diào)用。這樣就可以確保在退出該方法之前關(guān)閉FileWriter?object。這樣編寫(xiě)代碼既麻煩又易于出錯(cuò),但在沒(méi)有?finally?的情況下這是必不可少的。有了?finally,前面的代碼就可以重寫(xiě)為以下的形式:

    public?void?writeFile(String?filePath,?String?fileName,?String?args)
    ????????????throws?IOException

    ????{

    ????????FileWriter?fw?=?new?FileWriter(filePath?+?fileName);
    ????????try?{

    ????????????fw.write(args);
    ????????}?catch?(IOException?e)?{
    ????????????throw?e;
    ????????}?finally?{

    ????????????fw.close();
    ????????}
    ????}
    finally?塊確保?close?方法總被執(zhí)行,而不管?try?塊內(nèi)是否發(fā)出異常。因此,可以確保在退出該方法之前總會(huì)調(diào)用?close?方法。這樣您就可以確信FileWriter?object被關(guān)閉并且您沒(méi)有泄漏資源。

    finalize:?

      根據(jù)Java語(yǔ)言規(guī)范,JVM保證調(diào)用finalize函數(shù)之前,這個(gè)對(duì)象是不可達(dá)的,但是JVM不保證這個(gè)函數(shù)一定會(huì)被調(diào)用。另外,規(guī)范還保證finalize函數(shù)最多運(yùn)行一次。

      通常,finalize用于一些不容易控制、并且非常重要資源的釋放,例如一些I/O的操作,數(shù)據(jù)的連接。這些資源的釋放對(duì)整個(gè)應(yīng)用程序是非常關(guān)鍵的。在這種情況下,程序員應(yīng)該以通過(guò)程序本身管理(包括釋放)這些資源為主,以finalize函數(shù)釋放資源方式為輔,形成一種雙保險(xiǎn)的管理機(jī)制,而不應(yīng)該僅僅依靠finalize來(lái)釋放資源。
    posted on 2006-08-01 09:06 水煮三國(guó) 閱讀(565) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE
    <2006年8月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(4)

    隨筆分類(85)

    隨筆檔案(89)

    文章分類(14)

    文章檔案(42)

    收藏夾(37)

    java

    oracle

    Sybase

    搜索

    •  

    積分與排名

    • 積分 - 211639
    • 排名 - 266

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲国产老鸭窝一区二区三区 | 含羞草国产亚洲精品岁国产精品| 久久久国产精品无码免费专区| 亚洲午夜国产精品无码老牛影视 | 男人的好看免费观看在线视频| 亚洲精品人成电影网| 最近中文字幕无免费| 亚洲国产午夜电影在线入口| 在线视频免费观看爽爽爽| 狠狠色香婷婷久久亚洲精品| 成年午夜视频免费观看视频 | 欧洲人免费视频网站在线| 亚洲AV午夜成人片| 亚洲啪啪免费视频| 亚洲日产乱码一二三区别| 国产三级免费观看| 中文在线免费观看| 亚洲理论片中文字幕电影| 最新免费jlzzjlzz在线播放| 国产亚洲综合视频| 亚洲高清国产AV拍精品青青草原 | 亚洲伊人久久大香线焦| 日韩免费高清一级毛片在线| 又黄又大的激情视频在线观看免费视频社区在线| 亚洲美女高清一区二区三区 | 国产午夜亚洲精品不卡免下载| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 久久免费国产精品| 亚洲一区中文字幕在线电影网| 国产大片91精品免费观看男同| 99热在线日韩精品免费| 国产99在线|亚洲| 精品亚洲一区二区三区在线播放| 精品无码人妻一区二区免费蜜桃| 亚洲国产aⅴ成人精品无吗| 亚洲综合图色40p| 日韩精品成人无码专区免费| h视频免费高清在线观看| 亚洲国产精品专区| 亚洲人成网站18禁止一区| 亚洲性线免费观看视频成熟|