類有三種成員:欄位、方法和嵌套類與嵌套介面。學習類,可以從這三種成員的聲明、修飾符、初始化(包括類對象建立)和使用這些角度展開。這裡主要講的是欄位和方法。
聲明
欄位的聲明為,修飾符(可選)、類型名、欄位名、初始化子句(可選);
方法的聲明為,修飾符、傳回型別、方法簽名(方法名、參數列表)、異常和方法體。
修飾符
整理總結成了一張表,如下:
每一類修飾符,都可以展開成一個很龐大的話題,這裡不展開了。表中,“是”表示可以有,“否”表示不適用。
初始化
欄位初始化,最直接的就是使用初始化子句。欄位初始化子句,可以是常量、其他欄位和方法的調用。注意:(1)初始化子句必須保證類型正確;(2)初始化子句不能拋出異常。未被初始化的欄位會被賦予預設的初始值。
對象初始化,必須顯示初始化。初始化的方式是構造方法(書中稱為構造器)和初始化段(類裡面,除了欄位、方法、嵌套類和嵌套介面之外的用{}包括的程式碼片段,或者用static{}包括的程式碼片段,後者又稱靜態初始化,顯然只能對待用資料成員進行初始化)。
使用
這裡有一點顛覆了我的認識,即Java中的方法都是按值傳遞的,沒有按引用傳遞的。給個測試的例子代碼,如下:
1 class A 2 { 3 int v = 0; 4 } 5 6 class B 7 { 8 public static void main(String[] args) 9 {10 A a = new A();11 System.out.println(a.v);12 foo(a);13 System.out.println(a.v);14 foo2(a);15 System.out.println(a.v);16 }17 18 public static void foo(A a)19 {20 a.v = 1;21 }22 23 public static void foo2(A a)24 {25 a = new A();26 a.v = 2;27 }28 }
如果按照以往的按引用傳遞的觀點,輸出的值應該是 0、1 、2(分三行顯示,下同),而實際是 0、1、 1。這說明了,傳遞給foo2的參數a,仍然只是一個拷貝,也就是按值傳遞的意思。