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

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

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

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0

    初始化和清理
        1.this關(guān)鍵字
         如果有同一個(gè)類型的兩個(gè)對(duì)象a和b,如何才能讓這兩個(gè)對(duì)象同時(shí)調(diào)用peel方法呢:
        如:
         Banana a = new Banana();
         Banana b = new Banana;
         a.peel(1);
         b.peel(2);
         如果只有一個(gè)peel方法,它如何知道是被a還是b調(diào)用呢?
         為了能用簡(jiǎn)便,面向?qū)ο蟮恼Z法來編寫代碼,即"發(fā)送消息給對(duì)象";編譯器做了一些幕后工作,他暗自把“所操作對(duì)象的引用”作為第一個(gè)參數(shù)傳遞給了peel->所以上述兩個(gè)方法的調(diào)用變成了這樣:a.peel(a,1),b.peel(b,1);這是內(nèi)部的表示形式;雖然我們不能這樣書寫代碼,并試圖通過編譯,不過這種寫法的確能幫你了解實(shí)際發(fā)生的事情。
     如果你希望在方法內(nèi)部獲得對(duì)當(dāng)前對(duì)象的引用,由于這個(gè)引用是編譯器“偷偷”傳入的,沒有什么標(biāo)識(shí)符可用;但為此有一個(gè)專門的關(guān)鍵字:this;this關(guān)鍵字只能在方法內(nèi)部使用,表示“對(duì)調(diào)用方法的那個(gè)對(duì)象”的引用;
     當(dāng)前方法的this引用會(huì)自動(dòng)引用于同一類的其他方法->
     只有當(dāng)需要明確指出對(duì)當(dāng)前對(duì)象引用的時(shí)候,才需要使用this關(guān)鍵字;如需要返回當(dāng)前對(duì)象的引用的時(shí)候,就常常在return語句里這樣寫:
     return this;
     
         注:有人執(zhí)意將this放在每一個(gè)方法調(diào)用和字段引用前,認(rèn)為這樣“更清晰更明確”。但是千萬別這么做,我們使用高級(jí)語言的原因之一就是它幫我們做一些事情。要是把this放在一些沒有必要的地方,就會(huì)使讀你程序的人不知所措,因?yàn)閯e人寫的代碼不會(huì)到處用this。遵循一種一致而直觀的編程風(fēng)格能節(jié)省時(shí)間和金錢.
         1.通過this返回對(duì)當(dāng)前對(duì)象的引用,所以很容易在一條語句中對(duì)同一個(gè)對(duì)象執(zhí)行多種操作;
         2.一些必要的地方才需要調(diào)用this
         3.構(gòu)造器中調(diào)用構(gòu)造器,this添加參數(shù)列表-產(chǎn)生對(duì)符合此列表的某個(gè)構(gòu)造器的明確調(diào)用(除構(gòu)造器之外,編譯器禁止在其他任何方法調(diào)用構(gòu)造器)
         4.解決參數(shù)名稱和數(shù)據(jù)成員名稱一致,數(shù)據(jù)成員采用this.的形式引用
         5.static方法就是沒有this的方法,在static方法的內(nèi)部不能調(diào)用非靜態(tài)方法(這不是完全不可能,如果你傳遞一個(gè)對(duì)象的引用到靜態(tài)方法里(靜態(tài)方法可以創(chuàng)建其自身的對(duì)象),然后通過這個(gè)引用(和this效果相同)就可以調(diào)用非靜態(tài)方法和訪問非靜態(tài)數(shù)據(jù)成員了。但通常要達(dá)到這樣的效果,你只需寫一個(gè)非靜態(tài)方法即可);反過來可以;可以在沒有創(chuàng)建對(duì)象的前提下;僅僅通過類本身調(diào)用static方法,這實(shí)際上正是static方法的主要用途;
         有些人認(rèn)為static不是面向?qū)ο蟮模驗(yàn)樗拇_具有全局函數(shù)的語義;使用static方法時(shí),由于不存在this,所以不是通過“向?qū)ο蟀l(fā)送消息”的方式來完成的;的確,要是在代碼中出現(xiàn)了大量的static方法,就該重新考慮一下自己的設(shè)計(jì)了;然而static的概念有其實(shí)用之處,許多時(shí)候都用到它;對(duì)于它是否真的面向?qū)ο螅艚o理論家去討論吧;
     
       2.終結(jié)清理和垃圾回收
         1.對(duì)象可能不被垃圾回收
         2.垃圾回收并不等于析構(gòu)
         3.垃圾回收只與內(nèi)存有關(guān)
          垃圾回收本身也有開銷
      finalize:
           假定工作原理:一旦垃圾回收器準(zhǔn)備好釋放對(duì)象占用的存儲(chǔ)空間,將首先調(diào)用finalize方法,并且在下一次垃圾回收動(dòng)作發(fā)生時(shí),才會(huì)真正的回收對(duì)象占用的內(nèi)存;【不過要是“垃圾回收”沒有發(fā)生的話,則無法釋放;這個(gè)策略是恰當(dāng)?shù)模灰绦驔]有瀕臨存儲(chǔ)空間用完的一刻;對(duì)象占用的空間總也得不到釋放;因?yàn)槔厥找彩怯虚_銷的】
          通過某種創(chuàng)建對(duì)象方式以外的方式為對(duì)象分配了存儲(chǔ)空間:是由于在分配內(nèi)存的時(shí)候可能使用了C語言的做法,這種做法主要發(fā)生在使用“本地”方法的情況下;本地方法是一種在Java中調(diào)用非Java代碼的方式。本地方法目前只支持C/C++,但他們可以調(diào)用其他語言寫的代碼,所以實(shí)際上可以調(diào)用任何代碼;非Java代碼中,也許會(huì)調(diào)用類似C的的malloc函數(shù)系列來分配存儲(chǔ)空間,而且除非調(diào)用了free函數(shù),否則存儲(chǔ)空間將得不到釋放,從而造成內(nèi)存泄露;當(dāng)然free是C/C++的函數(shù),所以要在finalize中用本地方法調(diào)用它;
          【記住:無論是垃圾回收還是終結(jié),都不保證一定會(huì)發(fā)生。如果Java虛擬(jvm)并未面臨內(nèi)存耗盡的情況,它是不會(huì)浪費(fèi)時(shí)間去執(zhí)行垃圾回收以恢復(fù)內(nèi)存的】
      
        3.Java堆模型
         1.一些java虛擬機(jī)的堆實(shí)現(xiàn)中,更像一個(gè)傳送帶,每分配一個(gè)新對(duì)象,就往前移動(dòng)一格;對(duì)象存儲(chǔ)空間的分配速度非常快,Java的“堆”指針只是簡(jiǎn)單的移動(dòng)到尚未分配的區(qū)域;(C++的堆像一個(gè)院子,每個(gè)對(duì)象都負(fù)責(zé)管理自己的地盤,一段時(shí)間后,對(duì)象可能被銷毀,但地盤必須加以重用);不過Java的堆并不完全像傳送帶那樣工作,否則會(huì)導(dǎo)致頻繁的內(nèi)存頁面調(diào)度,會(huì)顯著影響性能;而垃圾回收介入之后,它工作時(shí),一面回收空間,一面使隊(duì)中的對(duì)象緊湊排列,這樣“堆指針”就可以很容易移動(dòng)到更靠近傳送帶的開始處;也就盡量避免了頁面錯(cuò)誤->通過垃圾回收器對(duì)對(duì)象重新排列,實(shí)現(xiàn)了一種告訴的,有無限空間可供分配的堆模型.
     
        4.垃圾回收機(jī)制:
             1.引用計(jì)數(shù):垃圾回收器在含有全部對(duì)象的列表遍歷,發(fā)現(xiàn)某個(gè)對(duì)象的引用計(jì)數(shù)為0,就是釋放其占用的空間;不過對(duì)于對(duì)象之間的循環(huán)引用,則會(huì)出現(xiàn)“對(duì)象應(yīng)該被回收,不過引用計(jì)數(shù)不為0”;對(duì)于垃圾回收器而言,定位這樣的交叉引用的對(duì)象組所需的工作量極大;
             2.更快的模式:對(duì)任何“活”的對(duì)象,一定能最終追溯到其存活在堆棧或靜態(tài)存儲(chǔ)區(qū)之中的引用;因此,如果從堆棧和靜態(tài)存儲(chǔ)區(qū)開始,遍歷所有的引用,就能找到所有活著的對(duì)象;
             停止-復(fù)制
              標(biāo)記-清掃
          兩種方式程序?qū)和?/span>
          自適應(yīng)的,分代的,停止-復(fù)制,標(biāo)記-清掃式垃圾回收器
         3.java虛擬機(jī)許多附加技術(shù)->JIT(just in time)編譯器技術(shù)->
              新版JDK的Java HotSpot技術(shù)
        6.初始化
         1.方法局部變量,編譯時(shí)錯(cuò)誤保證;【當(dāng)然編譯器可以為局部變量賦一個(gè)默認(rèn)值,不過未初始化的局部變量更有可能是程序員的疏忽,所以采用默認(rèn)值反而會(huì)掩蓋這種失誤,因此強(qiáng)制程序員提供一個(gè)初始值,往往可以找到程序中的bug】
         2.類的內(nèi)部,變量定義的先后順序決定了初始化的順序;會(huì)在任何方法(包括構(gòu)造器)被調(diào)用之前得到初始化
         3.靜態(tài)數(shù)據(jù)初始化,無論創(chuàng)建多少個(gè)對(duì)象,靜態(tài)數(shù)據(jù)都只占用一份存儲(chǔ)區(qū)域->靜態(tài)初始化只有在必要時(shí)才進(jìn)行->
         4.構(gòu)造器可以看成是靜態(tài)方法;首次創(chuàng)建類對(duì)象/訪問類的靜態(tài)方法,靜態(tài)域->載入類.class->靜態(tài)初始化,只在class加載的時(shí)候初始化一次->new,在堆上為該對(duì)象分配足夠的存儲(chǔ)空間->這塊存儲(chǔ)空間請(qǐng)0,所有基本類型被置默認(rèn)值,引用null->執(zhí)行所有出現(xiàn)于字段定義處的初始化動(dòng)作->執(zhí)行構(gòu)造器->
         5.static{},靜態(tài)子句;{},實(shí)例初始化子句;
         6.數(shù)組初始化int[]array= {};int[] array = new int[]{}->前者只能用在數(shù)組定義處,而后者可以傳參
           可變參數(shù)列表,如int...args,String...args;可變參數(shù)列表使重載過程變的復(fù)雜了->如f(Integer...args);f(Long...args)->當(dāng)調(diào)用f()的時(shí)候則編譯出錯(cuò),因?yàn)椴恢涝撜{(diào)用哪個(gè)f方法->可以給每個(gè)方法都就加上一個(gè)非可變參數(shù)->你應(yīng)該總是只在方法的一個(gè)版本上使用可變參數(shù)列表,或者壓根就不是用它;
        7.enum
         枚舉是類,且有自己的方法;enum的名字能夠倍加清楚的表明程序意欲何為的;創(chuàng)建enum時(shí),編譯器會(huì)自動(dòng)添加一些有用的特性,如創(chuàng)建toString方法,很方便的顯示每個(gè)enum實(shí)例的名字;還會(huì)創(chuàng)建ordinal方法,表示某個(gè)特定enum常量的聲明順序;static values方法,用來按照enum常量的聲明順序,產(chǎn)生由這些常量構(gòu)成的數(shù)組;與switch是絕佳的組合;
     直接將所得到的類型直接拿來使用,而不必過多的考慮,將enum用作另一種創(chuàng)建數(shù)據(jù)類型的方式;
     在枚舉之前,我們需要?jiǎng)?chuàng)建一個(gè)整型常量集,但是這些常量值并不會(huì)將其自身的取值限制在這個(gè)常量集的范圍內(nèi),因此顯的更有風(fēng)險(xiǎn); 更難以使用;
      當(dāng)然以前這樣的枚舉安全機(jī)制:(個(gè)人認(rèn)為還是可以滿足需求的,只不過沒有一些編譯器添加的有用的特性,而且序列化的時(shí)候會(huì)有問題)
       public class Oriented
      {
       private int value;
       //兩個(gè)安全非final枚舉
       public static final Oriented ORI = new Oriented(1);
       public static final Oriented OR2  = new Oriendted(2);

       //私有構(gòu)造函數(shù)
       private Oriented(int v)
       {
        value = v;
       }
      }
        8.垃圾回收器的確增加了運(yùn)行時(shí)的開銷,而且Java解釋器從來就很慢;隨著時(shí)間推移,java在性能方面已經(jīng)取得了長(zhǎng)足的進(jìn)步,不過速度問題仍然是它涉及某些編程領(lǐng)域的障礙.    
        9.部分源碼    

    package com.book.chap5.initAndDestroy;
    /**
     *
     *Finalize用法,驗(yàn)證終結(jié)條件
     *<p>本例的終結(jié)條件是:所有的book對(duì)象在垃圾回收都應(yīng)該checkin;main方法中,有一本書沒有被簽入,被finalize方法發(fā)現(xiàn),輸出消息</p>
     *
     *@author landon
     *@since JDK1.6
     *@version 1.0 2012-4-12
     *
     
    */

    public class FinalizeUsage
    {
        
    public static void main(Stringargs)
        
    {
            Book novel = new Book(true);
            novel.checkIn();
            
            
    new Book(true);
            
            
    //強(qiáng)制進(jìn)行終結(jié)動(dòng)作[當(dāng)然也可以通過重復(fù)的執(zhí)行程序,假設(shè)程序?qū)⒁峙浯罅康拇鎯?chǔ)空間,而導(dǎo)致垃圾回收動(dòng)作的進(jìn)行,最終也能找到錯(cuò)誤的Book]
            System.gc();
        }

    }


    class Book
    {
        
    private boolean checkOut;
        
        
    public Book(boolean checkOut)
        
    {
            
    this.checkOut = checkOut;
        }

        
        
    /**
         * 檢入,書籍只有檢入后才可以被垃圾回收
         
    */

        
    public void checkIn()
        
    {
            checkOut = false;
        }

        
        @Override
        
    protected void finalize()
        
    {
            
    if(checkOut)
            
    {
                System.out.println("Error: has book checked out");
                
    try
                
    {
                    
    //調(diào)用父類的finalize方法
                    super.finalize();
                }
     
                
    catch (Throwable e)
                
    {
                    e.printStackTrace();
                }

            }

        }

    }

            

    package com.book.chap5.initAndDestroy;
    /**
     *
     *枚舉enum的初步用法
     *
     *@author landon
     *@since JDK1.6
     *@version 1.0 2012-4-12
     *
     
    */

    public class SimpleEnum
    {
        
    public static void main(Stringargs)
        
    {
            Spiciness howHot = Spiciness.MEDIUM;
            
    //打印枚舉,toString方法已實(shí)現(xiàn)
            System.out.println(howHot);
            
            
    //ordinal按照聲明順序從0開始
            for(Spiciness spiciness : Spiciness.values())
            
    {
                System.out.println(spiciness + " ordinal:" + spiciness.ordinal());
            }

            
            testSwitchEnum(Spiciness.MILD);
            testSwitchEnum(Spiciness.HOT);
            testSwitchEnum(Spiciness.FLAMING);
        }

        
        
    //測(cè)試enum和switch的組合
        public static void testSwitchEnum(Spiciness spiciness)
        
    {
            
    switch(spiciness)
            
    {
                
    //注意case必須是NOT必須是無限制的枚舉名稱[spiciness的類型已經(jīng)確定是枚舉Spiciness,沒有必要特意加上Spiciness.NOT,畫蛇添足],而不是Spiciness.NOT,否則編譯報(bào)錯(cuò)The qualified case label Spiciness.NOT must be replaced with the unqualified enum constant NOT
                case NOT:
                    System.out.println("not");
                    
    break;
                
    case MILD:
                    System.out.println("mild");
                    
    break;
                
    case MEDIUM:
                    System.out.println("medium");
                    
    break;
                
    case HOT:
                
    case FLAMING:
                
    default:
                    System.out.println("too hot");
            }

        }

    }


    //枚舉聲明
    enum Spiciness
    {
        
    //常量,大寫
        NOT,MILD,MEDIUM,HOT,FLAMING
    }

     

    package com.book.chap5.initAndDestroy;
    /**
     *
     *可變參數(shù)
     *<p>可變參數(shù)列表可以使用任何類型的參數(shù),包括基本類型</p>
     *
     *@author landon
     *@since JDK1.6
     *@version 1.0 2012-4-12
     *
     
    */

    public class VarArgs
    {
        
    public static void main(Stringargs)
        
    {
            printArgsClass(1);
            
            
    //輸出class [I getClass,產(chǎn)生對(duì)象的類
            System.out.println(new int[0].getClass());
            
            f(1,'a');
            
    //The method f(float, Character[]) is ambig        uous for the type VarArgs
    //f('a','b');
        }

        
        
    public static void printArgsClass(intargs)
        
    {
            System.out.println(args.getClass());
        }

        
        
    //重載的時(shí)候,使用可變參數(shù)列表一定要謹(jǐn)慎;非常有可能出現(xiàn)模棱兩可的調(diào)用->從而導(dǎo)致編譯報(bào)錯(cuò)
        public static void f(float f,Characterargs)
        
    {
            System.out.println(
    "first method");
        }

        
        
    public static void f(Characterargs)
        
    {
            System.out.println(
    "second method");
        }

    }


    posted on 2013-01-08 17:04 landon 閱讀(1699) 評(píng)論(0)  編輯  收藏 所屬分類: ProgramBook
    主站蜘蛛池模板: 国产精品免费久久| 无遮挡国产高潮视频免费观看| 97久久免费视频| 亚洲欧洲日韩在线电影| 亚洲精品无码专区久久久| 亚洲剧场午夜在线观看| v片免费在线观看| 久久亚洲国产成人影院网站| a高清免费毛片久久| 亚洲精品无码久久久久| 久久99热精品免费观看动漫| a级毛片无码免费真人| 亚洲一区无码中文字幕乱码| 99久久免费精品国产72精品九九| 亚洲AV综合永久无码精品天堂| 日本特黄特色免费大片| 日本一区二区三区在线视频观看免费 | 亚洲精品无码一区二区| 韩国免费三片在线视频| 真人无码作爱免费视频| 91麻豆国产自产在线观看亚洲| 秋霞人成在线观看免费视频| 免费一区二区三区四区五区| 一区二区三区免费在线观看| 亚洲VA中文字幕不卡无码| 欧洲一级毛片免费| 日韩亚洲人成在线综合| 亚洲精品色午夜无码专区日韩| 99久热只有精品视频免费看| 亚洲综合激情五月色一区| 亚洲成年看片在线观看| 精品亚洲永久免费精品| 亚洲综合另类小说色区| 最近中文字幕mv免费高清在线 | 亚洲日产2021三区在线| 国产麻豆免费观看91| 国产99精品一区二区三区免费| 99久久亚洲综合精品成人网| 免费日本一区二区| 亚洲综合一区无码精品| 91麻豆精品国产自产在线观看亚洲 |