1. 程式人生 > >《Java程式設計思想》第2章 一切都是物件

《Java程式設計思想》第2章 一切都是物件

2.1 用引用操縱物件

2.2 必須由你來建立所有物件

用關鍵字new建立一個物件。

2.2.1 儲存到什麼地方

有五個不同的地方可以儲存資料: 1)暫存器。最快的儲存區,處理器內部。 2)堆疊。位於通用RAM(速記訪問儲存器)中,但通過堆疊指標可以從處理器哪裡獲得支援。 3)。一種通用的記憶體池(也位於RAM區),用於存放所有的Java物件。 4)常量儲存。常量值通常直接存放在程式程式碼內部,這樣做是安全的,因為它們永遠不會被改變。 5)非RAM儲存。如果資料完全存活於程式之外,那麼它可以不受程式的任何控制,在程式沒有執行時也可以存在。其中兩個基本的例子是流物件持久化物件

2.2.2 特例:基本型別

建立後,位於堆疊中。 Java中基本型別所佔儲存空間的大小並不像其他大多數語言那樣隨機器硬體架構的變化而變化。這種所佔儲存空間大小的不變性是Java程式比用其他大多數語言編寫的程式更具可移植性的原因之一。

基本型別 大小 最小值 最大值 包裝器型別
boolean - - - Boolean
char 16-bits Unicode 0 unicode 2^16 -1 Character
byte 8-bits -128 +127 Byte
short 16 bits -2^15 +2^15-1 Short
int 32 bits -2^31 +2^31+1 Integer
long 64 bits -2^63 +2^63-1 Long
float 32 bits IEEE754 IEEE754 Float
double 64 bits IEEE754 IEEE754 Double
void - - - Void

所有數值型別都有正負號。 boolean型別所佔儲存空間的大小並有明確指定,近定義為能夠取字面值truefalse。 基本型別具有的包裝器,使得可以在堆中建立一個非基本物件,用來表示對應的基本型別。例如:

char c = 'x';
Character ch = new Character(c);

也可以這樣用: Charcter ch = new Character('x');

Java SE5的自動包裝功能將自動地將基本型別轉換為包裝器型別: Character ch = 'x' 並可以反向轉換: char c = ch; 高精度數字 Java提供了兩個用於高精度計算的類:BigIntegerBigDecimal。雖然它們大體上屬於“包裝器類”的範疇,但二者都沒有對應的基本型別。能作用於intfloat的操作,也同樣能作用於BigIntegerBigDecimal。只不過必須以方法呼叫方式取代運算子方式來實現。由於這麼做複雜了許多,所以運算速度會比較慢。這裡,以速度換取了精度。 BigInteger支援任意精度的整數。也就是說,在運算中,可以準確地表示任何大小的整數值而不會丟失任何資訊。 BigDecimal支援任何精度的定點數。例如,可以用它進行精確的貨幣計算。

2.2.3 Java中的陣列

Java確保陣列會被初始化,而且不能在它的範圍之外被訪問。

2.3 永遠不需要銷燬物件

2.3.1 作用域

在作用域裡定義的變數只可用於作用域結束之前。

2.3.2 物件的作用域

Java物件不具備和基本型別一樣的宣告週期。當用new建立一個Java物件時,它可以存活於作用域之外。 事實證明,由new建立的物件,只要你需要,就會一直保留下去。 Java有一個垃圾回收器,用來監視由new建立的所有物件,並辨別那些不會再被引用的物件。隨後,釋放這些物件的記憶體空間,以便供其他新的物件使用。

2.4 建立新的資料型別:類

class ATypeName{/*Class body goes here*/}

這就引入了一種新的型別。可以用new來建立這種型別的物件:

ATyepName a = new ATypeName();

2.4.1 欄位和方法

一旦定義了一個類(在Java中你所做的全部工作就是定義類,產生那些類的物件,以及傳送訊息給這些物件),就可以在類中設定兩種型別的元素:欄位(有時被稱作資料成員)和方法(有時被稱作成員函式)。 每個物件都有一個用來儲存其欄位的空間,普通欄位不能在物件間共享。下面是具有某些欄位的類:

class DataOnly{
	int i;
	double d;
	boolean b;
}

建立它的一個物件: DataOnly data = new DataOnly(); 可以給欄位賦值,但首先必須知道如何引用一個物件的成員。具體的實現為:在物件引用的名稱之後緊接著一個句點,然後再接著是物件內部成員的名稱:

objectReference.member

例如:

data.i = 47;
data.d = 1.1;
data.b = false;

基本成員預設值 若類的某個成員是基本資料型別,即使沒有進行初始化,Java也會確保它獲取一個預設值,如表:

