1:類的成員函數的說明
成員函數相當於C或C++中的函數。你應該用如下的方式說明一個成員函數:
Type name (Parameter)
//function body
注意:每一個成員函數必須返回一個值或聲明返回為空(void)。它返回類型的說明告訴編譯器它將返回什麼類型的值。在某些情況下,成員函數需要表示它是否成功的完成了它的工作,此時返回類型通常為布爾型的。參數表是用逗號分開的一組變量,它將為成員函數提供所需信息。
下面例子中定義了一個成員函數。通過它,你的矩形類可以計算自己的面積了:
int getArea(int w,int h)
{
int a;
a=w*h;
return a;
}
另外,矩形還需要對自己進行描繪,因此它需要成員函數drawRect(),此時,你的矩形類的定義將如下所示:
public class DrwRect
{
public static void main(String args[])
{
class Rectangle
{
int width,height,area;
public Rectangle(int w,int h)
{
width=w;
height=h;
area=getArea(w,h);
}
protected int getArea(int w,int h)
{
int a;
a=w*h;
return a;
}
public void drawRect()
{
int i,j;
for(i=width;i>0;i--)
System.out.print("#");
System.out.print("") ;
for(i=height-2;i>0;i--)
System.out.print("#");
for(j=width-2;i>0;j--)
System.out.print("");
System.out.print("#");
for(i=width;i>0;i--)
System.out.print("#");
System.out.print("");
}
} //Rectangle
int w=Integer.valueOf(args[0]).intValue();
int h=Integer.valueOf(args[1]).intValue();
Rectangle myrect=new Rectangle(w,h);
myrect.drawRect();
}
}
上例中最後一個“#”號後面還有一個System.out.print("")這是由於這個成員函數在上一行沒有結束而且緩沖區沒有溢出時將不把輸出結果寫屏。若你使用print成員函數,卻沒有得到輸出,這時仔細確認一下你是否以""來結束你的輸出流。
2:不同類型的成員函數
在上例的成員函數聲明中你需要注意兩點:getArea()定義為private型,drawRect()定義為public型。public型意味著任何類都可以調用它。private型,它只能被所聲明的類內部調用。這些說明類型同樣適用於數據變量。
若有人想改變一個私有變量,通常要引用下面的成員函數:
public void setWidth(int w)
{
width=w;
}
注意:在Java中,protected只是作為關鍵字出現,而沒有相應的功能。
3:成員函數的重載
假如你必須在不同情況下發送不同的信息給同一個成員函數的話,該怎麼辦呢?你可以通過對此成員函數說明多個版本(version)的方法來實現重載。重載的本質是創建了一個新的成員函數:你只需給它一個不同的參數列表(parameterlist),如下例所示:
void get Area(int w,int h);
void get Area(float w,float h);
在第二種情況下,成員函數get Area()接受兩個浮點變量作為它的參數,編譯器根據調用時的不同參數來決定該調用哪一種成員函數,假如你把兩個整數提供給成員函數,你就調用第一個成員函數;假如你把兩個浮點數提供給成員函數,第二個成員函數就被調用。
4:靜態成員
除了public、private和protected以外,你還可以把成員說明為static(靜態)。static修飾符表明一個變量或成員函數對所有類的實例都是相同的,你也許想使用一個所有Rectangle類都可以使用的變量,來說明該類的版本(version),假如你把它說明成一個static,那麼該變量將對該類的所有實例都是一樣的,如:
static int version=1;
靜態成員函數和靜態變量的優點就在於他們能在沒有創建類的任何一個實例的情況下被引用,引用時在“.”域前,可直接使用類名而無須使用對象名。例如,drawRect成員函數使用了System.out.println成員函數,但實際上你卻未曾創建一個某個System類的對象,這正是因為out是System類的一個靜態變量,所以你可以直接使用這個成員函數而無須定義一個System對象。
5:構造和析構成員函數
類有一個特殊的成員函數叫做構造成員函數,它通常用於初始化類的數據成員。在創建對象時,會自動調用類的構造成員函數。Java中的構造成員函數必須與該類具有相同的名字,另外,構造成員函數一般都應用public類型來說明,這樣才能在程序任意的位置創建類的實例--對象。
下面是一個Rectangle類的構造成員函數,它帶有兩個參數,分別表示矩形的長和寬:
public Rectangle(int w,int h)
{
width=w;
height=h;
area=getArea(w,h);
}
除了構造成員函數以外,類還提供了析構成員函數,當對象被從內存中刪除時,該成員函數將會被自動調用。通常,在析構成員函數內,你可以填寫用來回收對象內部的動態空間的代碼。