正式開始說明如何使用Java定義類別之前,先來看看,如果要設計衣服是如何進行的?你會有個衣服的設計圖,上頭定義了衣服的款式與顏色、尺寸,你會根據設計圖製作出實際的衣服,每件衣服都是同一款式,但會擁有自己的顏色與尺寸,你會為每個衣服別上一個名牌,這個名牌只能別在同款式的衣服上。
如果今天你要設計的就是有關服飾設計的軟體,那如何使用Java告訴電腦衣服的設計圖呢?你會先在程式中定義類別,這相當於上圖中衣服的設計圖:
class Clothes {
String color;
char size;
}
類別定義時使用
class
關鍵字,名稱使用Clothes
,相當為衣服設計圖取名為Clothes
,衣服的顏色用字串表示,也就是color
變數,可儲存"red"
、"black"
、"blue"
等值,衣服的尺寸會是'S'、'M'、'L'
,所以用char
型態宣告變數。如果要在程式中,利用Clothes
類別作為設計圖,建立衣服實例,要使用new
關鍵字。例如:new Clothes();
在物件術語中,這叫作新建一個物件。如果要有個名牌,專門綁到這個物件上,可以如下宣告:
Clothes c1;
在Java的術語中,這叫宣告參考名稱(Reference name)、參考變數(Reference variable)。如果要將
c1
綁到新建的物件上,可以使用=
指定,以Java的術語來說,稱為將c1
名稱參考(refer)至新建物件。例如:Clothes c1 = new Clothes();
可以將程式語法如下圖表示,直接對照上圖,你就可以瞭解類別與物件的區別,以及
class、new、=
等語法的使用:物件(Object)與實例(Instance),在Java中幾乎是等義的名詞,文件中會交相使用這兩個名詞。
在
Clothes
類別中,定義了color
與size
兩個變數,以Java術語來說,叫作定義兩個值域(Field)成員,或叫作定義兩個物件資料成員,這表示每個新建的Clothes
實例,可以擁有個別color
與size
值。例如:package cc.openhome;
class Clothes {
String color;
char size;
}
public class Field {
public static void main(String[] args) {
Clothes sun = new Clothes();
Clothes spring = new Clothes();
sun.color = "red";
sun.size = 'S';
spring.color = "green";
spring.size = 'M';
System.out.printf("sun (%s, %c)%n", sun.color, sun.size);
System.out.printf("spring (%s, %c)%n", spring.color, spring.size);
}
}
在這個Field.java中,定義了兩個類別,一個是公開(
public
)的Field
類別,所以檔案主檔名必須是Field
,另一個是非公開的Clothes
,一個原始碼中可以有多個類別定義,但只能有一個是公開類別,且檔案主檔名必須與公開類別名稱相同。程式中建立了兩個
Clothes
實例,並分別宣告了sun
與spring
兩個名稱來參考,接著要求JVM,將sun
綁定物件上的color
與size
分別指定為"red"
與'S'
,將spring
的color
與size
分別指定為"green"
與'M'
。最後分別顯示sun、spring
的資料成員值。執行結果如下,可以看到
sun、spring
各自擁有自己的資料成員:sun (red, S)
spring (green, M)
spring (green, M)
可以觀察這個範例中,為個別物件指定資料成員值的程式碼,你會發現是類似的,如果你想在建立物件時,一併進行某個初始流程,像是指定資料成員值,則可以定義建構式(Constructor),建構式是與類別名稱同名的方法(Method),直接來看範例比較清楚:
package cc.openhome;
class Clothes2 {
String color;
char size;
Clothes2(String color, char size) {
this.color = color;
this.size = size;
}
}
public class Field2 {
public static void main(String[] args) {
Clothes2 sun = new Clothes2("red", 'S');
Clothes2 spring = new Clothes2("green", 'M');
System.out.printf("sun (%s, %c)%n", sun.color, sun.size);
System.out.printf("spring (%s, %c)%n", spring.color, spring.size);
}
}
在這個例子中,定義新建物件時,必須傳入兩個引數給字串型態的
color
參數(Parameter)與char
型態的size
參數,而建構式中,由於color
參數與資料成員color
同名,你不可以直接寫color = color
,這是將color
參數的值指定給color
參數,而要使用this
表示,將color
參數的值指定給這個物件的color
成員。在實際使用
new
建構物件時,就可以直接傳入字串與字元,分別代表Clothes
實例的color
與size
值,執行結果與上個範例是相同的。注意 物件導向中有所謂封裝(Encapsulation),這邊只不過是定義類別,離封裝的意涵還有很大的距離,之後還會詳細談到如何用Java來實現更完整的封裝。