《Think in Java》(三)——一切都是對象


  作者在該章開始的時候比較了Java與C++,兩者都是雜合語言,但前者的OOP思 想更加明顯,以至於作者得出:Java乃至Java程序內的一切都是對象。

       

         3.1          用句柄操作對象

       

句柄的意思相對於C來說就是指針名,是可以通過這個句柄來間接操控Java中的對象。如果單單聲明一個句柄,則不能進行任何操作,所以Java中也就有了對象初始化的概念,通過對象初始化來使得句柄與具體的對象聯繫起來。注意,對於句柄來說,對象必須創建。

 

         3.2         保存到什麼地方

作者提到了六個存儲的地方,其中除了“寄存器”我們無法操作,只能由編譯器自行調用之外,其他的諸如“棧”、“堆”、“靜態存儲”、“常數存儲”、“非RAM存儲”這5類都是可以被我們間接或直接操作的。

我們在聲明一個句柄並且初始化的時候,句柄跟初始化對象存放的地址是不同的,前者(即句柄)存放在棧中,而後者(即初始化new的對象)存放在堆中,這是因爲棧向上或者向下移動指針的需要知道所有數據的“長度”以及“存在時間”(通過這種方式可以很方便的進行進行數據保存),而可執行這個過程的前提卻是需要Java進行代碼生成,這樣造成的結果就是影響了程序的靈活性。

反之,在堆中,編譯器不需要知道要從堆裏獲得多少的內存空間以及停留時間,也就不需要Java生成相應的代碼,這也就是爲什麼初始化的對象被存放在堆中的原因。

另外,我們在編寫程序的時候,往往會用到static的關鍵字,這些關鍵字所聲明的資源其實都存放在靜態存儲中。而常數存儲一般存儲不會變更的常量,其中包括自趺牀常量與基本類型常量。又因爲常數存儲的不需要變更特性,也就存放在了ROM的只讀寄存器中,相對於static的靜態存儲(因仍舊可變),它被放置於RAM的可讀寄存器中。

至於“非RAM存儲”,一般存儲在永久的硬盤空間中,但是也有一種情況是在程序運行過程中產生的“流數據”,這些“流數據”可能傳給其他設備使用。而存儲在硬盤空間最典型的例子就是數據庫了。

 

          3.3          Java中的基本類型

 

Java中存在最基本的類型,包括boolean、char、byte、short、int、long、float、double、void。

這裏將void也列爲了基本類型。

Java中將這些基本類型都封裝成了對象,但是,對於Java來講,基本類型是直接在堆棧中存放的,它是不需要用new來創建一個變量,使用基本類型更加高效。

 

Java中存在的數據組C++/C中的數組不同,根據作者的話,後者可以訪問到數據所存在的數據塊之外的數組。而前者則不同,Java對數組進行了封裝,它加入了確保數組被初始化和不被範圍外訪問的安全策略,更加安全(付出了一定的代價)。

 

          3.4         永遠不需要銷燬對象

 

作者在書上描述過C/C++語言存在作用域,且可以將一個較大作用域的變量“隱藏”,而Java中卻是不允許的。這裏其實有個前提,這個變量必須在同一個方法內,如果一個爲局部的方法變量,一個則爲全局的類變量,雖然名字相同,但是Java中仍舊可以存在,只不過遵循的是就近原則

 

Java在建立一個對象之後,它所被引用的句柄一旦失效,並不會連通它所指向的對象也一併失效,對象仍舊佔有空間,會一直存儲下去。

在書中,作者描述了Java存在一個垃圾回收器,這個東西是用來監視new創建的所有對象,並通過辨別哪些不會再被引用,從而進行回收處理,釋放空間。

Java的這種解決方案解決了內存泄漏的問題,程序員並不需要擔心對象何時會被回收,提高了開發的效率。

 

另外,Java中的方法之間的區別是通過方法名和參數列表來進行的,這兩個組合起來可以稱爲方法簽名

          3.5          關於static

 

Static作爲靜態的關鍵字,不管是對象還是方法,都會放置在靜態存儲區,而且靜態方法不需要依賴於具體的某個對象而存在。

如果在初始化一個對象的過程中兩次都聲明瞭一個相同的靜態變量,那麼它們是指向同一個存儲控件。

 

          3.6          關於註釋

 

Javadoc只對於protected和public方法有效,如果在private上進行註釋,那麼將會被忽略掉。如果想要在private上註釋,可以使用能夠-private進行標記。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章