第6章面向對象程序設計_第1頁
第6章面向對象程序設計_第2頁
第6章面向對象程序設計_第3頁
第6章面向對象程序設計_第4頁
第6章面向對象程序設計_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

計算機應用與基礎(2)C#程序設計

C#ProgrammingLanguage梅松青:2017-2廣州醫(yī)科大學信息技術教研室

面向對象程序設計第

章6.4方法6.5屬性6.8常用基礎類[類的修飾符]class

類名{

//類的成員;}1、類的聲明例如,以下聲明了一個Person類:

publicclassPerson

{ publicintpno; //編號

publicstringpname; //姓名

publicvoidsetdata(intno,stringname) {

pno=no;pname=name; } publicvoiddispdata() {

Console.WriteLine("{0}{1}",pno,pname); }

}1、類的聲明你希望別人知道你的年齡、身高、體重等私人信息嗎?例如,以下聲明了一個Person類:

publicclassPerson

{ privateintpno; //編號

privatestringpname; //姓名

publicvoidsetdata(intno,stringname) {

pno=no;pname=name; } publicvoiddispdata() {

Console.WriteLine("{0}{1}",pno,pname); }

}1、類的聲明以上兩步也可以合并成一步。其語法格式如下:類名對象名=new類名();例如:Personp=newPerson();兩個對象引用可以引用同一個對象,例如:Personp1=newPerson();Personp2=p1;2、定義類的對象訪問對象字段的語法格式如下:

對象名.字段名其中,“.”是一個運算符,該運算符的功能是表示對象的成員。例如,前面定義的p對象的成員變量表示為:

p.pno,p.pname3、訪問對象的字段調用對象的方法的語法格式如下:對象名.方法名(參數表)例如,調用前面定義的p對象的成員方法setdata為:

p.setdata(101,"Mary");3、調用對象的方法構造函數是在用類創(chuàng)建對象時執(zhí)行的方法。構造函數是一個特殊的方法。構造函數具有如下性質:構造函數的名稱與類的名稱相同。構造函數總是public的。構造函數盡管是一個函數,但沒有任何類型,即它既不屬于返回值函數也不屬于void函數。4、構造函數(constructor)調用帶參數的構造函數假設一個類中包含有帶參數的構造函數,調用這種帶參數的構造函數的語法如下:類名對象名=new類名(參數表);4、構造函數(constructor)【例】設計一個控制臺應用程序,說明調用構造函數的過程。完善point類,定義構造函數publicclassTPoint1 //聲明類TPoint1{ intx,y;

//類的私有變量

publicTPoint1(){}

//默認的構造函數

publicTPoint1(intx1,inty1) //帶參數的構造函數

{x=x1;y=y1;} publicvoiddispoint() {Console.WriteLine("({0},{1})",x,y);}}

析構函數的名稱是“~”加上類的名稱(中間沒有空格)。與構造函數一樣,析構函數也沒有返回類型。不能具有可訪問性修飾符,也不能被顯式地調用。垃圾回收期間會自動調用所涉及實例的析構函數。5、析構函數(destructor)【例】設計一個控制臺應用程序,說明調用析構函數的過程。publicclassTPoint2//聲明類TPoint2{ intx,y; publicTPoint2(intx1,inty1) //帶參數的構造函數

{x=x1;y=y1;}

~TPoint2() {Console.WriteLine("點=>({0},{1})",x,y);}}程序輸出什么?staticvoidMain(string[]args){ TPoint2p1=newTPoint2(2,6);TPoint2p2=newTPoint2(8,3);}6.4方法

方法是一種用于實現可以由對象或類執(zhí)行的計算或操作的成員。方法包含一系列的代碼塊。從本質上來講,方法就是和類相關聯的動作,是類的外部界面。用戶可以通過外部界面來操作類的私有字段。1、什么是方法定義方法的基本格式如下:

