Thinking-in-Java-讀書筆記-2-一切都是對象

如果我們說另一種不同的語言,那麼我們就會覺得一個有些不同的世界。
—Luduing Wittgerstein(1889-1951)

1. 用引用操作對象

儘管一切都是對象,但是操縱的標識符實際上是對象的一個「引用」,可以看做成日常生活中電視機和遙控器的關係。只要擁有遙控器,就能保持着與電視機的連接,對電視聲音和節目的調整,實際上都是對遙控器(引用)的操作。

String s;

這裏只是創建了引用,並不是對象,如果此時想 s 發送一個消息,就會返回一個運行時錯誤,這是因爲此時 s 實際上並沒有與任何對象有聯繫,因此一個安全的做飯就是,創建一個引用的同時,要對其進行初始化。

String s = "Hello wolrd

但這裏用到 Java 語言一個特性:字符串可以用帶引號的文本初始化,通常,必須對對象採用一種更通用的初始化方法。

2. 必須由你創建所有對象

存儲的位置

程序運行時,對象是怎麼進行防治安排的呢?有五個不同的地方可以存儲數據:

  1. 寄存器。 這是最快的存儲區,因爲它位於不同於替他存儲區的地方–處理器內部。但是寄存器的存儲數量極其有限,所以寄存器的存儲根據需求進行分配,你不能直接控制,也不能在程序中感覺到寄存器存在的任何跡象。

  2. 堆棧。 位於通用 RAM(隨機訪問存儲器),但通過堆棧指針可以從處理器那裏獲得直接支持。堆棧指針如果向下移動,則分配新的內存,如果向上移動,則釋放那些內存。這是一種快速有效的分配存儲方法,僅次於寄存器。創建程序時,Java 系統必須知道存儲在堆棧內所有的確切的生命週期,以便上下移動堆棧指針,這也約束了程序的靈活性。

  3. 堆。一種通用的內存池(也位於 RAM),用於存儲所有的 Java 對象,堆位於不同於堆棧的好處是:編譯器不需要知道存儲的數據在堆裏存活多長時間。因此,在堆裏分配存儲有很大的靈活性,當需要一個對象時,只需要 new 寫一行簡單的代碼,當執行這行代碼時,會自動在堆裏進行存儲分配,當然,爲這種靈活性必須付出相應的代價:用堆進行存儲分配和清理可能比堆棧進行存儲分配 需要更多的時間。

  4. 常量存儲。 常量通常直接存放在程序代碼內部,這樣做是安全的,因爲它們永遠不會被改變。

  5. 非 RAM 存儲。 如果數據完全存活於程序之外,那麼它可以不受程序的任何控制,在程序沒有運行時也可以存在。其中兩個基本的例子是流對象和持久化對象。

基本類型

不同於其他的 Java 對象,創建出來的時候存儲在堆中,基本類型創建並非是應用的自動變量,這個變量直接存儲值,並置於堆棧中,因此更加的高效。

Java 中確定每種基本類型所佔空間的大小,它們的大小並不像其他大多數語言那樣所機器硬件架構的變化而變化。

基本類型 大小 最大值 最小值
boolen - - -
char 16-bit Unicode 0 Unicode 2^16-1
byte 8-bit -128 127
short 16-bit -2^15 2^15-1
int 32-bit -2^31 2^31-1
long 64-bit -2^63 2^63-1
float 32-bit IEEE754 IEEE754
double 64-bit IEEE754 IEEE754
void - - -

3. 創建新的數據類型:類

如果一切都是對象,那麼是什麼決定了某一類對象的外觀與行爲呢?通過關鍵字 class 創建類。

基本成員默認值

基本類型 默認值
boolen false
char ‘\u0000’(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

4. static 關鍵字

通過 static 關鍵字可以滿足兩方面的需求:第一種,只想爲特定域分哦誒單一存儲空間,而不去考慮究竟要創建多少對象,甚至根本就不用創建對象。第二種,希望某個方法不與包含它的類的任何對象關聯在一起,也就是說沒有創建對象,也能夠調用這個方法。及類數據和類方法兩個概念。

5. 註釋相關

基礎的就不介紹了,介紹一些標籤示例:

@see

@see className
@see fully-qualified-className&methodName

@link

{@link package.class#member label}

總結

通過本章的學習,接觸相當多的關於如何編寫一個簡單程序的 Java 編程知識,此外對 Java 語言及它的一些基本思想也有了一個總體認識。

發佈了50 篇原創文章 · 獲贊 21 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章