乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java:對象創(chuàng)建和初始化過程

       吉祥文摘 2015-12-14
      分析一下Java中對象創(chuàng)建和初始化過程中涉及的相關(guān)概念問題,java中棧(stack)與堆(heap),對象、引用、句柄的概念。
      @Author:ZJ 06-11-25
      Blog:
      [url]http://zhangjunhd.blog.51cto.com/[/url]
      1.Java中的數(shù)據(jù)類型
          Java中有3個數(shù)據(jù)類型:基本數(shù)據(jù)類型(在Java中,boolean、byte、short、int、long、char、float、double這八種是基本數(shù)據(jù)類型)、引用類型和null類型。其中,引用類型包括類類型(含數(shù)組)、接口類型。
          下列語句聲明了一些變量:
      int k ;
      A a; //a是A數(shù)據(jù)類型的對象變量名。
      B b1,b2,…,b10000;// 假定B是抽象類或接口。
      String s; 

           注意:從數(shù)據(jù)類型與變量的角度看,基本數(shù)據(jù)類型變量k、類類型變量a和s、抽象類或接口類型變量b(1萬個),它們都是變量(標(biāo)識符)。
      2.關(guān)于句柄(handle)
          為了區(qū)別引用類型的變量標(biāo)識符和基本數(shù)據(jù)類型變量標(biāo)識符,我們特別的使用Handle來稱呼引用類型的變量標(biāo)識符。上面例子中b1至b10000、a、s都是Handle。Handle直觀的看就是手柄、把手,我們采用計算機(jī)界常用的中文翻譯“句柄”。
       
      2.1【W(wǎng)indows編程中的】句柄的含義
          句柄是WONDOWS用來標(biāo)識被應(yīng)用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識諸如應(yīng)用程序?qū)嵗翱?,控制,位圖,GDI對象等等。WINDOWS句柄有點(diǎn)象C語言中的文件句柄。 
          從上面的定義中的我們可以看到,句柄是一個標(biāo)識符,是拿來標(biāo)識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數(shù)據(jù)類型上來看它只是一個16位的無符號整數(shù)。應(yīng)用程序幾乎總是通過調(diào)用一個WINDOWS函數(shù)來獲得一個句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。
          如果想更透徹一點(diǎn)地認(rèn)識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動后,組成這個程序的各對象是駐留在內(nèi)存的。如果簡單地理解,似乎我們只要獲知這個內(nèi)存的首地址,那么就可以隨時用這個地址訪問對象。但是,如果您真的這樣認(rèn)為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,依此來滿足各種應(yīng)用程序的內(nèi)存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪里去找該對象呢?
          為了解決這個問題,Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存儲地址,用來專門登記各應(yīng)用對象在內(nèi)存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內(nèi)存管理器在移動對象在內(nèi)存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內(nèi)存中的哪個位置。這個地址是在對象裝載(Load)時由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(Unload)又釋放給系統(tǒng)。
          句柄地址(穩(wěn)定)→記載著對象在內(nèi)存中的地址────→對象在內(nèi)存中的地址(不穩(wěn)定)→實(shí)際對象
       
      2.2Java中句柄的意義
          對句柄以前的【W(wǎng)indows編程中的】含義有了深刻的認(rèn)識,我們可以說Handle是一個我們學(xué)習(xí)Java時非常需要的術(shù)語。它的意義在于區(qū)別“對象本身”和對象變量(或者嚴(yán)格點(diǎn):對象所屬的數(shù)據(jù)類型的變量標(biāo)識符)。
       
      2.3回到1中的變量聲明:
          現(xiàn)在,你應(yīng)該對下面的注釋一目了然。
      int k, j ;//k里面存放的是一個整型數(shù)。
      A a; //a里面存放地址。
      B b1,b2,…,b10000;// b1,…,b10000里面存放地址。
      String s; //s里面存放地址。
      3.關(guān)于引用(reference)
          什么是“引用”? “the identifier you manipulate is actually a ‘reference’ to an object”。(Thinking in Java 2e )
          翻譯是:你操縱的標(biāo)識符實(shí)際上是一個對象的“引用”?;蛘呔_些,翻譯成:你操作的標(biāo)識符實(shí)際上是指向一個對象的“引用”。顯然,原文中reference是一個有方向感的東西。
          回到Java中來,引用可以想象成對象的身份證號碼、對象的ID或者對象的手機(jī)號碼。當(dāng)然,更多的說法是,引用是對象在內(nèi)存中住的房間號碼。直觀的說,對象的引用是創(chuàng)建對象時的返回值!引用是new表達(dá)式的返回值。
          new A(); 這里真正創(chuàng)建了一個對象,但我們沒有用句柄去持有(hold、拿著、保存)該引用。從微觀上看,new表達(dá)式完成了對象初始化的任務(wù)(三步曲,下文詳細(xì)分析),整體上看則返回一個引用。
          再次回到1中的變量聲明,再看看下面的注釋。
      A a; //聲明句柄a,但未初始化,所以里面的值為null。
      B b1,b2,…,b10000;// 聲明句柄b1,…,b10000,但未初始化,所以里面的值為null。
      String s; //聲明句柄s,但未初始化,所以里面的值為null。
      4.句柄與引用的關(guān)系
      A a;//聲明句柄a,值為null
      a=new A();//句柄的初始化(句柄 = 引用;即把引用賦值給句柄)
          引用:new A()的值。引用可以簡單的看作對象占據(jù)內(nèi)存空間的地址;通過對象的引用,就可以方便的與其他對象區(qū)別開來,引用就是對象獨(dú)特的身份標(biāo)識。
      完成句柄的初始化后,就可以用句柄遙控對象了。
          當(dāng)然,這只是從一方面解釋對象的創(chuàng)建和初始化,理解了句柄和引用的關(guān)系后,下面分析對象初始化的整個過程。先做以下準(zhǔn)備工作,說說棧與堆。
      5.java中棧(stack)與堆(heap)
          在java中內(nèi)存分為“?!焙汀岸选边@兩種(Stack and Heap).基本數(shù)據(jù)類型存儲在“?!敝?,對象引用類型實(shí)際存儲在“堆”中,在棧中只是保留了引用內(nèi)存的地址值。
          順便說說“==”與“equals()方法”,以幫助理解兩者(Stack and Heap)的概念。
          在Java中利用"=="比較變量時候,系統(tǒng)使用變量在stack(棧)中所存的值來作為對比的依據(jù),基本數(shù)據(jù)類型在stack中所存的值就是其內(nèi)容值,而引用類型在stack中所存放的值是本身所指向Heap中對象的地址值。 Java.lang包中的Object類有public boolean equals (Object obj)方法。它比較兩個對象是否相等。僅當(dāng)被比較的兩個引用指向同一對象時(句柄相等),對象的equals()方法返回true。(至于String類的equals()方法,它重寫(override)equals()方法,不在本文討論之列。)
      6.對象的創(chuàng)建和初始化過程
          在java中對象就是類的實(shí)例。在一般情況下,當(dāng)把一個類實(shí)例化時,此類的所有成員,包括變量和方法,都被復(fù)制到屬于此數(shù)據(jù)類型的一個新的實(shí)例中去。分析以下兩段代碼。
       
      6.1  Vehicle veh1 = new Vehicle();
          上面的語句做了如下的事情:
      ①右邊的“new Vehicle”,是以Vehicle類為模板,在堆空間里創(chuàng)建一個Vehicle類對象(也簡稱為Vehicle對象)。
      ②末尾的()意味著,在對象創(chuàng)建后,立即調(diào)用Vehicle類的構(gòu)造函數(shù),對剛生成的對象進(jìn)行初始化。構(gòu)造函數(shù)是肯定有的。如果沒創(chuàng)建,Java會補(bǔ)上一個默認(rèn)的構(gòu)造函數(shù)。
      ③左邊的“Vehicle veh1”創(chuàng)建了一個Vehicle類引用變量。
      ④“=”操作符使對象引用指向剛創(chuàng)建的那個Vehicle對象。(回想一下句柄與引用)
          將上面的語句分為兩個步驟:
      Vehicle veh1;
      veh1 = new Vehicle();

          這樣寫,就比較清楚了,有兩個實(shí)體:一是對象引用變量,一是對象本身。在堆空間里創(chuàng)建的實(shí)體,與在??臻g里創(chuàng)建的實(shí)體不同。盡管它們也是確確實(shí)實(shí)存在的實(shí)體,但是似乎很難準(zhǔn)確的“抓”住它。我們仔細(xì)研究一下第二句,找找剛創(chuàng)建的對象叫什么名字?有人說,它叫“Vehicle”。不對,“Vehicle”是類(對象的創(chuàng)建模板)的名字。一個Vehicle類可以據(jù)此創(chuàng)建出無數(shù)個對象,這些對象不可能全叫“Vehicle”。對象連名都沒有,沒法直接訪問它。我們只能通過對象引用來間接訪問對象。
       
      6.2  Vehicle veh2;
      veh2 = veh1;
          由于veh1和veh2只是對對象的引用,第二行所做的不過是把veh1的引用(地址)賦值給veh2,使得veh1和veh2同時指向唯一的一個Vehicle對象。
       
      6.3  veh2 = new Vehicle();
          則引用變量veh2改指向第二個對象。
          從以上敘述再推演下去,我們可以獲得以下結(jié)論:①一個對象引用可以指向0個或1個對象;②一個對象可以有N個引用指向它。
      7.參考資料
      ⑴閻宏,Java與模式,電子工業(yè)出版社,2006
      ⑵yqj2065,句柄、引用與對象,
      [url]http://blog.csdn.net/yqj2065[/url]
      ⑶Java對象及其引用,[url]http://java./base[/url]

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多