成員函數(shù)的說(shuō)明和使用

字號(hào):

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