版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第4章面向?qū)ο缶幊碳夹g(shù)面向?qū)ο蟮某绦蛟O(shè)計方法是當(dāng)前程序設(shè)計的人勢所趨。面向?qū)ο蟮某绦蛟O(shè)計方法是對結(jié) 構(gòu)化程序設(shè)計方法的重新認識。在程序的設(shè)計中,方法總是與特定的數(shù)據(jù)結(jié)構(gòu)密切相關(guān)的, 方法含有對數(shù)據(jù)結(jié)構(gòu)的訪問,特定的方法只適用丁特定的數(shù)據(jù)結(jié)構(gòu),因此方法與數(shù)據(jù)結(jié)構(gòu)在 編程中應(yīng)該是一個密不可分的整體,這個整體叫對彖。c#通過類、對象、繼承、多態(tài)等機制形成一個完善的而向?qū)ο蟮木幊腆w系。4. 1類和對象類是c#程序設(shè)計的基本單位。4.1.1類和對象概述現(xiàn)實生活中的類是人們対客觀対象不斷認識而產(chǎn)生的抽象的概念,而対象則是現(xiàn)實?;?小的一個個實體。例如,人們在現(xiàn)實生活小接觸了人量的汽車、摩托車、h行車等實體
2、,從 而產(chǎn)牛了交通工具的概念,交通工具就是一個類,而現(xiàn)實牛活中的具體的汽車、摩托車白行 車等則是該類的對象。面向?qū)ο蟪绦蛟O(shè)計的類從本質(zhì)上和人們現(xiàn)實生活中的這一認識過程是相同的。例如在編 程實踐中,人們經(jīng)常使用按鈕這一控件,每一個具體的按鈕是一個按鈕對彖,而按鈕類則是 按鈕對象的抽象,并且人們把這一抽象用計算機編程語言表示為數(shù)據(jù)集合與方法集合的統(tǒng)一 體,然后再用這個類創(chuàng)建一個個具體的按鈕對象??梢园杨惐茸饕环N藍圖,而對象則是根據(jù)藍圖所創(chuàng)建的實例,可以把類比作牛產(chǎn)模具, 而対象則是由這種模具產(chǎn)生的實例(產(chǎn)品)。所以人們乂把對象叫做類的實例。類是対事物的 定義,而對象則是該事物本身。在visual
3、studio.net集成環(huán)境屮的,工具箱中的一個個控件,是被圖形文字化的可視的 類,而把這些控件添加到窗體設(shè)計器中后,窗體設(shè)計器中的控件則是對彖,即由工具箱中的 類創(chuàng)建的對象。類是一種數(shù)據(jù)類型,在c#屮,類這種數(shù)據(jù)類型可以分為兩種:一種是由系統(tǒng)提供的預(yù)先 定義的,這些類在.net框架類庫中;一種是用戶定義數(shù)據(jù)類型。在創(chuàng)建對象之前必須先定義 該對彖所屬的類。然后由類聲明對彖。類本質(zhì)上是一種數(shù)據(jù)類型,所以類的川法與棊本數(shù)據(jù)類型的用法基木相同,事實上,在 visual studio.net中像int、float等棊本數(shù)據(jù)類型也是特殊的類。那么,用棊本數(shù)據(jù)類型可以 聲明變量,用類類型也可以聲明變量,只
4、不過類類型的變量叫類的対象或類的實例。4.1.2類定義類定義的格式與結(jié)構(gòu)定義的格式相似,在類定義中需要使用關(guān)鍵字class,其簡單的定義 格式為:class類名類體“類名”是一個合法的c#標(biāo)識符,表示數(shù)據(jù)類型(類類型)名稱,“類體”以一對大括 號開始和結(jié)束,在一對大括號后而可以跟一個分號。例如:class student 類名為 studentpublic string id;public string name;public bool sex;上例中,定義了一個名為“student” (學(xué)生)的類,類體中包括學(xué)生的學(xué)號(“id”)、姓 名(“name”)與性別(“sex”)。在上例的“類體”
5、中聲明的數(shù)據(jù)都使用“public”修飾,“public” (公共的)表示這些數(shù) 據(jù)可以直接進行訪問。如果僅從“student”類的定義形式看,其與結(jié)構(gòu)類型除了關(guān)鍵字外幾乎沒冇任何差別。 當(dāng)然這只是為了說明問題方便,這種定義方式并不符合面向?qū)ο蟪绦蛟O(shè)計的原則,因為類中 缺少了對數(shù)據(jù)的操作。“類體”包括類屮的所有數(shù)據(jù)及對數(shù)據(jù)的操作,面向?qū)ο蟪绦蛟O(shè)計將數(shù)據(jù)與對數(shù)據(jù)的操 作作為一個整體,以類的形式進行定義,這種機制叫“封裝”。在“類體”中,所冇的數(shù)據(jù)及對數(shù)據(jù)的操作的集合叫類成員,類成員的種類很多,本章 僅介紹“字段”、“屬性”、“方法”與“構(gòu)造函數(shù)”?!白侄巍笔穷惗x中的數(shù)據(jù),也叫類的變量。在上例中定
6、義的“id”、“name”與“sex” 等均為類中的字段?!皩傩浴庇糜谧x取和寫入“字段”值,“屈性”是字段的自然擴展,對用戶而言,“屬性” 等同于“字段”木身,對程序員而言,屬性是一種讀寫“字段”的特殊方法。“方法”實質(zhì)上就是函數(shù),用于對字段進行計算和操作,即對類中的數(shù)據(jù)進行操作,以 實現(xiàn)特定的功能。4.1.3聲明與使用對象定義類之后,可以用定義的類聲明對象,聲明對象后可以訪問對象成員。每一個類對象 均貝有該類定義中的所有成員,正如每一個整型變量均可以表示同樣的數(shù)值范圍一樣。1. 聲明對象聲明對彖的格式與聲明基本數(shù)據(jù)類型的格式相同:類名對象名;例如:student s1;聲明一個學(xué)生類對象s1
7、但是,對象聲明后,需用“new”關(guān)鍵字進行初始化,這樣才能為對象在內(nèi)存中分配保 存數(shù)據(jù)的空間。初始化的格式:對象名=new類名();例如:sl=ncw studcnt(); 為s1分配內(nèi)存空間可以將聲明與初始化對象合二為一,例如:student sl=new student();聲明對彖并初始化2. 訪問對象訪問對象實質(zhì)是訪問對象成員,對對象變量成員的訪問與結(jié)構(gòu)變量相同,使用運算 符。例如:s1.id 二 t2345"sl.name="張三”;si. sex=true;上面的代碼為對彖s1數(shù)據(jù)成員賦值??梢允褂脤ο笞兞繛榱硪粚ο笞兞空w賦值,例如,“ student s2;
8、s2s1; ”或astudent s2= s1;”。這時,不需要使用new關(guān)鍵字對“s2”初始化。可以使用對象中的某一成員。例如:string sname=sl.name; 將對彖s1的name成員值賦給字符串變量sname4.1.4值類型與引用類型類定義的類型與結(jié)構(gòu)定義的類型雖然相似,但這兩種類型卻有很大的差別,這涉及到c# 中變量存儲方式的問題。從變量的存儲方式看,c#屮的變量可以分為值類型變量與引用類型變量。1. 值類型值類型變量直接包含其木身的數(shù)據(jù),因此每個值類型變量木身就包含冇賦給它的值。在c#中,內(nèi)置數(shù)據(jù)類型除了字符串(string)類型與對象(object)類型外其余均為值類 型
9、。枚舉類型與結(jié)構(gòu)類型也是值類型。例如“intx=42;”,整型變量x就是值類型。2. 引用類型與值類型不同,引用類型變量不包含本身的數(shù)據(jù),只是存儲對數(shù)據(jù)的引用,數(shù)據(jù)保存在 內(nèi)存的其他位置。例如:using system;class classiclass testpublic int a;int x=42,y=x;test tl=new test();t1.a=42;tcstt2=tl;y=100;t2.a=100;)引用類型與值類型在內(nèi)存中的存儲形式如圖4-1所示。值類型變量可以使用變暈來賦值,引用類型變呈也可以使用變錄來賦值。例如上例屮的 代碼:int x=42,y=x;test tl=n
10、ew test();t1.a=42;test t2=t1; 使川對象變量賦值從圖中可以看到,用變量“x”為變量“y”賦值,是將“x”所在內(nèi)存中的值復(fù)制給了 “y”;而用變量“t1”為“t2”賦值,則是將“t1”對數(shù)據(jù)的引用復(fù)制給了 “t2”,即兩個 對象變呆使用的是同一內(nèi)存屮的數(shù)據(jù),也就是說,用“t1”為“t2”賦值不需要使用new關(guān) 鍵字對對象初始化,也就沒冇為對彖“t2”分配存儲數(shù)據(jù)的內(nèi)存空間。這樣,在改變變量值 時,將發(fā)生木質(zhì)差別。例如上例中的代碼:y=100;/y的值為100, x的值仍是424.1.5訪問控制在上血類定義的例子中,聲明類的數(shù)據(jù)成員(字段)時,均使用public進行修飾
11、,public 叫訪問修飾符。聲明類中的成員時,使用不同的訪問修飾符,表示對類成員的訪問權(quán)限不同, 或者說訪問修飾符確定了在什么范圍可以訪問類成員。c#中敲常用的訪問修飾符及其意義,如表41所示。表41訪問修飾符訪問修飾符意義public (公有)訪問不受限制,可以被任何其他類訪問private (私有訪問只限于含該成員的類,即只有該類的其他成員能訪問protected (保護)訪問只限于含該成員的類、及該類的派生類在類定義中,如果聲明成員沒冇使用任何訪問修飾符,則該成員被認為是私冇(private)的。如果不涉及繼承,private少protected沒有什么區(qū)別。在類定義中,如果成員被聲明
12、為private或protected,則不允許在類定義外使用點運算符 訪問,即在類定義外,點運算符只能訪問public成員。例如在下面的類定義中:class student/類名為 studentiprivate string id; 私有public string name; 公冇 protected bool sex; /保護)student s1 =ncw studcnt();s1.id=12345;非法,id 為 privatesl.name="張三"; 合法,name 為 public sl.scx=truc;非法,sex 為 protected在類定義外使用點運
13、算符訪問“id”與“sex”是非法的,而訪問“name”則是合法的, 因為 “id” 與 “sex” 是 private 或 protected 的,而"name” 則是 public 的。通常,在類定義中,數(shù)據(jù)成員(字段)被聲明為private或protected,從而實現(xiàn)所謂的數(shù) 據(jù)隱藏,以確保不能在類外隨意訪問類的數(shù)據(jù)成員;而其他種類的成員則被聲明為public, 以通過這些成員實現(xiàn)對類的數(shù)據(jù)成員的訪問。4.2屬性對私有或保護數(shù)據(jù)成員常見的訪問是讀取耳設(shè)置修改數(shù)據(jù)值,在類定義外部,這種訪問 可通過加性成員實現(xiàn)。通過屬性可以控制對數(shù)據(jù)的訪問方式,甚至設(shè)置數(shù)據(jù)可接受的值域。4.2.
14、1蘆明屬性在類定義屮聲明局性的格式為:訪問修飾符類型屬性名 可以將屬性聲明為讀寫m性、只讀屬性或只寫丿瓜性。1.聲明讀寫屬性修改student類定義添加屬性聲明:class student 類名為 student聲明字段private string id;private string name;private bool sex;聲明屬性public string idgetreturn id;)setid=valuc;1public string namegetreturn name;setname=value;)1public bool sexgetreturn sex;sex=value;
15、在屬性聲明中,get與set叫屬性訪問器。get完成對數(shù)據(jù)值的讀取,return川于返回讀取 的值;set完成對數(shù)據(jù)值的設(shè)置修改,value是一個關(guān)鍵字,表示要寫入數(shù)據(jù)成員的值。屬性名應(yīng)和其要訪問的數(shù)據(jù)成員名和關(guān)但不相同,可以采取數(shù)據(jù)成員名全用小寫,而屬 性名的單詞首字母人寫的方式,如數(shù)據(jù)成員名為name,則對應(yīng)的局性名為name。2.聲明只讀或只寫屬性在屬性聲明中,如果只冇get訪問器,則該屬性為只讀屬性。例如:public bool sexgetreturn sex;)只讀屬性意味著,數(shù)據(jù)成員的值是不能被修改的。在屬性蘆明中如果只有set訪問器,則該屬性為只寫屬性。只寫屬性在程序設(shè)計中不常
16、 使用。421使用屬性屬性成員的使用就如同公有數(shù)據(jù)成員的使用一樣??梢詾榭蓪懙膶傩再x值,可以用可讀 的屬性為其他變量賦值。以student類為例:student s1 =new student();用屬性設(shè)宣修改數(shù)據(jù)成員值s1.id= 12345;si.name 二”張三“;sl.sex=true;用屬性讀取數(shù)據(jù)成員值為其他變量賦值bool ssex=sl. sex;如果屬性為只讀的,則屬性不能出現(xiàn)在賦值運算符的左邊。在c#程序設(shè)計屮,窗體與控件的屬性就是這類成員,其屮在屬性窗口顯示的屬性,均為 可讀寫屬性,窗體與控件的只讀屬性只能在代碼中使用。4.3方法方法是把一些相關(guān)的語句組織在一起,用于
17、解決某一特定問題的語句塊。方法必須放在 類定義中。方法同樣遵循先聲明后使用的規(guī)則。4.3.1聲明與調(diào)用方法方法的使用分聲明與調(diào)用兩個環(huán)節(jié)。1.聲明方法聲明方法最常用的格式:訪問修飾符返回類型方法名(參數(shù)列表)方法的訪問修飾符通常是public,以保證在類定義外部能夠調(diào)用該方法。方法的返回類型用于指定由該方法計算和返回的值的類型,可以是任何值類型或引用類 型數(shù)據(jù),如,int、string及前面定義的student類。如果方法不返回一個值,則它的返回類型 為 voido方法名是一個合法的c#標(biāo)識符。參數(shù)列表在一對圓括號小,指定調(diào)用該方法時需要使用的參數(shù)個數(shù)、各個參數(shù)的類型, 參數(shù)z間以逗號分隔。參
18、數(shù)可以是任何類型的變量。如果方法在調(diào)用時不需要參數(shù),則不用 指定參數(shù),但圓括號不能省。實現(xiàn)特定功能的語句塊放在一對大括號中,叫方法體,“”表示方法體的開始,“”表 示方法體的結(jié)束。如果方法有返回值,則方法體中必須包含一個return語句,以指定返回值,該值對以是 變量、常量、表達式,其類型必須和方法的返回類型相同。如果方法無返回值,在方法體屮 可以不包含return語句,或包含一個不指定任何值的return語句。例如下面的方法聲明:public int intmax(int a,int b)int c;if(a>b)c=a;elsec=b;return c;)該方法的功能是求兩個整數(shù)中較
19、大的整數(shù),并將該整數(shù)返冋。該方法的返冋類型是一個 整型值,方法名稱為“intmax”,參數(shù)列表中有兩個整型變量參數(shù)“a”少“b”,方法體屮有 一個似uo1語句,該語句指定的返回值是一個整型變量c。該方法體中的語句塊也可以用條 件表達式合并為一句:“return a>b?a:b;”。這時,return指定的返冋值是一個條件表達式,return 語句把該表達式運算的結(jié)果返回。2.調(diào)用方法從方法被調(diào)川的位置,可以分為在方法聲明的類定義中調(diào)用該方法和在方法聲明的類定 義外部調(diào)用方法。在方法聲明的類定義屮調(diào)用該方法的格式為:方法名(參數(shù)列表)在方法聲明的類定義屮調(diào)用該方法,實際上是由類定義內(nèi)部的其
20、他方法成員調(diào)用該方法。 例如在類定義內(nèi)部調(diào)用求較大整數(shù)函數(shù):class classmaxpublic int getmax(int a,int b)/其他方法成員return inlmax(a,b);在類定義 classmax 內(nèi)部調(diào)用方法 inimax)public int intmax(int a,int b)求較人整數(shù)函數(shù)return a>b?a:b;)在方法聲明的類定義外部調(diào)用該方法實際上是通過類聲明的對彖調(diào)用該方法,其格式為: 對象名方法名(參數(shù)列表)【例4-1】創(chuàng)建一個控制臺應(yīng)用程序,并創(chuàng)建一個類,該類僅包含求兩個數(shù)屮較人數(shù)的 方法成員,在main方法中調(diào)用該方法。using
21、 system;class classiclass classmax 定義一個類public int lntmax(int a, int b)return a>b?a:b;11static void main(string args)int x=42,y;y=100;classmax classmax二new classmax();聲明一個對彖int c二classmax.intmax(x,y);調(diào)用對象方法console.wnte(n較大的值為:j;console. writeline(c);consolc.rcadlinc();程序運行的結(jié)果為:較大的值為:1004.3.2參數(shù)傳遞在
22、方法的聲明與調(diào)用中,經(jīng)常涉及方法參數(shù),在方法聲明中使用的參數(shù)叫形式參數(shù)(形 參),在調(diào)用方法中使用的參數(shù)叫實際參數(shù)(實參)。在調(diào)用方法時,參數(shù)傳遞就是將實參傳 遞給形參的過程。以【例41】為例,聲明方法時的形參如下:public int intmax(int aunt b)調(diào)用方法時的實參如下:classmax.intmax(x,y)這樣就完成了形參與實參的結(jié)合,英傳遞關(guān)系如圖4-3所示。方法調(diào)用:classmax.lntmax(x,y)ii方法聲明:public int intmax(int a, int b)圖4-3形參與實參方法參數(shù)傳遞按性質(zhì)可分為按值傳遞與按引用傳遞。1.按值傳遞參數(shù)按
23、值的方式傳遞是指當(dāng)把實參傳遞給形參時,是把實參的值復(fù)制(拷貝)給形參, 實參和形參使用的是兩個不同內(nèi)存屮的值,所以這種參數(shù)傳遞方式的特點是形參的值發(fā)牛改 變時,不會影響實參的值,從而保證了實參數(shù)據(jù)的安全。按值傳遞如圖4-4所示。實參傳遞形參圖4-4按值傳遞示意基木類型的參數(shù)在傳遞時默認為按值傳遞。2.按引用傳遞方法只能返回一個值,但實際應(yīng)用中常常甜要方法能夠修改或返回多個值,這時只靠 return語句顯然是無能為力的。如果需要方法返回多個值,使用按引用傳遞參數(shù)的方式可以 實現(xiàn)這種效果。按引用傳遞是指實參傳遞給形參時,不是將實參的值復(fù)制給形參,而是將實參的引用傳 遞給形參,實參與形使用的是一個內(nèi)
24、存屮的值。這種參數(shù)傳遞方式的特點是形參的值發(fā)牛改變時,同時也改變實參的值。實參圖46類對象按引丿ij傳遞示意傳遞形參按引用傳遞分基木數(shù)據(jù)類型與類對彖數(shù)據(jù)類型兩種情況,其傳遞如圖45與圖46所示。圖4-5基本類型按引川傳遞示憊基木類型參數(shù)按引用傳遞時,形參實際上是實參的別名?;绢愋蛥?shù)按引用傳遞時, 實參與形參前均須使用關(guān)鍵字refo【例42】編寫一個控制臺應(yīng)用程序,在程序中添加一個交換兩個整型變量值的方法。 調(diào)用該方法將兩個整型變量的值進行交換并輸出交換前后的結(jié)果。using system; namespace數(shù)值交換 class classipublic void swap(ref int
25、 a,ref int b) 形參 a. b 為引用類型 數(shù)值交換int c=a;a=b;static void main(stringj args)int a=60,b=80;console.writeline(m交換前 a、b 的值:0), 1”,a,b);classi c=new class 1();c.swap(ref a,refb);以引用方式傳遞實參a、bconsole.writeline(m交換后 a、b 的值:0), 1”,a,b);console.readline();程序運行結(jié)果:交換前a、b的值:60, 80交換后a、b的值:80, 60 因為在swap方法小,對引用形參a
26、、b的值的修改,就是對實參a、b的值的修改,所 以方法swap成功地完成了對a、b數(shù)據(jù)的交換功能,相當(dāng)于返回了兩個值,這在按值傳遞的方式下是無法實現(xiàn)的。類對象參數(shù)總是按引川傳遞的,所以類對彖參數(shù)傳遞不需要使川ref關(guān)鍵字。類對彖參 數(shù)的傳遞,實際上是將實參對數(shù)據(jù)的引用復(fù)制給了形參,所以形參與實參共同指向同一個內(nèi) 存區(qū)域。【例4-3】編寫一個控制臺應(yīng)用程序,該程序項目名稱為“類對象參數(shù)”,程序中有兩個 類定義,一個是創(chuàng)建程序吋系統(tǒng)口動創(chuàng)建的類class 1,一個是用戶口定義的student類。在class 1 類中聲明一個方法,該方法以student類對象為參數(shù)。在class 1類中的main方
27、法中調(diào)用該方 法。using system;namespace類對彖參數(shù)class student/類名為 student聲明字段private string id;private string name;private bool sex;聲明屬性 public string id igetreturn id;)setiid=valuc;public string namegetreturn name;setname=value;)public bool sexreturn sex;setsex=value;class classipublic void studentfl(student s
28、ti)以對象 sti 為形參修改形參數(shù)據(jù)成員的值st1id="56789”;stl.name=”張三”;stl.sex=true;static void main(string args)string ssex;student si; 聲明一個學(xué)生類對象sis1 =new student(); 為s1分配內(nèi)存空間s1.id=" 12345"si.name 二"李平";sl.sex=false;if (s1 .sex=true)ssex="男“;elsessex="女";console.writeline(h 學(xué)生學(xué)
29、號:”+s1 .id+" 姓名:”+s1 .name +”性別:”+ssex); 輸出對象si的值classi c=new class 1(); 聲明對彖 c 以調(diào)用方法 studentfl c.sludentfl(sl);以對象si為實參調(diào)用方法if (sl.sex=true)ssex="男";elsessex="女”;console.writeline(m 學(xué)生學(xué)號:”+s 1.id+" 姓名:”+s l.name +"性別:”+ssex); 輸出對象s1的值console.readline();程序運行結(jié)果:學(xué)生學(xué)號:12345
30、姓名:李平性別:女學(xué)生學(xué)號:56789姓名:張三性別:男結(jié)果的笫一行為調(diào)用方法前對象s1的值,結(jié)果的第二行為調(diào)用方法后對彖s1的值。雖 然在main方法中并未對對彖s1進行修改,但由于調(diào)用方法studentfl時,將s1傳遞給了 st1,而類對象參數(shù)是按引用傳遞的,所以在方法studentfl中對st1的修改,就是對s1的 修改,因此,結(jié)果的第二行,s1的值發(fā)生了變化。4.3.3重載方法有時候方法實現(xiàn)的功能需要針對多種類型的數(shù)據(jù),雖然c#有隱式轉(zhuǎn)換功能,但這種轉(zhuǎn)換 在有些悄況下會導(dǎo)致運算結(jié)果的錯謀,而有時數(shù)據(jù)類型無法實現(xiàn)隱式轉(zhuǎn)換共至根木無法轉(zhuǎn)換。 例如:using system;class c
31、lassi(public void swap(rcf int a,ref int b)int c=a;a=b;b=c;static void main(string args)int a=60,b=80;consoie-writelinec"交換前 a、b 的值:(), 1“,a,b);classi c=new classic );c.swap(ref a,ref b);調(diào)用交換值方法consoie-writelinec"交換后 a、b 的值:(), 1“,a,b);console.rea(jline();上例中的交換方法只能實現(xiàn)兩個整型變量的值交換,無法通過隱式或顯式轉(zhuǎn)換
32、來實現(xiàn)其 他類型變量的值交換。例如在上例的主方法中添加如下代碼:float fa=5.2f,fb=6.0f;c.swap(ref fa,ref fb);運行程序時,將出現(xiàn)“無法從'reffloat'轉(zhuǎn)換為'refint'”的編譯錯誤。為了能使同一功能適用于各種類型的數(shù)據(jù),c#提供了方法重載機制。方法重載是聲明兩個以上的同名方法,實現(xiàn)對不同數(shù)據(jù)類型的相同處理。方法重載有兩點耍求:(1) 重載的方法名稱必須相同;(2) 重載的方法,其形參個數(shù)或類型必須不同,否則將出現(xiàn)“已經(jīng)定義了一個具有相同 類型參數(shù)的方法成員”的編譯錯誤。如果要使上例中的交換方法能同時處理整型與浮
33、點型數(shù)據(jù),重載的方法聲明如下:public void swap(rcf int ajcf int b)public void swap(rcf float a,ref float b)聲明了重載方法后,當(dāng)調(diào)用具有重載的方法時,系統(tǒng)會根據(jù)參數(shù)的類型或個數(shù)尋求最匹 配的方法予以調(diào)用。根據(jù)前述的例子,當(dāng)執(zhí)行uc.swap(refa,refb);"調(diào)用時,系統(tǒng)會調(diào)用"public void swap(ref int a,ref int b) ”方法,當(dāng)執(zhí)行uc.swap(ref fa,ref fb);”調(diào)用時,系統(tǒng)會調(diào)用apublic void swap(ref float a,r
34、ef float b) ”方法,從ij實現(xiàn)對不同的數(shù)據(jù)類型進行相同處理?!纠?-4】創(chuàng)建一個控制臺應(yīng)用程序,在該程序中實現(xiàn)對兩個整型、浮點型、雙精度型、 十進制型與字符型數(shù)據(jù)比較大小的功能。using system;namespace方法匝載_比較值的大小class classi/比較值大小的方法聲明public int max(int a, int b)return a>b?a:b;public float max(float a, goat b)return a>b?a:b;public double max(double a, double b)return a>b?a
35、:b;public decimal max(decimal a, decimal b)return a>b?a:b;public char max(char a, char b)return a>b?a:b;static void main(string args)int ia=60,ib=80;float fa=5.2f,fb=8.8f;double da=6.2,db=7.2;decimal ma=8.2m,mb=9.8m;char ca 二'a',cb 二'b'classi c=ncw classi();console.writeline(mi
36、a 與 ib 較大的值為:0”,c.max(ia,ib); console.writeline(hfa 與 fb 較大的值為:0”,c.max(fa,fb); consolc.writclinc("da 與 db 較大的值為:0",c.max(da,db»console.writeline("ma 與 mb 較大的值為:0",c.max(ma,mb); console.writelinec'ca 與 cb 較大的值為:0“,c.max(ca,cb); console.rcadlinc();程序運行結(jié)果為:ia與ib較大的值為:80fa與
37、fb較大的值為:8.8da與db較大的值為:7.2ma與mb較大的值為:9.8ca與cb較人的值為:b在上面的程序例題中,由于float類型可以隱式轉(zhuǎn)換為double類型,因此比較float類型 的值人小的方法可以省略。int類型可以實現(xiàn)隱式轉(zhuǎn)換,但由于int類型既可以隱式轉(zhuǎn)換為 double類型,也可以隱式轉(zhuǎn)換為decimal類型,所以,比較int類型值大小的方法不能省略, 以免產(chǎn)生調(diào)用的二義性。4.4構(gòu)造函數(shù)構(gòu)造函數(shù)是一種特殊的方法成員,構(gòu)造函數(shù)的主要作用是在創(chuàng)建對象(聲明對象)時初 始化對象。一個類定義必須有至少一個構(gòu)造函數(shù),如果定義類時,沒有聲明構(gòu)造函數(shù),系統(tǒng) 會提供一個默認的構(gòu)造函數(shù)
38、,如果聲明了構(gòu)造函數(shù),系統(tǒng)將不再提供構(gòu)默認造函數(shù)。如果只冇默認構(gòu)造函數(shù),在創(chuàng)建對彖時,系統(tǒng)將不同類型的數(shù)據(jù)成員初始化為相應(yīng)的默 認值,如,數(shù)值類型被初始化為0,字符類型被初始化為空格,字符串類型被初始化為null (空值),邏輯(bool)類空被初始化為false等。例如下面的程序:using system;class student/類名為 student聲明字段 public string id;public string name; public bool sex;public int age;class classistatic void main(string args)char s
39、sex;studcnt s1 =ncw studcnt();if (s1 .sex=true)ssexj男:elsessex=女;console.writeline("學(xué)號:”+sl.id+”姓名:*,+s+”性別:”+sscx+”年齡:0)h,sl.age);console.readline();程序運行的結(jié)果為:學(xué)號:姓名:性別:女年齡:()這是因為系統(tǒng)將student類的數(shù)據(jù)成員id與name初始化為null,將sex初始為false,將 age初始為0的緣故。如果想在創(chuàng)建對象吋,將對象的數(shù)據(jù)成員初始為指定的值,則需要專門聲明構(gòu)造函數(shù)。4.4.1聲明構(gòu)造函數(shù)聲明構(gòu)造
40、函數(shù)與聲明普通方法相比,有兩個特別要求,一是構(gòu)造函數(shù)不允許有返回類型 包括void類型,二是構(gòu)造函數(shù)的名稱必須與類名相同。由于通常聲明構(gòu)造函數(shù)是為了在創(chuàng)建對象時,對數(shù)據(jù)成員初始化,所以構(gòu)造函數(shù)往往需 耍使用形參,例如參考前而的學(xué)生(student)類,創(chuàng)建一個學(xué)生類對彖時,需耍給出學(xué)生的 學(xué)號、姓名、性別及年齡等,所以學(xué)生類構(gòu)造函數(shù)可以聲明如下:public student(string id,string name,bool sex,int age)id=id;name=nam esex=sex; age=age;)rti于聲明了上述帶參數(shù)的構(gòu)造函數(shù),所以系統(tǒng)不再提供默認構(gòu)造函數(shù),這樣在創(chuàng)建
41、對象 時,必須按照聲明的構(gòu)造函數(shù)的參數(shù)要求給出實際參數(shù),否則將產(chǎn)生編譯錯誤,例如:student s2=new student(,12345,h張三蔦true,21);由上述創(chuàng)建對象的語句可知,new關(guān)鍵字后面實際是對構(gòu)造函數(shù)的調(diào)用。如果聲明構(gòu)造函數(shù)時使川的參數(shù)名稱與類數(shù)據(jù)成員名稱相同,則構(gòu)造函數(shù)中使川的類數(shù) 據(jù)成員名稱需要用關(guān)鍵字this引導(dǎo),以免系統(tǒng)分不清形參與數(shù)據(jù)成員而產(chǎn)牛二義性。將上例 屮的形參名稱改為與數(shù)據(jù)成員同名的構(gòu)造函數(shù)聲明如下:public student(string id,string name,bool sex,int age)ithis.id=id;=
42、name;this.sex=sex; this.age=age;)關(guān)鍵字this指所創(chuàng)建的對象,是聲明對象時,由系統(tǒng)h動傳遞給構(gòu)造函數(shù)的對象的引用 形參。事實上在調(diào)用類的非靜態(tài)方法成員吋,系統(tǒng)均會口動傳遞該引用形參,不過最好的辦 法是使形參的名稱與數(shù)據(jù)成員的名稱有所區(qū)別。4.4.2重載構(gòu)造函數(shù)構(gòu)造函數(shù)與方法一樣可以重載,重載構(gòu)造函數(shù)的主耍h的是為了給創(chuàng)建對彖提供更大的 靈活性,以滿足創(chuàng)建對彖時的不同需耍。例如,在創(chuàng)建一個學(xué)生(student)對彖時,有時可 能需要只初始化姓名,而不初始化其他值,那么可以在麗述聲明構(gòu)造函數(shù)的基礎(chǔ)上再重載一 個只初始化姓名的構(gòu)造函數(shù),代碼如下:public stu
43、dent(string name)name=name;山于該構(gòu)造函數(shù)與前述構(gòu)造函數(shù)的參數(shù)個數(shù)不同,所以是一個合法的構(gòu)造函數(shù)重載。有 了這個構(gòu)造函數(shù)后,就可以聲明只有一個實參的對象,例如:student s3=new student("李平”);如果在聲明了帶參數(shù)的構(gòu)造函數(shù)后,還想保留默認構(gòu)造函數(shù),則必須顯式聲明一個默認 構(gòu)造函數(shù),顯式聲明的默認構(gòu)造函數(shù)實際上是一個不實現(xiàn)任何功能的空函數(shù)。以student類為 例,聲明默認構(gòu)造函數(shù)如下:public student()顯式聲明默認構(gòu)造函數(shù)【例45】根據(jù)本節(jié)介紹內(nèi)容,在控制臺應(yīng)用程序中創(chuàng)建student類,并聲明構(gòu)造函數(shù)及 構(gòu)造函數(shù)的垂載
44、。using system;namespace構(gòu)造函數(shù)class student類名為 student聲明字段public string id;public string name;public char sexx;public bool sex;public int age;/聲明構(gòu)造函數(shù)public studcnt()顯式聲明默認構(gòu)造函數(shù)public student(string id,string name,bool sex,int age)重載初始化學(xué)號、姓名、性別與年齡的構(gòu)造函數(shù)this.id=id;=name;this.sex=sex;this.agc=agc;p
45、ublic student(string name)重載只初始化姓名的構(gòu)造函數(shù)name=name;)class classistatic void main(string args)char ssex;聲明無參對彖(調(diào)用默認構(gòu)造函數(shù))student s1 =nevv student();if (s1 .sex=true)ssex='男:elsessex 二,女:console.writeline(”學(xué)號:”+sl.id+”,姓名:”+sl.namc+”,性別:”+ssex+“,年齡:0",sl.age);/聲明帶學(xué)號、姓名、性別及年齡初始值的對象(調(diào)用四參數(shù)構(gòu)造函數(shù)) stu
46、dent s2=ncw studcnt(" 12345","張三",truc,21);if (s2.sex=true)sscx 二,男:elsessex=女:console.writeline(“學(xué)號:”+s2.id+”,姓名:”+s2.name+”,性別:”+ssex+“,年齡:0",s2.age);聲明帶姓名初始值的對象(調(diào)用一參數(shù)構(gòu)造函數(shù))student s3=new student("李平”);if (s3.sex=true)ssex二'男';elsessex=女;console.writelinec1 學(xué)號:
47、”+s3.id+",姓名:”+s3.name+”,性別:”+sscx+",年齡:0)",s3.age);console.rcadlinc();程序運行結(jié)果:學(xué)號:,姓名:,性別:女,年齡:()學(xué)號:12345,姓名:張三,性別:男,年齡:21學(xué)號:,姓名:李平,性別:女,年齡:()山于構(gòu)造函數(shù)的重載,程序中可以用不同的初始化方式聲明対象,為創(chuàng)建對象提供了靈 活性。4. 5靜態(tài)成員類可以具冇靜態(tài)成員,例如靜態(tài)字段、靜態(tài)方法等。4.5.1靜態(tài)數(shù)據(jù)成員與方法成員靜態(tài)成員與非靜態(tài)成員的不同在于,靜態(tài)成員屬于類,陽非靜態(tài)成員則總是與特定的實 例(對彖)相聯(lián)系。聲明靜態(tài)成員需
48、要使川static修飾符。1.靜態(tài)數(shù)據(jù)成員非靜態(tài)的字段(數(shù)據(jù))總是屬于某個特定的對象,其值總是表示某個對象的值。例如, 當(dāng)說到學(xué)號(id)吋,總是指某個學(xué)生的學(xué)號,而不町能是全體學(xué)生的學(xué)號,相應(yīng)的,在前 面定義的student類的id成員就是一個非靜態(tài)的數(shù)據(jù)成員。有吋可能會需要類中有一個數(shù)據(jù)成員來表示全體對彖的共同特征,例如在student類用一 個數(shù)據(jù)成員來統(tǒng)計學(xué)生的人數(shù),那么這個數(shù)據(jù)成員表示的就不是某個學(xué)生對象的特征,而是 全體學(xué)牛對象的特征,這時就需要使用靜態(tài)數(shù)據(jù)成員。例如:class student類名為 studentpublic static int studentnumber;聲
49、明靜態(tài)數(shù)據(jù)成員public string id;public string name;public char sexx;public bool sex;public int age;靜態(tài)數(shù)據(jù)成員studentnumber不屬于任何一個特定的對彖,而是屬于類,或者說屬于全體 對彖,是被全體對象共享的數(shù)據(jù)。2.靜態(tài)方法非靜態(tài)的方法包括非靜態(tài)的構(gòu)造函數(shù)總是對某個對象進行數(shù)據(jù)操作,例如,比較值的大 小方法,總是某個對象的比較值人小的方法,相應(yīng)的,在前述的例子小類classi中max方法 成員就是一個非靜態(tài)的方法成員。如果某個方法使用時并不盂要與具體的對象相聯(lián)系,例如方法操作的數(shù)據(jù)并不是某個具 體對象的
50、數(shù)據(jù)而是表示全體對象特征的數(shù)據(jù),甚至方法操作的數(shù)據(jù)與對象數(shù)據(jù)根木無關(guān),這 時可以將該方法聲明為靜態(tài)方法。例如耍操作前述student類例子中的靜態(tài)數(shù)據(jù)成員 studentnumber,則應(yīng)該聲明一個靜態(tài)方法。靜態(tài)方法同樣使用修飾符static聲明,靜態(tài)方法屬于類,只能使用類調(diào)川,不能使用對 彖調(diào)用?!纠?-6創(chuàng)建一個控制臺應(yīng)用程序,在該程序屮定義一個學(xué)生類,該類除包含非靜態(tài) 成員外,還包含一個靜態(tài)數(shù)據(jù)成員用以統(tǒng)計學(xué)生人數(shù)(對象個數(shù)),一個靜態(tài)方法用以返冋學(xué) 生人數(shù)。using system;nanicspacc靜態(tài)成員class student 類名為 student聲明字段public st
51、atic int studentnumber;聲明都態(tài)數(shù)據(jù)成員public string id;public string name;public char sexx;public bool sex;public int age;public student(string id,string name,bool sex,int age)/聲明構(gòu)造函數(shù)studentnumber+;/每創(chuàng)建一個對彖,i浄態(tài)數(shù)據(jù)成員增1this.id=id;this.na me二name:this.sex=sex; this.age=age;1public static int getnumber()聲明靜態(tài)方法r
52、eturn studentnumber;static void main(string args)char ssex;student s1 =ncw student(” 12345",”張三“,true,21);聲明對象 si訐(s1 .sex 二二true)ssex=男:elsessex=女;console.writeline("學(xué)號:”+sl.id+”,姓名:"+s+”,性別:”+sscx+",年齡:0”,si.age);student s2=new student(”23456”,”李四",false,20);聲明對象 s2i
53、f (s2.sex=true)ssex='男'elsessex='a';consoie.writeline("學(xué)號:”+s2.id+",姓名:h+s2.name+”,性別:”+ssex+“,年齡:0”,s2.age);student s3=new student("34567","王五",true,19);/聲明對象 s3if (s3.sex=true)ssex男elsessex=女:console.writeline(“學(xué)號:”+s3.id+”,姓名:”+s3.name+”,性別:”+ssex+”,年
54、齡:0)",s3.age);console.writeline("學(xué)生人數(shù)為:0)",student.getnumber();/調(diào)用靜態(tài)方法console.readline();程序運行結(jié)果:學(xué)號:12345,學(xué)號:23456,學(xué)號:34567,學(xué)生人數(shù)為:3姓名: 姓名: 姓名:張三, 李四, 王五,性別:性別:性別:男,年齡: 女,年齡: 男,年齡:212019該程序在構(gòu)造函數(shù)被調(diào)川時,使靜態(tài)數(shù)據(jù)成員studentnumber自動增1,從而起到自動統(tǒng)計學(xué)生人數(shù)的作用,程序屮的靜態(tài)方法在調(diào)用時,是由類student h接調(diào)用的,如果用對象調(diào)用則是非法的。靜態(tài)方法
55、非靜態(tài)方法一樣可以重載?!纠?-7】修改【例4-4】,將比較值人小的方法重載聲明為靜態(tài)方法并在main方法小調(diào) 用這些方法。using system;namespace靜態(tài)方法重載class classi比較值大小的重載靜態(tài)方法聲明public static int max(int a, int b)return a>b?a:b;public static float max(float a, float b)return a>b?a:b;public static double max(double a, double b)return a>b?a:b;public static decimal max(decimal a, decimal b)return a>b?a:b;public static char max(char a, char b)return a>b?a:b;static void main(string args)int ia=60,ib=80;noat fa=5.2f,l*b=8.8f;double da=6.2,db=7.2;decimal ma=8.2m,mb=9.8m;char ca=a',cb='b'調(diào)用重載靜態(tài)方法console
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度汽車內(nèi)飾刮膩子翻新合同3篇
- 2024年股權(quán)轉(zhuǎn)讓合同標(biāo)的股權(quán)轉(zhuǎn)讓程序與條件
- 2024海上貨物運輸合同
- 2024校園學(xué)生宿舍管理與物業(yè)服務(wù)合同
- 2024年股權(quán)轉(zhuǎn)讓合同:高科技公司股權(quán)的并購與轉(zhuǎn)讓
- 二零二五年度新型環(huán)保紡織品銷售合作協(xié)議2篇
- 2024年昆明市精神衛(wèi)生防治醫(yī)院招聘考試真題
- 2024年天津市聾人學(xué)校招聘筆試真題
- 四年級數(shù)學(xué)(上)計算題專項練習(xí)及答案匯編
- 《雄激素剝奪治療誘導(dǎo)的胸腺功能重建與抗腫瘤免疫治療》
- 綿陽市高中2022級(2025屆)高三第二次診斷性考試(二診)歷史試卷(含答案)
- 2025版工業(yè)制造工程墊資建設(shè)合同2篇
- 2025南方財經(jīng)全媒體集團校園招聘63人高頻重點提升(共500題)附帶答案詳解
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實踐指導(dǎo)材料之4:4組織環(huán)境-4.2理解相關(guān)方的需求和期望(雷澤佳編制-2025B0)
- 2024年一級支行行長競聘演講稿例文(4篇)
- 健身房銷售人員培訓(xùn)
- 菌種保存管理
- 四年級數(shù)學(xué)(上)計算題專項練習(xí)及答案
- 廣東省廣州市2022-2023學(xué)年高二上學(xué)期期末考試化學(xué)試題
- 人教版-六年級上數(shù)學(xué)-扇形統(tǒng)計圖單元測試(含答案)
- 2023年題工會基礎(chǔ)知識試題及答案
評論
0/150
提交評論