java 類基礎(轉)

ba發表於2007-08-15
java 類基礎(轉)[@more@]類是Java 的核心和本質。它是Java 語言的基礎,因為類定義了物件的本性。既然類是物件導向程式設計Java 語言的基礎,因此,你想要在Java 程式中實現的每一個概念都必須封裝在類以內。

因為類是Java 的基礎,所以在本章和以後幾章中對其進行介紹。本章將介紹類的基本元素,並學習如何運用類來建立物件。同時也將學習方法、建構函式及this 這個關鍵字。
從本書的開始我們就使用類了。當然,使用的都是非常簡單的類。在前面幾章中創造的類主要都包含在main( ) 方法中,用它來表明Java 句法的基礎。你將看到,類的功能實質上比你到目前為止看到的要強大得多。

也許理解類的最重要的事情就是它定義了一種新的資料型別。一旦定義後,就可以用這種新型別來建立該型別的物件。這樣,類就是物件的模板(template ),而物件就是類的一個例項(instance)。既然一個物件就是一個類的例項,所以你經常看到object 和instance 這兩個詞可以互換使用。

6.1.1 類的通用格式
當你定義一個類時,你要宣告它準確的格式和屬性。你可以透過指定它包含的資料和運算元據的程式碼來定義類。儘管非常簡單的類可能只包含程式碼或者只包含資料,但絕大多數實際的類都包含上述兩者。你將看到,類的程式碼定義了該類資料的介面。

使用關鍵字class來建立類。在這一點上,類實際上被限制在它的完全格式中。類可以(並且常常)是一個組合體。類定義的通用格式如下所示:

class classname {

type instance-variable1;

type instance-variable2;

// ...

type instance-variableN;

type methodname1(parameter-list) {

// body of method

}

type methodname2(parameter-list) {

// body of method

}

// ...

type methodnameN(parameter-list) {

// body of method
}
}

在類中,資料或變數被稱為例項變數(instance variables ),程式碼包含在方法(methods)內。定義在類中的方法和例項變數被稱為類的成員(members )。在大多數類中,例項變數被定義在該類中的方法操作和存取。這樣,方法決定該類中的資料如何使用。

定義在類中的變數被稱為例項變數,這是因為類中的每個例項(也就是類的每個物件) 都包含它自己對這些變數的複製。這樣,一個物件的資料是獨立的且是惟一的。關於這一點我們將馬上討論,但是這是一個重要的概念,因此要早一點學習。

所有的方法和我們到目前為止用過的方法main() 的形式一樣。但是,以後講到的方法將不僅僅是被指定為static或public 。注意類的通用格式中並沒有指定main() 方法。Java 類不需要main( ) 方法。main() 方法只是在定義您程式的起點時用到。而且,Java 小應用程式也不要求main( ) 方法。

注意:如果你有C++程式設計經驗請注意,類的宣告和方法的實現要儲存在同一個地方並且不能被單獨定義。由於所有類的定義必須全部定義在一個單個的原始檔中,這有時會生成很大的.java 檔案。在Java 中設計這個特徵是因為從長遠來說,在一個地方指明,定義以及實現將使程式碼更易於維護。

6.1.2 一個簡單的類
讓我們先從一個簡單的例子來開始對類的研究。下面定義了一個名為box 的類,它定義了3個例項變數:width,height 和depth 。當前,box類不包含任何方法(但是隨後將增加一些)。

class Box { double width; double height; double depth;

}

前面已經說過,一個類定義一個新的資料型別。在本例中,新的資料型別名為Box。你可以使用這個名字來宣告Box 型別的物件。記住類宣告只是建立一個模板(或型別描述),它並不會建立一個實際的物件。因此,上述程式碼不會生成任何Box 型別的物件實體。

要真正建立一個Box 物件,你必須使用下面的語句:

Box mybox = new Box(); // create a Box object called mybox

這個語句執行後,mybox 就是Box的一個例項了。因此,它將具有“物理的”真實性。現在,先不必考慮這個語句的一些細節問題。

每次你建立類的一個例項時,你是在建立一個物件,該物件包含它自己的由類定義的每個例項變數的複製。因此,每個Box物件都將包含它自己的例項變數複製,這些變數即width,height,和 depth 。要訪問這些變數,你要使用點號“.”運算子。點號運算子(dot operator)將物件名和成員名連線起來。例如,要將mybox 的width 變數賦值為100,使用下面的語句:

mybox.width = 100;
該語句告訴編譯器對mybox 物件內包含的width 變數複製的值賦為100 。通常情況下,你可以使用點號運算子來訪問一個物件內的例項變數和方法。下面是使用Box 類的完整程式:

/* A program that uses the Box class.

Call this file BoxDemo.java
*/
class Box {

double width; double height; double depth;

}

// This class declares an object of type Box.
class BoxDemo {

public static void main(String args[]) {
Box mybox = new Box();
double vol;

// assign values to mybox's instance variables
mybox.width = 10;
mybox.height = 20;
mybox.depth = 15;

// compute volume of box
vol = mybox.width * mybox.height * mybox.depth;

System.out.println("Volume is " + vol);
}
}

你應該把包含該程式的的檔案命名為BoxDemo.java,因為main( ) 方法在名為 BoxDemo 的類中,而不是名為Box 的類中。當你編譯這個程式時,你會發現生成了兩個“.class ”檔案,一個屬於box,另一個屬於BoxDemo 。Java 編譯器自動將每個類儲存在它自己的“ .class ”檔案中。沒有必要分別將Box 類和Boxdemo 類放在同一個原始檔中。你可以分別將它們放在各自的檔案中,並分別命名為Box.Java 和 BoxDemo.java 。

要執行這個程式,你必須執行BoxDemo.class 。執行該程式後,你會看見如下輸出:

Volume is 3000.0

前面已經講過,每個物件都含有它自己的、由它的類定義的例項變數的複製。因此,假設你有兩個Box物件,每個物件都有其自己的depth,width 和height 複製。改變一個物件的例項變數對另外一個物件的例項變數沒有任何影響,理解這一點是很重要的。例如,下面的程式定義了兩個Box 物件:

// This program declares two Box objects.

class Box { double width; double height;
double depth;
}

class BoxDemo2 {

public static void main(String args[]) {
Box mybox1 = new Box();
Box mybox2 = new Box();
double vol;

// assign values to mybox1's instance variables
mybox1.width = 10;
mybox1.height = 20;
mybox1.depth = 15;

/* assign different values to mybox2's

instance variables */
mybox2.width = 3;
mybox2.height = 6;
mybox2.depth = 9;

// compute volume of first box
vol = mybox1.width * mybox1.height * mybox1.depth;
System.out.println("Volume is " + vol);

// compute volume of second box
vol = mybox2.width * mybox2.height * mybox2.depth;
System.out.println("Volume is " + vol);

}
}

該程式產生的輸出如下所示:

Volume is 3000.0
Volume is 162.0

你可以看到,mybox1 的資料與mybox2 的資料完全分離。

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

相關文章