版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章面向對象的編程基礎4.1
類4.2
結構4.3
方法4.4
屬性與索引器22七月202324.1類類與對象類:一組具有相同數據結構和相同操作的對象的集合;例如:汽車對象(實例):類的實例化;例如:卡車、面包車、公交車、……注意:要使用對象,必須先定義類,然后再創(chuàng)建對象。創(chuàng)建對象的兩個工作:使用new保留字要求系統(tǒng)分配內存;使用構造函數初始化數據。銷毀對象的兩個工作:釋放占用的內存;將分配給對象的內存歸還給堆(Heap)。Object類C#中所有的類都直接或間接繼承自System.Object類;C#中所有的類都集成了Object類的公共接口;22七月20233名稱說明Equals確定兩個Object實例是否相等GetHashCode用作特定類型的哈希函數GetType獲取當前實例的TypeToString返回表示當前Object的字符串4.1類4.1.1類的聲明和成員組織4.1.2構造函數4.1.3字段和局部變量4.1.4靜態(tài)成員與實例成員4.1.5訪問修飾符22七月202354.1.1類的聲明用class定義類,聲明類的形式為:[附加聲明][訪問修飾符]class類名稱[:[基類]
[,接口序列]]{[字段聲明][構造函數][方法][事件]}類聲明注意訪問修飾符缺省時,默認為private(私有)的;類名是用戶自定義的符號,大小寫敏感;當基類和接口都有時,先寫基類后寫接口;基類只能有一個,接口可以有多個;22七月20236publicclassChild{//定義類級別的私有變量,稱為字段
privateintage;privatestringname;
//不帶參數的構造函數
publicChild(){name="none";}//帶參數的構造函數
publicChild(stringname,intage){=name;this.age=age;}
//輸出方法
publicvoidPrintChild(){Console.WriteLine("{0},{1}yearsold.",name,age);}}類舉例(1/2)22七月20237publicclassProgram{publicstaticvoidMain(){
//使用new關鍵字創(chuàng)建對象,new后是調用的構造函數
Childchild1=newChild("ZhangSan",11);Childchild2=newChild("LiSi",10);Childchild3=newChild();//顯示結果
Console.Write("Child#1:");child1.PrintChild();
Console.Write("Child#2:");child2.PrintChild();
Console.Write("Child#3:");child3.PrintChild();Console.ReadLine();}}}類舉例(2/2)輸出結果:Child#1:ZhangSan,11yearsold.Child#2:LiSi,10yearsold.Child#3:none,0yearsold.this關鍵字this關鍵字僅限于在構造函數、類的方法和類的實例中使用;this關鍵字的用法在構造函數中使用,表示正在構造的對象;在方法中使用,表示調用該方法的對象;this關鍵字可以認為是一個常量;22七月20238classA{publicintx;staticvoidMain(){x=5;Console.WriteLine(x);Console.WriteLine(this.x);}}類成員按照成員形式分:數據成員常量、變量、屬性、……方法成員方法、事件、索引指示器、構造函數、……按照成員的歸屬分:靜態(tài)成員屬于類所有,為所有該類的實例所共有;實例成員屬于類的對象所有,每個實例都對應于自己的實例成員;22七月2023922七月2023104.1.2構造函數構造函數是一個特殊的方法;用于在建立對象時進行初始化的動作;確保每一個對象在被使用之前都進行了初始化。構造函數特點:每個類至少有一個構造函數,可重載;若沒有構造函數,則系統(tǒng)會自動提供一個默認的構造函數。構造函數的名稱總是和類名相同;構造函數不包含任何返回值,不能使用return語句;構造函數總是public的,否則該類無法實例化;構造函數是在執(zhí)行new運算符時,編譯器自動選擇參數匹配的構造函數調用的,不能顯式調用;22七月2023111、默認的實例構造函數若類中未定義構造函數,則系統(tǒng)會提供一個默認的無參的構造函數。默認構造函數的特點:沒有參數;自動對非靜態(tài)成員初始化;數值類型(如int、double等),初始化為0。bool類型,初始化為false.引用類型,初始化為null。若類中定義了構造函數,則系統(tǒng)不再提供默認的構造函數,程序員必須自行定義用到的所有構造函數;22七月2023122、重載(Overloading)實例構造函數重載實例構造函數的適用情況:在一個類中的多個方法中都要用到某一個數據成員;且該成員值必須從其他類中傳遞過來;重載實例構造函數的形式:不需要添加任何說明符;與默認構造函數相似;代碼中沒有初始化的非靜態(tài)成員,仍然采用默認值初始化;具有參數,用于傳入某些數據成員的值;22七月202313重載構造函數舉例usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceOverloadingExample{classProgram{
publicProgram(){Console.WriteLine("null");}
publicProgram(stringstr){Console.WriteLine(str);}staticvoidMain(){
Programaa=newProgram();
Programbb=newProgram("Howareyou!");Console.ReadLine();}}}構造函數的類型實例構造函數負責初始化類中的實例變量;默認構造函數:系統(tǒng)自動提供;重載構造函數:程序員自己定義;靜態(tài)構造函數負責初始化一些靜態(tài)變量;靜態(tài)構造函數只會執(zhí)行一次,在創(chuàng)建第一個實例或引用任何靜態(tài)成員之前,由編譯器自動調用;一個類中只能有一個靜態(tài)構造函數,若未顯式定義,則系統(tǒng)會自動提供;靜態(tài)構造函數不需要訪問修飾符,只用static說明符即可;典型用途:對類使用日志文件時,使用此構造函數寫入日志項。22七月202314靜態(tài)構造函數例題——雅虎面試題程序代碼在Main方法中添加Aa=newA();
執(zhí)行完畢后,A.counter的值是多少?繼續(xù)添加Aobj=newA();運行后,A.counter的值是多少?22七月202315classA{publicstaticintcounter;staticA(){counter++;}publicA(){counter++;}}23析構函數析構函數在類撤銷時運行,常用來處理類用完后的收尾工作;析構函數的定義形式:析構函數的特點:不能帶有參數;不能擁有訪問修飾符;不能被顯式調用;C#程序中一般不需要自定義析構函數,由編譯器在適當的時候,調用默認的析構函數,回收內存和各類對象;22七月202316
~類名(){
處理代碼;}22七月2023174.1.3字段和局部變量字段聲明為類一級的對象或值類型的變量。局部變量在方法、事件以及構造函數內聲明的變量。publicclassProgram{
publicstaticintj=20;//字段
publicstaticvoidMain(){
intj=30;//局部變量
Console.WriteLine(j);//輸出結果:30Console.WriteLine(Program.j);//輸出結果:20Console.ReadLine();}}22七月202318字段和局部變量名的引用若字段和局部變量名相同:字段的引用靜態(tài)字段:類名.字段名;實例字段:this.字段名;局部變量的引用直接使用局部變量名;若字段和局部變量名不相同:字段和局部變量的引用,都直接使用字段名和局部變量名。22七月2023194.1.4靜態(tài)成員與實例成員類的成員分靜態(tài)成員和實例成員靜態(tài)成員從屬于類,而不是某個具體的對象,其值被該類的所有對象所共享;靜態(tài)成員在內存中只有一份,當應用程序結束時釋放;靜態(tài)成員的初始化,在Main函數之前執(zhí)行;實例成員只有創(chuàng)建了類的實例才能夠使用的成員;每個實例成員只屬于該實例,即有多少個實例,就有多少個實例成員;靜態(tài)方法中只能使用靜態(tài)對象,而不能使用實例對象;實例方法中既可以使用靜態(tài)對象,也可以使用實例對象;22七月2023204.1.5訪問修飾符Public(常用)任何外部的類都可以不受限制的存取這個類的方法和數據成員。Private(常用、默認)類中的所有方法和數據成員只能在此類中使用,外部無法存取。Protected
除了讓本身的類可以使用之外,任何繼承自此類的子類都可以存取。Internal在當前項目中都可以存取。該訪問權限一般用于基于組件的開發(fā),因為它可以使組件以私有方式工作,而該項目外的其它代碼無法訪問。Protectedinternal
只限于當前項目,或者從該項目的類繼承的類才可以存取。補充:聲明修飾符Partial局部類型,類的定義和實現可以分布在多個文件中,但都要使用partial標注,基類只需要聲明一次,若多次聲明則必須完全一致。new:從基類成員隱藏繼承的成員;static:靜態(tài)成員的聲明;virtual:派生類中可重寫;override:對基類的虛擬成員的重寫;sealed:密封的,不可被繼承;abstract:抽象類,只能作為基類,不能實例化;extern:外部實現方法;22七月20232122七月2023224.2結構(struct)結構類型屬于值類型結構是將一系列相關的、但類型不一定相同的變量組織在一起而構成的數據表示形式;C#中的結構:DateTime/TimeSpan/Point/Int32/Double等;結構類型的聲明語法與類聲明相似;結構體內可定義字段、方法等;只有字段被聲明為const或
static,才能在聲明時初始化;不能聲明默認的沒有參數的構造
函數或析構函數。結構類型的聲明舉例:訪問修飾符struct結構名{......}publicstructPoint
{
publicintx;
publicinty;
publicstrings;
}結構類型對象的創(chuàng)建使用new運算符創(chuàng)建該結構對象,并調用適當的構造函數進行初始化;舉例:不使用new運算符不會自動調用任何構造函數;即所有字段都未賦值,必須在程序代碼中手動賦值,否則不可用;22七月202323CoOrds結構定義publicstructCoOrds{publicintx,y;publicCoOrds(intp1,intp2){x=p1;y=p2;}}CoOrdscoords1=newCoOrds();CoOrdscoords2=newCoOrds(10,10);CoOrdscoords1;coords1.x=10;coords1.y=20;結構和類的區(qū)別與聯系結構是值類型,而類是引用類型;但結構也可以用new運算符來實例化;結構可以聲明構造函數,但必須帶參數;凡是定義為結構的,都可以用類來定義。創(chuàng)建輕量級對象時,可以使用結構,提高程序的執(zhí)行效率。結構直接繼承自System.ValueType,類繼承自System.Object。結構不存在繼承和派生的關系;即一個結構不能從另一個結構或類繼承,而且不能作為一個結構或類的基類。22七月202324P70【例4-4】
類和結構的性能比較。22七月20232522七月2023264.3方法方法(Method)按照一定格式組織的一段程序代碼,用于完成指定的功能;每個方法都有一個方法名,便于識別和讓其他方法調用。有關方法方法的定義與調用靜態(tài)方法和實例方法方法的參數傳遞傳遞值類型的參數傳遞引用類型的參數輸出多個引用類型的參數傳遞個數不確定的參數方法的重載22七月2023271、方法的定義與調用方法的定義必須封裝在某個類中。定義方法的語法形式為: 訪問修飾符返回值類型方法名稱(參數序列)
{
語句序列
}定義方法時,需要注意以下幾點:方法名稱自定義,但不能和任何聲明在類中的其它成員相同;方法的參數可以為0~多個,若有多個參數,則以逗號分隔;方法不論是否有參數,小括號都是必需的。返回值若不為void的,則在方法體內必須使用return返回值;return語句結束某個方法的執(zhí)行,同時返回結果值;需要返回值的方法,必須所有代碼路徑都有返回值;22七月202328方法的定義與使用舉例usingSystem;classProgram{
public
int
MyMethod(){Console.WriteLine("thisisMyMethod.");inti=10;
returni;
}staticvoidMain(){Programmethod=newProgram();
intj=5;
j=method.MyMethod();Console.WriteLine("thevalueis{0}.",j);}}2、靜態(tài)方法和實例方法靜態(tài)方法定義時使用static說明符;在定義類中,可直接使用方法名調用;在其他類中,使用“類名.方法名”的形式調用;實例方法不需要特殊的說明符;在定義類中,可直接使用方法名,或“this.方法名”的形式調用;在其他類中,必須先做實例化,使用“對象名.方法名”的形式調用;22七月20232922七月2023303、方法中的參數傳遞(1/4)
——傳遞值類型的參數值類型參數的格式為:參數類型參數名舉例:publicstaticvoidAddOne(intx){x++;Console.WriteLine("方法AddOne中,x={0}",x);}staticvoidMain(){inta=3;Console.WriteLine("調用AddOne之前,a={0}",a);AddOne(a);Console.WriteLine("調用AddOne之后,a={0}",a);Console.ReadLine();}方法AddOne在調用時重新分配了內存空間,之傳值,不影響原數據;22七月2023313、方法中的參數傳遞(2/4)
——傳遞引用類型的參數引用類型參數的格式為:ref參數類型參數舉例:classProgram{publicstaticvoidAddOne(refintx){x++;}staticvoidMain(){inta=3;Console.WriteLine("調用AddOne之前,a={0}",a);AddOne(refa);Console.WriteLine("調用AddOne之后,a={0}",a);Console.ReadLine();}}ref傳遞的是指向原變量的地址,沒有為參數重新分配空間;有關引用類型的參數傳遞值類型的參數不加ref,方法中對參數的修改,不會影響原值;若加ref,參數值會隨著方法中的修改而變化;傳遞引用類型的參數參數前加不加ref,方法執(zhí)行后,參數的值都會跟著方法執(zhí)行的結果而改變;例外:字符串string類型若要方法中修改string類型的值,參數前必須加ref;原因:string類型的變量修改時是重新分配空間的;22七月202332publicstaticvoidAddOne(refintx,refstrings,int[]a)
{x++;s+="de";for(inti=0;i<a.Length;i++)
{a[i]++;
}
}staticvoidMain()
{inti=1;stringss="abc";int[]ia={1,2,3};
AddOne(refi,refss,ia);Console.WriteLine("{0},{1},{2}",i,ss,ia[0]);Console.ReadLine();
}引用類型的參數傳遞舉例22七月20233322七月2023343、方法中的參數傳遞(3/4)
——輸出多個引用類型的參數輸出引用類型參數的格式為:out參數類型參數名若方法中需要返回多于1個的結果值時,可使用out關鍵字;將返回值作為參數,且out參數不需要具有初始值;舉例publicstaticvoidMyMethod(outinta,outintb){a=5;b=6;}staticvoidMain(){intx,y;
MyMethod(outx,outy);Console.WriteLine("調用MyMethod之后,x={0},y={1}",x,y);Console.ReadLine();}22七月202335ref參數傳遞與out參數傳遞異同點相同點都是傳遞引用類型的參數,編譯器處理時沒有區(qū)別;不同點ref參數使用前必須要初始化;out參數使用前不必初始化;注意:publicvoidAddOne(refintx){…}public
voidAddOne(out
int
x){…}
上面這兩個方法,不是重載方法。
22七月2023363、方法中的參數傳遞(3/4)
——傳遞個數不確定的參數需要傳遞的參數個數不確定時,可以采用params關鍵字,其后一般跟一個數組。舉例:publicstaticfloatAverage(paramslong[]v){longtotal,i;for(i=0,total=0;i<v.Length;++i)total+=v[i];
return(float)total/v.Length;}staticvoidMain(){floatx=Average(1,2,3,5);Console.WriteLine("1、2、3、5的平均值為{0}",x);x=Average(newlong[]{4,5,6,7,8});Console.WriteLine("4、5、6、7、8的平均值為{0}",x);Console.ReadLine();}params參數既可以是一個數組,也可以是多個數值;但類型要匹配;params參數一個方法中只能聲明一個params參數;若方法中還用到其他常規(guī)參數,則params應放在參數表的最后;params參數是一維數組,不可用作二維數組;params參數,在調用時可指定0~多個參數;22七月20233722七月2023384、方法重載方法重載具有相同的方法名;但參數類型或參數個數不完全相同;usingSystem;classProgram{
publicstaticintAdd(inti,intj){returni+j;}publicstaticstringAdd(strings1,strings2){returns1+s2;}
publicstaticlongAdd(longx){returnx+5;}staticvoidMain(){
Console.WriteLine(Add(1,2));
Console.WriteLine(Add("1","2"));
Console.WriteLine(Add(10));Console.ReadLine();}}4.4屬性與索引器4.4.1屬性4.4.2索引器4.4.1屬性屬性可以限制外部對類中成員變量的存取權限;屬性的聲明和定義;get訪問器用來設置屬性的讀取權限;用return返回數據成員的值;set訪問器用來設置屬性的寫入權限;value關鍵字表示要寫入的數據值;可添加相關代碼,控制屬性值;屬性的使用:類實例名稱+“.”運算符使用;訪問修飾符數據類型屬性名稱{get訪問器set訪問器}22七月202340屬性聲明、定義和使用舉例22七月202341publicclassMyClass{privateintnumber=0;publicintMyNumber{
get{returnnumber;}
set{if(value>0)
{
number=value;}}}}publicclassProgram{publicstaticvoidMain(){MyClassme=newMyClass();Console.WriteLine(me.MyNumber);
me.MyNumber=5;Console.WriteLine(me.MyNumber);Console.ReadLine();}}若程序中做如下賦值: me.Number=-1;則me.Number的值為多少?P76【例4-11】
屬性的聲明和用法。22七月20234222七月2023434.4.2索引器索引器用于封裝內部集合或數組。便于程序員將類、結構或接口作為數組進行訪問。索引器的聲明語法舉例:訪問修飾符
返回值數據類型this[索引的數據類型index]{//getandsetaccessors}string[]days={"Sun","Mon","Tues",
"Wed","Thurs","Fri","Sat"};publicintthis[stringday]{get
{return(GetDay(day));
}}publicstringthis[inti]{get
{return(days[i]);
}}22七月202344P78【例4-12】
索引器的聲明和用法。22七月202345本章相關面試題——選擇題1.以下關于ref和out的描述哪些項是正確的?(多選)
A.使用ref
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【同步輔導】2021高中數學北師大版必修四導學案:《任意角的正弦函數、余弦函數的定義與周期性》
- 征收土地補償標準2022年
- 甘肅省平涼市莊浪縣2024-2025學年高一上學期第二學段考數學試題(含答案)
- 【備課參考】2020年新人教版高中地理必修1:課堂實錄2.2《氣壓帶和風帶》
- 安徽省滁州市來安縣部分學校2024-2025學年第一學期八年級語文期末試卷(含答案)
- 2024-2025學年湖南省岳陽市高中教學質量監(jiān)測試卷高一數學試題(含解析)
- 《淺談當下護士意識》課件
- 《金版教程》2022屆高考生物一輪總復習階段示范性金考卷1-
- 【名師一號】2020-2021學年高中地理中圖版必修三-雙基限時練(九)
- 2022屆高考語文第一輪復習-第3部分論述類文本閱讀常見題型(復習課)
- 四川省德陽市2025屆數學三年級第一學期期末聯考模擬試題含解析
- 2024年平面設計師技能及理論知識考試題庫(附含答案)
- 相互批評意見500條【5篇】
- 2024年高考真題-英語(新高考Ⅰ卷) 含解析
- 2023-2024年6月廣東省普通高中學業(yè)水平生物考試及答案
- 江蘇徐州歷年中考語文現代文閱讀之非連續(xù)性文本閱讀5篇(含答案)(2003-2023)
- GB/T 16649.3-2024識別卡集成電路卡第3部分:帶觸點的卡電接口和傳輸協議
- 鐵路技術管理規(guī)程-20220507141239
- 2024年內部執(zhí)業(yè)醫(yī)師考試試題
- 植物學智慧樹知到答案2024年浙江大學
- 礦山開采與生產管理
評論
0/150
提交評論