7     參考資料型別(Reference Types)

參考資料型別(Reference Types)包含三類:內建物件之陣列(矩陣)、字串,與自行設計之建構物件(含類別及介面)。內建物件為跟隨Java語言提供之功能,不必另行開發。這三種變數的值存放的是參考而非實值,也就是存放指向物件的位址。

陣列是本章節的重點,字串及自行設計之類別物件則大部份分散於各章節說明,在此僅稍作說明。

 

[7-1陣列(Array)]

陣列是同類型資料的集合,陣列可有一維陣列及二維以上的多維陣列。陣列變數本身為參考資料型別,其元素值可為基本資料型別或參考資料型別(物件)

陣列變數因屬參考型別,其變數(欄位)值存放的是參考值(位址)。而陣列元素可為基本資料型別參考資料型別,基本資料型別的陣列之每個元素存放的是實值,參考資料型別的陣列之每個元素都是物件,存放的是參考值(位址),參考值再指向實值。以下圖(7-1a、b)表示較為清楚。

 

 圖7-1a

 

圖7-1b

                       

                       

                        

 

<陣列的維度>

陣列常見為一維及二維,三維較少使用,四維以上理論上可至無窮盡的維度。一維就是平常所說的直線,二維為平面,三維為三度立體空間,四維以上較難想像。下面就以一列排成一直線的箱子代表一維陣列,多列排成一個平面的箱子代表二維陣列,多層平面的箱子排成立體狀代表三維陣列,一個箱子代表一個陣列元素,陣列元素雖可為基本資料型別,或是參考資料型別,但同屬一個陣列時,必須屬於同一資料型別。往後的陣列說明則以表格的方式呈現。

 

圖7-2

 

圖7-3

 

圖7-4

 

如果以一個學校三個年級的學生國文成績舉例如下(使用表格方式):

 

<一維陣列例示說明>

存放一個班級的國文分數(整數)時,假設有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

 位址位址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-5

<陣列維度指定方式>

一維陣列:陣列變數資料型別[第一維長度]

二維陣列:陣列變數資料型別[第二維長度][第一維長度]

三維陣列:陣列變數資料型別[第三維長度][第二維長度][第一維長度]

還有其他之指定方式見後述。

 

 

[7-1-1一維陣列]

一維陣列含一列一到多個元素。

宣告格式:資料型別[ ]  陣列名稱、資料型別 陣列名稱[ ]

資料型別  [ ]陣列名稱等,普遍採用- 資料型別[ ]  陣列名稱。

例:整數型別陣列-int[ ] aint a[ ]int [ ]a

        參考型別陣列-B[ ] bB b[ ]B [ ]bB為類別。

宣告陣列長度(元素個數)建立物件時指定,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[ ][ ] aint a[ ][ ][ ] (二維、三維)

宣告陣列各維長度:建立物件時指定,a = new int[3][9]時第二維長度為3,第一維長度為9,共有27個元素。陣列元素位址為000102.....08101112.....18202122.....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 (對稱二維陣列23欄變數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)時分別指定。

例:指定第二維長度2a=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;   //指定5a物件的i變數

 

      System.out.println("j = "+j);

      System.out.println("a.i = "+a.i);

}

}

命令提示字元下輸入C:\js>java Obj2

執行結果:

j = 3

a.i = 5

 

有些範例看起來非常笨拙的樣子,但當您越學越多時,就可加以改善了!

後續章節會提出基本資料型別和參考資料型別不一樣的地方。

 

arrow
arrow

    祈泊 發表在 痞客邦 留言(0) 人氣()