7 參考資料型別(Reference Types)
參考資料型別(Reference Types)包含三類:內建物件之陣列(矩陣)、字串,與自行設計之建構物件(含類別及介面)。內建物件為跟隨Java語言提供之功能,不必另行開發。這三種變數的值存放的是參考而非實值,也就是存放指向物件的位址。
陣列是本章節的重點,字串及自行設計之類別物件則大部份分散於各章節說明,在此僅稍作說明。
[7-1陣列(Array)]
陣列是同類型資料的集合,陣列可有一維陣列及二維以上的多維陣列。陣列變數本身為參考資料型別,其元素值可為基本資料型別或參考資料型別(物件)。
陣列變數因屬參考型別,其變數(欄位)值存放的是參考值(位址)。而陣列元素可為基本資料型別或參考資料型別,基本資料型別的陣列之每個元素存放的是實值,參考資料型別的陣列之每個元素都是物件,存放的是參考值(位址),參考值再指向實值。以下圖(圖7-1a、b)表示較為清楚。
<陣列的維度>
陣列常見為一維及二維,三維較少使用,四維以上理論上可至無窮盡的維度。一維就是平常所說的直線,二維為平面,三維為三度立體空間,四維以上較難想像。下面就以一列排成一直線的箱子代表一維陣列,多列排成一個平面的箱子代表二維陣列,多層平面的箱子排成立體狀代表三維陣列,一個箱子代表一個陣列元素,陣列元素雖可為基本資料型別,或是參考資料型別,但同屬一個陣列時,必須屬於同一資料型別。往後的陣列說明則以表格的方式呈現。
如果以一個學校三個年級的學生國文成績舉例如下(使用表格方式):
<一維陣列例示說明>
存放一個班級的國文分數(整數)時,假設有10位學生,就像下列10個表格,每個表格分別存放一位學生的國文成績,只要一列表格即可。在真實世界裡,由左至右可代表座號1學生的成績、座號2學生的成績、座號3學生的成績….. 座號10學生的成績。Java世界裡,其陣列位址是由0起算的,分別是位址0、位址1、位址2….. 位址9。
一年一班:
座號1 座號2 座號3 4 5 6 7 8 9 10
70 |
65 |
70 |
89 |
66 |
79 |
95 |
74 |
59 |
48 |
位址0 位址1 位址2 3 4 5 6 7 8 9
<二維陣列例示說明>如果要表現一個年級所有班級(假設3個班級)時,需使用二維陣列。
由上至下為一年一班、一年二班、一年三班:
70 |
65 |
70 |
89 |
66 |
79 |
95 |
74 |
59 |
48 |
45 |
56 |
77 |
90 |
38 |
49 |
83 |
85 |
91 |
63 |
61 |
67 |
98 |
39 |
88 |
74 |
79 |
81 |
85 |
99 |
<三維陣列例示說明>三個年級時就以三維空間表現
藍色為一年級,綠色為二年級,橘色為三年級。
<陣列維度指定方式>
一維陣列:陣列變數資料型別[第一維長度]
二維陣列:陣列變數資料型別[第二維長度][第一維長度]
三維陣列:陣列變數資料型別[第三維長度][第二維長度][第一維長度]
還有其他之指定方式見後述。
[7-1-1一維陣列]
一維陣列含一列一到多個元素。
宣告格式:資料型別[ ] 陣列名稱、資料型別 陣列名稱[ ]、
資料型別 [ ]陣列名稱等,普遍採用- 資料型別[ ] 陣列名稱。
例:整數型別陣列-int[ ] a、int a[ ]、int [ ]a。
參考型別陣列-B[ ] b、B b[ ]、B [ ]b,B為類別。
宣告陣列長度(元素個數):建立物件時指定,a = new int[10]時變數長度為10,即有10個元素。矩陣元素位址由0起算,如下列10個元素位址為由0~9:
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
a[5] |
a[6] |
a[7] |
a[8] |
a[9] |
陣列元素值之指定方式:
個別指定:a[0]=10, a[1]=20, a[2]=30 ........ , a[9]=100;
宣告時集體指定:int[ ] a = {10,20,30,40,50,60,70,80,90,100};
建立物件時指定:int[ ] b; b = new int[ ] {200,300},建立時指定元素值,同時決定陣列長度為2。
<一維陣列元素為基本資料型別範例>以2個元素為例
a[0] a[1]
10 |
20 |
class Array1 {
public static void main(String[] args) {
int[] a; //宣告整數資料型別一維陣列a
a = new int[2]; //建立物件時指定陣列元素個數2
a[0] = 10; //指定第一個元素的值10
a[1] = 20; //指定第二個元素的值20
System.out.println("a[0] = "+a[0]);
System.out.println("a[1] = "+a[1]); } }
命令提示字元下輸入:C:\js>java Array1
執行結果:
a[0] = 10
a[1] = 20
<一維陣列元素為參考資料型別範例>以2個元素為例
|
Number=40 |
|
Number=30 |
|
|
b[0] ↗ b[1] ↗
MyNumber1 |
MyNumber1 |
class MyNumber1 {
int number;
}
class Array2 {
public static void main(String[] args) {
MyNumber1[ ] b; //MyNumber1為自行設計之物件
b = new MyNumber1 [2]; //建立2個元素
b[0] = new MyNumber1 (); //物件陣列需以new對每一陣列元素
b[1] = new MyNumber1 (); //建立物件
b[0].number = 30;
b[1].number = 40;
System.out.println("b[0].number= "+b[0].number);
System.out.println("b[1].number= "+b[1].number);
}
}
執行結果:C:\js>java Array2
b[0].number= 30
b[1].number= 40
陣列可表現同類型(資料型別)資料
MyNumber1[ ] b ; MyNumber1 b;
b = new MyNumber1[2] ; MyNumber1 c;
b[0] = new MyNumber1() ; 可達相同功能 b = new MyNumber1( );
b[1] = new MyNumber1() ; ----------------à c = new MyNumber1( );
b[0].number = 30; b.number = 30;
b[1].number = 40; c.number = 40;
*資料項目較多時,以陣列方式較有效率。
*b[0]、b[1]存放MyNumber1物件之參考位址。
<使用{ }指定各陣列元素之值>
class Array3 {
public static void main (String[] args) {
int[] f = {10,20}; //指定方法一
int[] g;
g = new int[ ] {30,40}; //指定方法二
System.out.println("f[0] = "+f[0]);
System.out.println("f[1] = "+f[1]);
System.out.println("g[0] = "+g[0]);
System.out.println("g[1] = "+g[1]);
}
}
命令提示字元下輸入:C:\js>java Array3
執行結果:
f[0] = 10
f[1] = 20
g[0] = 30
g[1] = 40
[7-1-2多維陣列(Multidimensional Array)]
二維以上之陣列即稱為多維陣列。
二維陣列含多列、每列一到多個元素。
三維陣列含多層、多列、每列一到多個元素。
三維以上則極少使用,實作舉例至二維為止。
多維陣列分為對稱多維陣列及非對稱多維陣列。
[7-1-2-1對稱多維陣列(Rectangular Multidimensional Array)]
對稱多維陣列的各列元素個數相同。
宣告格式:資料型別[ ][ ][ ].... 陣列名稱 (三維)
例:int[ ][ ] a、int a[ ][ ][ ] (二維、三維)
宣告陣列各維長度:建立物件時指定,a = new int[3][9]時第二維長度為3,第一維長度為9,共有27個元素。陣列元素位址為00、01、02、.....、08;10、11、12、.....、18;20、21、22、.....、28,如下列二維矩陣:
對稱二維陣列例:int[3][9]
a[0][0] |
a[0][1] |
a[0][2] |
a[0][3] |
a[0][4] |
a[0][5] |
a[0][6] |
a[0][7] |
a[0][8] |
a[1][0] |
a[1][1] |
a[1][2] |
a[1][3] |
a[1][4] |
a[1][5] |
a[1][6] |
a[1][7] |
a[1][8] |
a[2][0] |
a[2][1] |
a[2][2] |
a[2][3] |
a[2][4] |
a[2][5] |
a[2][6] |
a[2][7] |
a[2][8] |
陣列元素值之指定方式:int[2] [3] a (對稱二維陣列2列3欄變數a)
個別指定:a[0][0]=10, a[0][1]=20, a[0][2]=30, a[1][0]=40,a[1][1]=50,a[1][2]=60;
宣告時集體指定:使用{ },int[ ][ ] a = {{10,20,30},{40,50,60}};第一個內層{}為第一列元素值,第二個內層{}為第二列元素值
建立物件時指定:使用{ },int[ ][ ] a; a = new int[ ][ ] {{10,20,30},{40,50,60}};
<對稱多維陣列元素為基本資料型別範例>
10 |
20 |
30 |
40 |
class Marray4 {
public static void main(String[] args) {
int[][] a; //基本型別int
a = new int[2][2]; //二維2*2陣列
a[0][0] = 10; //指定初值
a[0][1] = 20;
a[1][0] = 30;
a[1][1] = 40;
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[0][1] = "+a[0][1]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
}
}
命令提示字元下輸入:C:\js>java Marray4
執行結果:
a[0][0] = 10
a[0][1] = 20
a[1][0] = 30
a[1][1] = 40
<對稱多維陣列元素為參考資料型別範例>
b[0][0].n=50 |
b[0][1].n=60 |
b[1][0].n=70 |
b[1][1].n=80 |
↗
b[0][0] |
b[0][1] |
b[1][0] |
b[1][1] |
示意圖
class MyNumber2 { //對象類別
int n;
}
class Marray5 {
public static void main(String[] args) {
MyNumber2 [][] b; //宣告二維物件陣列b
b = new MyNumber2 [2][2]; //2*2元素
b[0][0] = new MyNumber2(); //建立元素物件
b[0][1] = new MyNumber2();
b[1][0] = new MyNumber2();
b[1][1] = new MyNumber2();
b[0][0].n = 50;
b[0][1].n = 60;
b[1][0].n = 70;
b[1][1].n = 80;
System.out.println("b[0][0].n = "+b[0][0].n);
System.out.println("b[0][1].n = "+b[0][1].n);
System.out.println("b[1][0].n = "+b[1][0].n);
System.out.println("b[1][1].n = "+b[1][1].n);
}
}
命令提示字元下輸入:C:\js>java Marray5
執行結果:
b[0][0].n = 50
b[0][1].n = 60
b[1][0].n = 70
b[1][1].n = 80
以{ }設定對稱多維陣列各元素之值(方式1):
10 |
20 |
30 |
40 |
class Marray61 {
public static void main (String[] args) {
int[][] a = {{10,20},{30,40}}; //宣告時給值
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[0][1] = "+a[0][1]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
}
}
命令提示字元下輸入:C:\js>java Marray61
執行結果:
a[0][0] = 10
a[0][1] = 20
a[1][0] = 30
a[1][1] = 40
以{ }設定對稱多維陣列各元素之值(方式2):
11 |
22 |
33 |
44 |
class Marray62 {
public static void main (String[] args) {
int[][] a ;
a = new int [2][2];
a[0] = new int[] {11,22}; //建立元素物件時給值
a[1] = new int[] {33,44};
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[0][1] = "+a[0][1]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
}
}
命令提示字元下輸入:C:\js>java Marray62
執行結果:
a[0][0] = 11
a[0][1] = 22
a[1][0] = 33
a[1][1] = 44
[7-1-2-2非對稱多維陣列(Non-Rectangular Multidimensional Array)]
非對稱多維陣列的各列元素個數不全然相同。
宣告格式:資料型別[ ][ ] 陣列名稱,例如int[ ][ ] a;
宣告陣列各維長度:建立物件時指定,第一個[ ]指定第二維長度,第二個[ ]為第一維長度,暫不指定元素個數,於建立物件(new)時分別指定。
例:指定第二維長度2:a=new int[2][ ]; 指定第一列2個元素a[0]=new int[2];
指定第二列3個元素a[1]=new int[3]
如下列非對稱二維陣列:
a[0][0]…..101 |
a[0][1]…..201 |
|
a[1][0]…..301 |
a[1][1]…..401 |
a[1][2]…..501 |
陣列元素值之指定方式:
個別指定:a[0][0]=101, a[0][1]=201, a[1][0]=301,a[1][1]=401,a[1][2]=501;
宣告時集體指定:使用{ },int[ ][ ] a = {{101,201},{301,401,501}};
建立物件時指定:使用{ },int[ ][ ] a; a[0] = new int[ ]{101,201};
a[1] = new int[ ]{301,401,501};
class Marray7 {
public static void main(String[] args) {
int[][] a;
a = new int[2][ ];
a[0] = new int[2];
a[1] = new int[3];
a[0][0] = 101;
a[0][1] = 201;
a[1][0] = 301;
a[1][1] = 401;
a[1][2] = 501;
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[0][1] = "+a[0][1]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
System.out.println("a[1][2] = "+a[1][2]); } }
命令提示字元下輸入:C:\js>java Marray7
執行結果:
a[0][0] = 101
a[0][1] = 201
a[1][0] = 301
a[1][1] = 401
a[1][2] = 501
以{ }設定各元素之值(方式1):
102 |
202 |
|
302 |
402 |
502 |
class Marray8 {
public static void main (String[] args) {
int[][] a = {{102,202},{302,402,502}};
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[0][1] = "+a[0][1]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
System.out.println("a[1][2] = "+a[1][2]); } }
命令提示字元下輸入:C:\js>java Marray8
執行結果:
a[0][0] = 102
a[0][1] = 202
a[1][0] = 302
a[1][1] = 402
a[1][2] = 502
以{ }設定各元素之值(方式2):
111 |
|
|
221 |
222 |
223 |
class Marray9 {
public static void main (String[] args) {
int[][] a;
a = new int[2][];
a[0] = new int[] {111};
a[1] = new int[] {221,222,223};
System.out.println("a[0][0] = "+a[0][0]);
System.out.println("a[1][0] = "+a[1][0]);
System.out.println("a[1][1] = "+a[1][1]);
System.out.println("a[1][2] = "+a[1][2]); } }
命令提示字元下輸入:C:\js>java Marray9
執行結果:
a[0][0] = 111
a[1][0] = 221
a[1][1] = 222
a[1][2] = 223
[7-2字串(String)]
以內建物件String為資料型態(Data Type),宣告字串變數。
String s = "abcd" ;
或使用new建立內建物件,產生包含指定字串之新物件。
String t = new String("abcd") ;
class String1 {
public static void main (String[] args) {
String s;
s = "abcd"; //或二行合併 String s = "abcd";
System.out.println("s = "+s);
String t;
t = new String("wxyz"); //或二行合併 String t = new String("wxyz");
System.out.println("t = "+t);
}
}
命令提示字元下輸入:C:\js>java String1
執行結果:
s = abcd
t = wxyz
註:Java八種基本資料型別包含char字元型別,不包含一個或多個字元組成的字串,字串屬Java內建的物件,其值的指定須包含在雙引號內。
[7-3建構物件]
為自行設計之類別物件,Java程式基本單位就是類別,實體化也就是要使用(存取)它時,必須建立物件。
class MyNumber8 {
int i;
}
class Obj2 {
public static void main(String[] args) {
int j;
j=3;
MyNumber8 a; //宣告參考資料型別MyNumber8之變數a
a = new MyNumber8(); //建立物件,a存放的是參考(位址)
a.i = 5; //指定5給a物件的i變數
System.out.println("j = "+j);
System.out.println("a.i = "+a.i);
}
}
命令提示字元下輸入:C:\js>java Obj2
執行結果:
j = 3
a.i = 5
有些範例看起來非常笨拙的樣子,但當您越學越多時,就可加以改善了!
後續章節會提出基本資料型別和參考資料型別不一樣的地方。
留言列表