定義一個類時(我們在Java裡的全部工作就是定義類、制作那些類的對象以及將消息發給那些對象),可在自己的類裡設置兩種類型的元素:數據成員(有時也叫“字段”)以及成員函數(通常叫“方法”)。其中,數據成員是一種對象(通過它的句柄與其通信),可以為任何類型。它也可以是主類型(並不是句柄)之一。如果是指向對象的一個句柄,則必須初始化那個句柄,用一種名為“構建器”(第4章會對此詳述)的特殊函數將其與一個實際對象連接起來(就象早先看到的那樣,使用new關鍵字)。但若是一種主類型,則可在類定義位置直接初始化(正如後面會看到的那樣,句柄亦可在定義位置初始化)。
每個對象都為自己的數據成員保有存儲空間;數據成員不會在對象之間共享。下面是定義了一些數據成員的類示例:
class DataOnly { int i; float f; boolean b; }
這個類並沒有做任何實質性的事情,但我們可創建一個對象:
DataOnly d = new DataOnly();
可將值賦給數據成員,但首先必須知道如何引用一個對象的成員。為達到引用對象成員的目的,首先要寫上對象句柄的名字,再跟隨一個點號(句點),再跟隨對象內部成員的名字。即“對象句柄.成員”。例如:
d.i = 47;
d.f = 1.1f;
d.b = false;
一個對象也可能包含了另一個對象,而另一個對象裡則包含了我們想修改的數據。對於這個問題,只需保持“連接句點”即可。例如:
myPlane.leftTank.capacity = 100;
除容納數據之外,DataOnly類再也不能做更多的事情,因為它沒有成員函數(方法)。為正確理解工作原理,首先必須知道“自變量”和“返回值”的概念。我們馬上就會詳加解釋。
1. 主成員的默認值
若某個主數據類型屬於一個類成員,那麼即使不明確(顯式)進行初始化,也可以保證它們獲得一個默認值。
主類型 默認值
Boolean false
Char '\u0000'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
一旦將變量作為類成員使用,就要特別注意由Java分配的默認值。這樣做可保證主類型的成員變量肯定得到了初始化(C++不具備這一功能),可有效遏止多種相關的編程錯誤。
然而,這種保證卻並不適用於“局部”變量——那些變量並非一個類的字段。所以,假若在一個函數定義中寫入下述代碼:
int x;
那麼x會得到一些隨機值(這與C和C++是一樣的),不會自動初始化成零。我們責任是在正式使用x前分配一個適當的值。如果忘記,就會得到一條編譯期錯誤,告訴我們變量可能尚未初始化。這種處理正是Java優於C++的表現之一。許多C++編譯器會對變量未初始化發出警告,但在Java裡卻是錯誤。