第2章:一切皆是對象

用引用操控對象

java中一切皆被視爲對象,因此可採用單一固定的語法.儘管一切都看作對象,但是操縱的標識符實際上是對象的一個引用(reference).可以將這一情形看作是遙控器(引用)來操縱電視機(對象).只要握住遙控器,就能保持與電視機的連接. 此外沒有電視機,遙控器亦可獨立存在,也就是說,你擁有一個引用,並不一定需要有一個對象與它關聯 當沒有對引用進行初始化的時候,使用引用在運行的時候會報錯,建議創建一個引用的時候便對引用進行初始化

創建對象

創建的對象存儲到什麼地方?
1. 寄存器:
這是最快的存儲區,因爲它位於處理器內部,但是寄存器的數量極其有限,所以寄存器根據需求進行分配,不能直接控制,也不能在程序中感覺到任何的跡象(C或C++可以通過編譯器建議寄存器的分配方式)
2. 棧(堆棧):
位於通用的RAM(隨機訪問存儲器)中,但是通過堆棧指針可以從處理器那裏獲得直接支持,堆棧指針若向下移動,則分配新的內存,若向上移動,則釋放那些內存,這是一種快速有效的分配存儲的方法,僅次於寄存器.創建程序時,JAVA系統必須知道存儲在堆棧內所有項的確切生命週期,以便上下移動堆棧指針.這一約束限制了程序的靈活性,所以雖然某些JAVA數據存儲於堆棧中–特別是對象引用,但是JAVA對象並不存儲於其中
3. 堆:
一種常用的內存池(也位於RAM中),用於存儲JAVA對象.堆不同於堆棧的好處是:編譯器不需要知道存儲的數據在堆裏面存活多久.因此,在堆裏分配存儲有很大的靈活性.當需要一個對象時,只需要new一個.當執行到這段代碼的時候,會自動在堆裏面進行存儲分配.當然這種靈活需要付出相應的代價,用堆進行存儲分配和清理可能會比棧需要更多的時間.
4. 常量存儲:
常量值通常直接存放在程序代碼內部,這樣是安全的,因爲它們永遠不會被改變.有時,在嵌入式系統中,常量本身會和其他部分,隔離分開,所以這種情況下,可以選擇將其存放在ROM(只讀存儲器)中
5. 非RAM存儲:如果數據完全存活於程序之外,那麼它可以不受程序的任何控制,在程序沒有運行的時候也可以存在,其中兩個基本的例子就是流對象和持久化對象

基本類型

  • 八種基本類型:
    在程序設計中經常使用到一系列基本類型,它們需要特殊對待,可以把它們想象成基本類型.之所以特殊對待,是因爲new將對象存儲在”堆”裏面,故用new創建一個特別小的對象簡單的變量,往往不是很有效.因此,對於這些基本類型,不用new來創建變量,而是創建一個並非引用的”自動”變量.這個變量直接存儲值,並置於”棧”中,因此更加高效.
  • java要確定每種基本類型所佔用的存儲空間的大小.這種所佔存儲空間大小的不變性使其更具有可移植性的原因之一.
  • 所有的數值類型都有正負號,所以不要去尋找無符號的數值類型.
  • 基本類型具有包裝類,使得可以再堆中創建一個非基本對象,用來表示對應的基本類型:
char c='x';
Character ch = new Character(c);
//也可以這樣使用
Character ch = new Character('x');
//java自動保證功能將自動地將基本類型轉換爲包裝器類型
Character ch='x';
//並可以反向轉換
char c =ch;
  • 高精度數字:
    java提供了2個高精度計算的類BigDecimalBigInteger,雖然他們大體上屬於包裝器類型,但是他們沒有對應的基本類型,不過這2個類包含的方法,提供的操作與對基本類型所能執行的操作相似,也就是說能作用於int或float的操作,也能作用於BigDecimalBigInteger,只不過通過方法調用換取運算符方式.所以速度會慢一些.這裏以速度換精度

  • 數組: java確保數組會被初始化,而且不能在它的範圍之外被調用.這種範圍檢查,是以每個數組上少量的內存開銷及運行時的下標檢查作爲代價的,因此換來的是安全性和效率的提高.當創建了一個數組對象時,實際上就是創建了一個引用數組,並且每個引用都會被自動初始化一個特定值,該值擁有自己的關鍵字null.一旦java看見null就知道這個引用還沒有指向某個對象,在使用任何引用前,必須爲其指定一個對象.否則會報錯.

  • 對象的作用域:java對象不具備和基本類型一樣的生命週期.當用new創建一個對象的時候,它可以存活於作用域之外.由new創建出來的對象,只要你需要就會一直保留下去.
  • 類中的成員變量是基本數據類型的,即使沒有進行初始化也會給一個默認值.當變量作爲類的成員變量使用時,纔會有默認值. 注意:(“\u0000”.length()==1)
    這裏寫圖片描述
  • static關鍵字: 通常來說,當創建類時,就是在描述那個類的對象的外觀和行爲.除非用new創建那個類的對象,否則,實際上並未獲得任何對象.執行new來創建對象時,數據存儲空間才被分配,其方法才供外界調用.當聲明一個事物是static時,就意味着這個域或方法不會與包含它的那個類的任何對象實例關聯在一起.使用類名是引用static變量的首選方式,這不僅是因爲它強調了變量的static結構,而且在某些情況下它還爲編譯器進行優化提供了機會.(儘管static作用於某個字段時,肯定會改變數據創建方式,因爲一個static字段對每個類來說都只需要一份存儲空間,而非static字段則是每個對象有一個存儲空間,但是如果static 作用於某個方法,差別卻沒有那麼大).static方法的一個重要用法就是在不創建任何對象的前提下就可以調用它.
  • 註釋文檔:javadoc便是用於提取註釋的工具,javadoc只能爲public和protected成員進行文檔註釋.可以通過特殊標記 -private 把private成員的註釋也包括在內.

`

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