物件導向程式設計:Java複雜資料型別用法(轉)

BSDLite發表於2007-08-16
物件導向程式設計:Java複雜資料型別用法(轉)[@more@]在這篇文章中,我們將討論Java語言中的複雜資料型別。其內容涉及到初始化過程、預設初值和某些針對複雜資料型別的操作。

索引

同簡單資料型別的定義一樣,Java虛擬機器(JVM)還定義了索引(reference)這種資料型別。索引型別可以“引用”變數,由於Java沒有明確地定義指標型別,所以索引型別可以被認為就是指向實際值或者指向變數所代表的實際值的指標。一個物件可以被多於一個以上的索引所“指”。JVM從不直接對物件定址而是操作物件的索引。

索引型別分成三種,它們是:類(class)、介面(interface)和陣列(array)。索引型別可以引用動態建立的類例項、普通例項和陣列。索引還可以包含特殊的值,這就是null 索引。null 索引在執行時上並沒有對應的型別,但它可以被轉換為任何型別。索引型別的預設值就是null。



類(Class)指的是定義方法和資料的資料型別。從內部來看,JVM通常把class型別物件實現為指向方法和資料的一套指標。定義class型別的變數只能引用類的例項或者null ,如以下程式碼所示:

MyObject
anObject = new MyObject();
// 合法MyObject
anotherObject = null;
// 合法MyObject
stillAnotherObject = 0;
// 非法


介面

介面(interface)好比一種模版,這種模版定義了物件必須實現的方法,其目的就是讓這些方法可以作為介面例項被引用。介面不能被例項化。類可以實現多個介面並且透過這些實現的介面被索引。介面變數只能索引實現該介面的類的例項。比方說,假設我們定義了一個介面,名字是Comparable ,同時還定義了一個類SortItem,這個類實現了介面Comparable,那麼我們可以編寫以下的定義程式碼:
Comparable c = new SortItem();

假如Comparable 介面定義了一個方法: public void compare(Comparable item), 那麼SortItem 類就必須提供compare 方法的實現,如以下程式碼所示:

public class SortItem implements Comparable{
public void compare(Comparable item)
{
...method implementation here
}}

陣列

Java陣列(array)是動態建立的索引物件,這一點和類非常相似,此外,同類一樣,陣列只能索引陣列的例項或者null ,如以下程式碼所示:

int[] myIntArray = new int[5];int[] anotherIntArray = null;


陣列是Object類的繼承,這樣,Object類的所有方法都可以被陣列呼叫。陣列物件由元素組成。元素的數目也可以為0,在這種情況下稱做陣列為空。所有的陣列都是從0開始對元素編號的,這意味著陣列內的第1個元素的索引編號是數字0。所有對陣列元素的訪問都會在執行時上接受檢查,如果試圖使用編號小於0或者大於陣列長度來索引元素就會產生ArrayIndexOutOfBoundsException異常並被扔出。

陣列的元素按整型值索引,如以下程式碼所示:

int[] myIntArray = { 9, 5, 6 };int int1 = myIntArray[0];int int2 = myIntArray[1];int int3 = myIntArray[2];

陣列物件的長度是不變的。為了改變陣列變數的長度,你必須建立另一個陣列並賦給變數,如以下程式碼所示:

int[] myIntArray = { 9, 5, 6 };System.out.println("myIntArray length = " +myIntArray.length); // 輸出結果是3myIntArray = new int[] { 3, 6, 4, 2, 8 };System.out.println("myIntArray length = " +myIntArray.length); // 輸出結果是5

複合資料型別

Java語言不支援結構(struct)或聯合(union)資料型別。它的複合資料型別是透過類或者介面來構造的,類提供了捆綁資料和方法的方式,同時可以限制對類的私有資料的訪問。比如說,如果用C語言,那麼汽車(car)就可以如下程式碼所示用結構來定義:

struct Car
{
char*
model;
char*
make;
int
year;
Engine*
engine;
Body*
body;
Tire**
tires;
}

以上的示範程式碼還隱含採用了先前定義的引擎(Engine)、車身(Body)和輪胎(Tire)結構。而採用Java語言,汽車的定義如清單A所示。

以上的示例還假設我們以前都已經定義過CarModels和CarMakes介面以及Engine、Body、Tire、DurangoEngine、DurangoBody和GoodyearTire類。

複合資料型別的初始化

複合資料型別由構造器內定義的程式碼實現初始化,構造器在類的建立函式(比如“new”之類)應用到類變數的時候被呼叫。構造器被呼叫之前,類的各個成員被初始化為各自的預設值或者顯式賦予的初值。清單B 中的程式程式碼對以上過程進行了解釋。

在清單B的程式碼中,當myClass 的例項用new 運算子建立時,構造器public MyClass()即被呼叫促使類對自身初始化。初始化的過程如下所示:

宣告“int myInt;”給myInt賦預設值0。
宣告“AnotherClass anotherClass;”給anotherClass分配預設值null。
構造器內的宣告“myint = 2;”給myInt賦值為2。
預定義複合資料型別

Java語言包含了大量的預定義複合資料型別。其中之一的String 類屬於java.lang 包。String 類提供的方法執行常用的字串操作,比如length()、 substring(int beginIndex)、toUpperCase()、toLowerCase()、equals() 等等。另一種常用的Java複合資料型別是Vector 類,它屬於java.util 包。Vector 類定義的方法執行可擴充套件物件陣列的常用操作。比如add(int index, Object element)、elementAt(int index)、isEmpty()和remove(int index)等。這些就是一小部分預定義複合資料型別的代表示例。在以後的文章裡我們還會進一步對預定義複合資料型別進行討論。

小結

除了簡單資料型別之外,Java語言中還定義了本文所討論三種索引資料型別。Java還執行開發人員自己用簡單和索引資料型別組合起來建立複合資料型別。使用者定義的組合資料型別和Java預定義複合資料型別一道為程式設計師提供了強大的物件導向工具包。在接下來的文章裡,我們會進一步詳細地討論大多數常用的複雜資料型別及其可用操作。我們會首先從Java所特有的集合框架講起。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-962339/,如需轉載,請註明出處,否則將追究法律責任。

相關文章