修飾符返回類型方法名([參數列表]){ //方法體:方法的具體實現;}2、方法的定義如省略修飾符,默認為private。如不需要返回值,則返回類型必須為void。聲明方法時的參數,稱為形式參數,簡稱“形參”調用方法時的參數,稱為實際參數,簡稱“實參”定義方法的基本格式如下:

修飾符返回類型方法名([參數列表])

{ //方法體:方法的具體實現;}2、方法的定義在聲明方法的類中,方法的“方法頭”(也稱為方法簽名)必須是惟一的,否則會出現錯誤。方法的“方法頭”由它的名稱、參數的數目、每個參數的修飾符和類型組成。返回類型不是方法簽名的組成部分。

方法可以向調用方返回某一個特定的值。如果返回類型不是void,則該方法可以用return關鍵字來返回值,return還可以用來停止方法的執(zhí)行。3、方法的返回值 publicintaddnum(intnum1,intnum2) {num=num1+num2;

returnnum; }3、方法的返回值方法中的參數是保證不同的方法間互動的重要橋梁,方便用戶對數據的操作。C#中方法的參數有3種類型。1.值參數2.引用型參數3.輸出參數4、方法的參數在調用一個有參數的方法時,首先進行“形實結合”,實現調用程序和被調用的方法之間的數據傳遞。(1)

值參數不含任何修飾符,當利用值向方法傳遞參數時,編譯程序給實參的值做一份拷貝,并且將此拷貝傳遞給該方法,被調用的方法不會修改內存中實參的值,所以使用值參數時可以保證實際值的安全性。4、方法的參數“傳值”:默認方式(1)

值參數在調用方法時,如果形參的類型是值參數的話,調用的實參的表達式必須保證是正確的值表達式。例前面MyClass3類中addnum方法中的參數就是值參數。4、方法的參數a=addnum(intm,5)(1)

值參數例題6-18交換兩個數的值4、方法的參數(2)

引用型參數

以ref修飾符聲明的參數屬引用型參數。引用型參數本身并不創(chuàng)建新的存儲空間,而是將實參的存儲地址傳遞給形參,即形參和實參共用同一內存塊。所以對形參的修改會影響原來實參的值。在調用方法前,引用型實參必須被初始化,同時在調用方法時,對應引用型參數的實參也必須使用ref修飾。4、方法的參數“傳址”publicclassMyClass4{ intnum=0; publicvoidaddnum(intnum1,refintnum2) {num2=num+num1;}}classProgram{ staticvoidMain(string[]args) {intx=10; MyClass4s=newMyClass4(); s.addnum(5,refx); Console.WriteLine(x);

//輸出:? }}4、方法的參數

例:(2)

引用參數例題6-19交換兩個數的值4、方法的參數(3)輸出參數以out修飾符聲明的參數屬輸出參數。與引用型參數類似,輸出型參數也不開辟新的內存區(qū)域。與引用型參數的差別:調用方法前無需對變量進行初始化。輸出型參數用于傳遞方法返回的數據,out修飾符后應跟隨與形參的類型相同的類型,用來聲明在方法返回后傳遞的變量經過了初始化。4、方法的參數out參數(輸出型參數)publicclassMyClass5{intnum=10;publicvoidaddnum(intnum1,outintnum2){num2=num+num1;}}classProgram{staticvoidMain(string[]args){ intx=20;MyClass5s=newMyClass5();s.addnum(5,outx);Console.WriteLine(x);

//輸出:?}}4、方法的參數

例:雖然ref和out都提供了修改參數值的方法,但兩者之間還是有一些小的區(qū)別。主要的區(qū)別有:(1)ref在作為參數調用函數之前,變量一定要賦值,否則會得到一個常規(guī)編譯錯誤:使用了未賦值的變量。(2)在被調用函數內,以ref引入的參數在返回前不必為它賦值。(3)out在作為參數調用函數之前,變量可以不被賦值。(4)在被調用函數內,以out引入的參數在返回前一定要至少賦值一次。4、方法的參數ref參數與out參數的區(qū)別從本質上講,ref更適合理解為給被調用函數傳遞了一個與原參考相同內存地址的變量。而out則可以理解為在調用函數前,先給變量找個地方(內存區(qū)域),讓被調用函數給指定的內存區(qū)域放置一個值。4、方法的參數ref參數與out參數的區(qū)別方法重載是指具有相同的方法名,但參數類型或參數個數不完全相同的多個方法可以同時出現在一個類中。調用時可用同一方法名,但是使用不同的數據類型參數或者次序不一致的參數。只要一個類中有兩個以上的同名方法,且使用的參數類型或者個數不同,編譯器就可以判斷在哪種情況下調用哪種方法了。5、方法的重載為此,C#中引入了成員簽名的概念。成員簽名包含成員的名稱和參數列表,每個成員簽名在類型中必須是唯一的,只要成員的參數列表不同,成員的名稱可以相同。如果同一個類有兩個或多個這樣的成員(方法、屬性、構造函數等),它們具有相同的名稱和不同的參數列表,則稱該同類成員進行了重載,但它們的成員簽名是不同的。5、方法的重載classProgram{publicstaticintAdd(inti,intj)//重載方法1{returni+j;}publicstaticstringAdd(strings1,strings2)

//重載方法2{returns1+s2;}publicstaticdouble

Add(doublex,doubley)//重載方法3{returnx+y;}staticvoidMain(){Console.WriteLine(Add(1,2));Console.WriteLine(Add("1","2"));Console.WriteLine(Add(5.4,105.33));}}5、方法的重載6、靜態(tài)成員有些特性,操作是屬于整個類共同所有的,在定義類的時候可以定義為靜態(tài)成員。靜態(tài)成員需要使用static關鍵字來聲明。static方法說明GetLength

非靜態(tài)方法。獲取一個32位整數,該整數表示Array的指定維中的元素數。Max非靜態(tài)方法。獲取最大值。Min非靜態(tài)方法。獲取最小值。Average非靜態(tài)方法。獲取平均值。Resize靜態(tài)方法。將數組的大小更改為指定的新大小。Reverse靜態(tài)方法。反轉一維Array或部分Array中元素的順序。Sort靜態(tài)方法。對一維Array對象中的元素進行排序。Array類常用方法Array類常用方法6、靜態(tài)成員靜態(tài)字段是類中所有對象共享的成員,而不是某個對象的成員,即靜態(tài)字段的存儲空間不是放在每個對象中,而是和方法一樣放在類公共區(qū)中。對靜態(tài)字段的操作和一般字段一樣,定義為私有的靜態(tài)字段不能被外界訪問。(1)靜態(tài)字段static6靜態(tài)成員靜態(tài)字段的使用方法如下:(1)靜態(tài)字段的定義與一般字段相似,但前面要加上static關鍵詞。默認都是非靜態(tài)的。(2)在訪問靜態(tài)字段時采用如下格式:類名.靜態(tài)字段名(1)靜態(tài)字段static6、靜態(tài)成員當一個字段聲明中含有static修飾符時,由該聲明引入的字段為靜態(tài)字段(staticfield)。它只標識了一個存儲位置。不管創(chuàng)建了多少個類的實例(即對象),靜態(tài)字段都只會有一個副本。即靜態(tài)字段為類的所有實例所共享。當一個字段聲明中不含有static修飾符時,由該聲明引入的字段為實例字段(instancefield)。類的每個實例(對象)都包含了該類的所有實例字段的一個單獨副本。(1)靜態(tài)字段static靜態(tài)方法與靜態(tài)字段類似,也是從屬于類,都是類的靜態(tài)成員。只要類存在,靜態(tài)方法就可以使用。靜態(tài)方法只能通過類來訪問,而實例方法則要通過類的實例訪問。靜態(tài)方法的定義是在一般方法定義前加上static關鍵字。調用靜態(tài)方法的格式如下:類名.靜態(tài)方法名(參數表);(2)靜態(tài)方法類名.靜態(tài)方法名(參數表);注意:靜態(tài)方法只能訪問靜態(tài)字段、其他靜態(tài)方法和類以外的函數及數據,不能訪問類中的非靜態(tài)成員(因為非靜態(tài)成員只有對象存在時才有意義)。但靜態(tài)字段和靜態(tài)方法可由任意訪問權限許可的成員訪問。(2)靜態(tài)方法classPerson{

private

intage;

private

stringname;

staticprivate

int

tatol;/用于記錄總認數………//其它字段staticintgetTatol(){returntatol;}}

7、方法的嵌套與遞歸調用在一個方法中調用另外一個方法,稱為方法的嵌套調用;方法直接或間接地調用其本身,則稱為方法的遞歸調用。(1)方法的嵌套在C#中,不可以在定義的一個方法的代碼中定義另外一個方法,但在一個方法中調用另外一個方法是允許的,這種調用方式稱為方法的嵌套調用。7、方法的嵌套與遞歸調用(2)方法的遞歸調用方法的遞歸調用是指一個方法直接或間接調用自己本身的情況。很多的數學模型和算法設計方法本來就是遞歸的,所以用遞歸方法描述它們比用非遞歸方法簡潔易讀,可理解性好,算法的正確性證明也比較容易。一般來說,在方法的遞歸調用中,一個方法執(zhí)行的某一步都要用到它自身的前面一步或前若干步的結果。1當n=0時n!=

n*(n-1)!當n≥1時7、方法的嵌套與遞歸調用(2)

方法的遞歸調用1當n=0時n!=

n*(n-1)!當n≥1時publiclongFactorial(intn){if(n==0||n==1)return1;elsereturnn*Factorial(n-1);}

7、方法的嵌套與遞歸調用(2)

方法的遞歸調用

例題6-27求Fibonacci序列的值6.5屬性對字段最常用的操作是什么?1、

什么是屬性通過調用“方法”實現對字段的讀寫操作太麻煩了,也不符合人的使用習慣。6.5屬性

屬性描述了對象的具體特性,它提供了對類或對象成員的訪問。屬性是字段的自然擴展,兩者都是具有關聯類型的命名成員,而且訪問字段和屬性的語法是相同的。1

什么是屬性6.5屬性但屬性與字段不同,屬性不表示存儲位置。相反,屬性有訪問器(accessor),這些訪問器指定在它們的值被讀取或寫入時需執(zhí)行的語句。C#屬性成員一般具有get和set兩種訪問器。C#中的屬性更充分地體現了對象的封裝性,屬性不直接操作類的字段,而是通過訪問器進行訪問。1

什么是屬性

屬性在類模塊里是采用下面的方式進行聲明的,即指定變量的訪問級別、屬性的類型、屬性的名稱,然后是get訪問器或者set訪問器代碼塊。其語法格式如下:

修飾符數據類型屬性名稱

{get訪問器

set訪問器

}2屬性聲明修飾符有new、public、protected、internal、private、static、virtual、override和abstract。2屬性聲明屬性的聲明類似于字段,不同之處在于屬性的聲明以定界符“{}”之間的get訪問器和set訪問器結束,而不是分號。同時包含get訪問器和set訪問器的屬性稱為可讀寫屬性(read-writeproperty)。只具有get訪問器的屬性稱為只讀屬性(read-onlyproperty)。只具有set訪問器的屬性稱為只寫屬性(write-onlyproperty)。2屬性聲明get訪問器相當于一個具有屬性類型返回值的無參數方法。除了作為賦值的目標外,當在表達式中引用屬性時,會調用該屬性的get訪問器以計算該屬性的值。set訪問器相當于一個具有名為value的參數和無返回類型的方法。當一個屬性作為賦值的目標,或者作為“++”或“--”運算符的操作數被引用時,就會調用set訪問器,所傳遞的自變量將提供新值。2屬性聲明value是C#的關鍵字,是進行屬性操作時set的隱含參數。value的使用僅限于此,在其他位置使用value會出錯。2屬性聲明【例6.7】設計一個控制臺應用程序,說明屬性的使用。publicclassTPoint3 //聲明類TPoint3{intx,y;publicintpx{ get //get訪問器

{returnx;

} set //set訪問器

{x=value;

}}publicintpy{ get //get訪問器

{returny;

} set //set訪問器

{y=value;

}}};點=>(3,8)【例6.7】設計一個控制臺應用程序,說明屬性的使用。classProgram{staticvoidMain(string[]args){ TPoint3p=newTPoint3();

p.px=3;p.py=8;//屬性寫操作

Console.WriteLine("點=>({0},{1})",p.px,p.py);//屬性讀操作

}}}點=>(3,8)classPerson

{

private

intage;………//其它字段

public

intAge

{

get{returnage;}

set

{

if(value<10||value>60)value=0;age=value;

}

}

}

class

Program

{

private

static

voidMain(string[]args)

{

MyClassmy;my=new

MyClass();

my.Age=35;//調用set訪問器

Console.WriteLine("my對象中age字段值為{0}",my.Age);

//調用get訪問器my.Age=350;

Console.WriteLine("my對象中age字段值為{0}",my.Age);

}

}類的定義綜合案例classcar

{

privateint_百公里耗油=10;

privateint_油箱容積=60;

privateint_油表;

privateint_公里數;

定義一個汽車類,演示類的定義相關知識點。構造函數重載

publiccar()

{

_油表=_油箱容積;

_公里數=0;

}

publiccar(int

當前油表)

{

_油表=當前油表;

_公里數=0;

}

publiccar(int

當前油表,int

當前里程)

{

_油表=當前油表;

_公里數=當前里程;

}

方法的嵌套調用

private

int

計算耗油(int

行駛公里數)

{

return行駛公里數*_百公里耗油/100;

}

publicvoid行駛(int

行駛公里數)

{

Console.WriteLine(“行駛{0}公里開始”,行駛公里數);

if(_油表>計算耗油(行駛公里數))

{

_公里數+=行駛公里數;

_油表-=計算耗油(行駛公里數);

Console.WriteLine("行駛完畢");

}

else

Console.WriteLine("油耗不足,行駛失敗");

}

方法的重載

publicvoid加油()

{

Console.WriteLine(“開始加油”);

int

需要加的油=_油箱容積-_油表;

_油表+=需要加的油;

Console.WriteLine(“加油完畢,一共加了{0}升”,需要加的油);

}

publicvoid加油(int

加油體積)

{

Console.WriteLine("加油{0}升開始",加油體積);

if(加油體積<_油箱容積)

{

_油表+=加油體積;

Console.WriteLine("加油完畢");

}

else

Console.WriteLine("超過最大油箱容積,加油失敗");

}

publicvoid獲取當前汽車信息()

{

WriteLine(stri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論