基本型別 預設值
boolean false
char ‘\u0000’(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

但是,這些初始值對你的程式來說,可能是不正確的,甚至是不合法的。所以最好明確得對變數進行初始化。 然而上述確保初始化的方法並不適用於“區域性”變數(即並非某個類的欄位)。因此,如果在某個方法定義中有 int x; 那麼變數x得到的可能是任意值,而不會被自動初始化為零。所以在使用x前,應先對其賦一個適當的值。如果忘記了這麼做,Java會在編譯時返回一個錯誤,告訴你此變數沒有初始化。

2.5 方法、引數和返回值

Java的方法決定了一個物件能夠接收什麼樣的訊息。方法的基本組成部分包括:名稱、引數、返回值和方法體。下面是它最基本的形式:

ReturnType methodName(/* Argument list */){
	/*Method body */
}

方法名和引數列表(它們合起來被稱為“方法簽名”)唯一地標識出某個方法。 Java中的方法只能作為類的一部分來建立。方法只有通過物件才能被呼叫。通過物件呼叫方法時,需要先列出物件名,緊接著是句點,然後是方法名和引數列表。如:

objectName.methodName(arg1, arg2, arg3)

例如: int x = a.f() 返回值的型別必須要與x的型別相容。 這種呼叫方法的行為通常被稱為傳送訊息給物件。在上面的例子中,訊息是f(),物件是a。面向物件的程式設計通常簡單地歸納為“向物件傳送訊息”。

2.5.1 引數列表

return 關鍵字的用法,它包括兩方面:首先,它代表“已經做完,離開此方法”。其次,如果此方法產生了一個值,這個值要放在return語句後面。

2.6 構建一個Java程式

2.6.1 名字可見性

import 用來準確地告訴編譯器你想要的類是什麼。 例如: import java.util.*

2.6.3 static 關鍵字

通常來說,當建立類時,就是在描述那個類的物件的外觀與行為。除非用new建立那個類的物件,否則,實際上並未獲得任何物件。執行new來建立物件時,資料儲存空間才被分配,其方法才供外界呼叫。 當宣告一個事物是static時,就意味著這個域或方法不會與包含它的那個類的任何物件例項關聯在一起。所以,即使從未建立某個類的任何物件,也可以呼叫其static方法或者訪問其static域。 只須將static關鍵字放在定義之前,就可以將欄位或方法設定為static。例如,下面程式碼就生成了一個static欄位,並對其進行了初始化:

class StaticTest {
	static int i = 47;
}

現在,即使你建立了兩個StaticTest物件,StaticTest也只有一份儲存空間,這兩個物件共享一個i。再看看下面程式碼:

StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();

在這裡,st1.i和st2.i指向同一儲存空間,因此它們具有相同的值47。 引用static變數有兩種方法。如前所示,可以通過一個物件去定位它,如st2.i;也可以通過其類名直接引用,而這對於非靜態成員則不行。

StaticTest.i ++;

此時,st1.i和st2.i仍具有相同的值48。 類似邏輯也應用於靜態方法。static方法的一個重要用法就是在不建立任何物件的前提下就可以呼叫它。

2.7 你的第一個Java程式

2.8 註釋和嵌入式文件

/* */ //

2.8.1 註釋文件

javadoc輸出是一個HTML檔案。

2.8.2 語法

所有javadoc命令只能在“/**”註釋中出現,和通常一樣,註釋結束於“*/”。使用javadoc的方式主要有兩種:嵌入HTML,或使用“文件標籤”。獨立文件標籤是一些以“@”字元開頭的命令,且要置於註釋行的最前面。而“行內文件標籤”則可以出現在javadoc註釋中的任何地方,它們也是以“@”字元開頭,但要在花括號內。 共有三種類型的註釋文件,分別對應於註釋位置後面的三種元素:類、域和方法。也就是說,類註釋正好位於類定義之前;域註釋正好位於域定義之前;而方法註釋也正好位於方法定義的前面。

2.8.3 嵌入式HTML

2.8.4 一些標籤示例

2.8.5 文件示例

2.9 編碼風格

類名的首字母要大寫,如果類名由幾個單詞構成,那麼把它們並在一起(也就是說,不要用下劃線來分隔名字),其中每個內部單詞的首字母都採用大寫形式。例如:

class AllTheColorOfTheRainbow(){//..

這種風格稱作“駝峰風格”。幾乎其他所有內容——方法、欄位(成員變數)以及物件引用名稱等,公認的風格與類風格一樣,只是識別符號的第一個字母採用小寫。例如:

class AllTheColorOfTheRainbow(){
	int anIntegerRepresentingColors;
	void changeTheHueOfTheColor(int newHue){
		//...
	}
}

2.10 總結

一個總體認識。