第3章面向?qū)ο缶幊袒A(chǔ)_第1頁
第3章面向?qū)ο缶幊袒A(chǔ)_第2頁
第3章面向?qū)ο缶幊袒A(chǔ)_第3頁
第3章面向?qū)ο缶幊袒A(chǔ)_第4頁
第3章面向?qū)ο缶幊袒A(chǔ)_第5頁
已閱讀5頁,還剩70頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第3章 面向?qū)ο缶幊袒A(chǔ)理解基本概念理解類使用構(gòu)造函數(shù)學(xué)習(xí)方法學(xué)習(xí)屬性掌握1姓名、性別、年齡等:屬性學(xué)習(xí)課程、參加社會(huì)活動(dòng):方法3.1

面向?qū)ο缶幊谈拍?對(duì)象——具有屬性和操作(方法)的實(shí)體。 屬性:對(duì)象所處的狀態(tài)方法:用于改變對(duì)象狀態(tài)以達(dá)到特定的功能對(duì)象有一個(gè)唯一的標(biāo)識(shí)名類——在對(duì)象之上的抽象,一種抽象的數(shù)據(jù)類型類是對(duì)象的模板,對(duì)象是類的具體化或類的實(shí)例示例:學(xué)生——類各位同學(xué)——對(duì)象對(duì)象與類屬性型號(hào)價(jià)格里程行為起動(dòng)停車行駛屬性車輪數(shù)量檔的數(shù)量行為加速換檔剎車屬性名稱顏色品種行為吃東西犬

吠搖尾巴34面向?qū)ο蟪绦蛟O(shè)計(jì)在處理對(duì)象時(shí),必須遵循的三個(gè)原則:1.封裝單元。是父類和子類之工具,對(duì)象則是封裝的基本創(chuàng)建分等級(jí)層次的類,繼承用一個(gè)框架把數(shù)據(jù)和代碼組合在一起,形成一個(gè)對(duì)象。類是支持對(duì)象封裝的繼承利用繼承可以間共享數(shù)據(jù)和方法的機(jī)制,通常把父類稱為基類,子類稱為派生類。單繼承:一個(gè)基類可以有任意數(shù)目的派生類,即一父多子

多繼承:一個(gè)類若有兩個(gè)或兩個(gè)以上的直接基類,即一子多父,稱為多重繼承,C#通過接口來實(shí)現(xiàn)多態(tài)性同一個(gè)操作作用于不同的對(duì)象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)根據(jù)參數(shù)的差別直接調(diào)用對(duì)象方法根據(jù)基類間接調(diào)用對(duì)象方法53.2

類3.2.1

類的聲明語法形式:[屬性集信息]

[類修飾符] class

類名

[:

類基]{[類主體]}屬性集信息——是C#語言為程序中定義的各種實(shí)體附加一些說明信息,是C#語言的一個(gè)重要特征。屬于高級(jí)編程內(nèi)容,一般涉及不到。類名:唯一標(biāo)識(shí)名類基:直接基類或接口。默認(rèn)基類是object類,多個(gè)接口之間用逗號(hào)相隔類修飾符——訪問權(quán)限、類的類型等,注意同一修飾符不允許出現(xiàn)多次,見表3.16表3.1

類修飾符修飾符作用說明public

表示不限制對(duì)類的訪問。類的訪問權(quán)限省略時(shí)默認(rèn)為publicprotected表示該類只能被這個(gè)類的成員或派生類成員訪問private表示該類只能被這個(gè)類的成員訪問,很少用internal表示該類能夠由程序集中的所有文件使用,而不能由程序集之外的對(duì)象使用new只允許用在嵌套類它表示所修飾的類abstract表示這是一個(gè)抽象因此不能被實(shí)例化sealed表示這是一個(gè)密封顯然密封類不能同中,會(huì)隱藏繼承下來的同名成員類,該類含有抽象成員,,只能用作基類類,不能從這個(gè)類再派生出其他類。時(shí)為抽象類示例:class

Student{//類主體}3.2.2

類的成員類體(類主體)用于定義該類的成員用一對(duì)花括號(hào){

}括起來,由兩部分組成:類體中以類成員聲明形式引入的類成員包括:常數(shù)聲明、字段聲明、方法聲明、屬性聲明、事件聲明、索引器聲明、運(yùn)算符聲明、構(gòu)造函數(shù)聲明、析構(gòu)函數(shù)聲明、靜態(tài)構(gòu)造函數(shù)、類型聲明等直接從基類繼承而來的成員7一、成員類型:靜態(tài)成員在字段、方法、屬性、事件、運(yùn)算符和構(gòu)造函數(shù)聲明中含有public

static修飾符實(shí)例成員在字段、方法、屬性、事件、運(yùn)算符和構(gòu)造函數(shù)聲明中不含有public

static修飾符二、默認(rèn)成員訪問修飾符——private8類成員注意點(diǎn):class

Program{class

AClass{public

static

int

x=1;public

int

y=2;}static

void

Main(string[]

args){AClass

ab

=

new

AClass();Console.WriteLine("y={0},x={1}",ab.y,AClass.x);}}9101.常數(shù)聲明語法形式:[屬性集信息] [常數(shù)修飾符] const類型

標(biāo)識(shí)符

=

常數(shù)表達(dá)式

[,

…]常數(shù)修飾符——new、public、protected、private

、internalpublic:訪問不受限制protected:訪問僅限于包含類或從包含類派生的類型internal:訪問僅限于當(dāng)前程序集。

private:訪問僅限于包含類。類型——sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、decimal、bool、string、枚舉類型或引用類型。常數(shù)表達(dá)式的值類型應(yīng)與目標(biāo)類型一致,或者通過隱式轉(zhuǎn)換規(guī)則轉(zhuǎn)換成目標(biāo)類型。11例如:class

A_const//默認(rèn)訪問修飾符private{public

const

int

X=10;const

double

PI=3.14159;const

double

Y=

0.618+3.14;}注意1.常數(shù)表達(dá)式的值是一個(gè)可以在編譯時(shí)計(jì)算的值注意2.常數(shù)聲明不允許使用static修飾符,只能通過類訪問。class

Test{public

static

void

Main(

){A_const

m

=

new

A_const

(

);Console.WriteLine

(“X={0},

PI={1},Y={2}”,

A_const.X

,

A_const.PI,A_const.Y);}}122.字段聲明語法形式:[屬性集信息] [字段修飾符]

類型

變量聲明列表;變量聲明列表——標(biāo)識(shí)符或用逗號(hào)“,”分隔的多個(gè)標(biāo)識(shí)符,并且變量標(biāo)識(shí)符還可用賦值號(hào)“=”設(shè)定初始值。字段修飾符——new、public、protected、private、internal、static、readonly、volatilestatic:靜態(tài)變量。利用類直接訪問靜態(tài)變量,利用類的實(shí)例(對(duì)象)訪問非靜態(tài)變量readonly:只讀變量,聲明時(shí)或在構(gòu)造函數(shù)中賦值,一旦賦值不可改變。與const常量不同,const常量編譯時(shí)賦值計(jì)算。volatile:表示字段可能被多個(gè)并發(fā)執(zhí)行的進(jìn)程修改。13【例3.1】通過構(gòu)造函數(shù)給只讀字段賦值//Radius是只讀字段//通過構(gòu)造函數(shù)對(duì)radius賦值usingSystem;public

class

Area{public

readonly

double

Radius;private

double

x,

y

;public

double

Size

;public

static

double

Sum=0.0

;public

Area

(

){Radius=1.0;}}class

Test{publicstaticvoidMain(){Area

s1

=

new

Area(

);//s1.Radius

=

2;Console.WriteLine

("Radius={0},Size={1},Sum={2}",s1.Radius,s1.Size

,

Area.Sum);//靜態(tài)字段通過類訪問Area.Sum,實(shí)例字段通過對(duì)象訪問s1.SizeConsole.Read();}}出錯(cuò)了!無法修改只讀字段3.2.3

構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)象初始化分為實(shí)例構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)函數(shù)調(diào)用時(shí)機(jī):new1)實(shí)例構(gòu)造函數(shù)的聲明語法形式:[屬性集信息]

[構(gòu)造函數(shù)修飾符]

標(biāo)識(shí)符

(

[參數(shù)列表]

)[:

base

(

[參數(shù)列表]

)

] [:

this

(

[參數(shù)列表]

)

]{構(gòu)造函數(shù)語句塊}public與類名相同沒有返回值構(gòu)造函數(shù)重載:參數(shù)個(gè)數(shù)或類型不同調(diào)用基類同參數(shù)列表的構(gòu)造函數(shù)14調(diào)用本類同參數(shù)列表的構(gòu)造函數(shù)15構(gòu)造函數(shù)修飾符——public、protected、internal、private、extern一般地,構(gòu)造函數(shù)總是public類型的。如果是private類型的,表明類不能被外部類實(shí)例化。標(biāo)識(shí)符([參數(shù)列表]opt)——構(gòu)造函數(shù)名 必須與這個(gè)類同名,無返回類型和返回值構(gòu)造函數(shù)可以有0~n個(gè)參數(shù)——構(gòu)造函數(shù)重載用new運(yùn)算符創(chuàng)建一個(gè)類的對(duì)象時(shí),類名后的一對(duì)圓括號(hào)提供初始化列表,系統(tǒng)根據(jù)這個(gè)初始化列表的參數(shù)個(gè)數(shù)、參數(shù)類型和參數(shù)順序調(diào)用不同的構(gòu)造函數(shù)。實(shí)例構(gòu)造函數(shù)注意點(diǎn):16class

Test{static

void

Main(){Time

t1,

t2,

t3,

t4

;//對(duì)t1,t2,t3,t4分別調(diào)用不同的構(gòu)造函數(shù)t1=

new

Time

();t2

=

new

Time(8);t3

=

new

Time(8,

30);

t4

=

new

Time(8,30,30);}}【例3.2】Time類的構(gòu)造函數(shù)及其重載using

System;public

class

Time{private

int

hour,

minute,

second;public

Time

(

){hour=minute=second=0;}public

Time

(int

h){hour=h;minute=second=0;}public

Time

(int

h,

int

m){hour=h;minute=m;second=0;}public

Time

(int

h,

int

m,

int

s){hour=h;nute=m;cond=s;}}mi

public

string

getTime()se

{returnhour.ToString()+":"+minute.ToString()+":"+second.ToString();}Console.WriteLine("t1={0}",t1.getTime());17【例3.3】構(gòu)造函數(shù)初始化usingSystem;class

Point{public

double

x,

y;public

Point(

){x

=

0; y

=

0;}public

Point(double

x,

double

y){this.x

=

x;this.y=

y;//當(dāng)this在實(shí)例構(gòu)造函數(shù)中使用時(shí),//它的值就是對(duì)該構(gòu)造的對(duì)象的引用}}class

Test{public

static

void

Main(

){Point

a

=

new

Point(

);Point

b=new

Point(3,

4);//

用構(gòu)造函數(shù)初始化對(duì)象Console.WriteLine

("a.x={0},

a.y={1}",

a.x,

a.y

);Console.WriteLine

("b.x={0},

b.y={1}",

b.x,

b.y

);Console.Read

();}}a.x=0,

a.y=0b.x=3,

b.y=4構(gòu)造函數(shù)注意點(diǎn):若類中沒有提供構(gòu)造函數(shù),則CLR會(huì)自動(dòng)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)一旦類中提供了自定義的構(gòu)造函數(shù),系統(tǒng)則不提供默認(rèn)的構(gòu)造函數(shù)不必顯示調(diào)用構(gòu)造函數(shù)實(shí)例構(gòu)造函數(shù)不能被繼承18派生類構(gòu)造函數(shù)的調(diào)用調(diào)用時(shí)機(jī):創(chuàng)建派生類的對(duì)象時(shí),即new構(gòu)造函數(shù)不被繼承派生類構(gòu)造函數(shù)在執(zhí)行前,首先顯式或隱式地調(diào)用基類構(gòu)造函數(shù)默認(rèn)調(diào)用基類的無參數(shù)構(gòu)造函數(shù)除非顯式地指定調(diào)用有參數(shù)構(gòu)造函數(shù)this關(guān)鍵字引用類的當(dāng)前實(shí)例base關(guān)鍵字用于從派生類中訪問基類的成員調(diào)用基類上已被其他方法重寫的方法指定創(chuàng)建派生類實(shí)例時(shí)應(yīng)調(diào)用的基類構(gòu)造函數(shù)19【例3.4】派生類構(gòu)造函數(shù)及其調(diào)用using

System;class

Point{private

int

x,

y;public

Point(){x

=

0; y

=

0;Console.WriteLine

("Point()

constructor

:

{0}

",

this

);}public

Point(int

x,

int

y){this.x

=

x;this.y

=

y;);Console.WriteLine

("Point(x,y)

constructor

:

{0}

",

this}}class

Circle

:

Point{//默認(rèn)約定調(diào)用基類的無參構(gòu)造函private

double

radius;public

Circle

(){數(shù)Point()this

);{0}

",

this

);20Console.WriteLine

("Circle

()

constructor

:

{0}

",

this

);}public

Circle

(double

radius

):

base

(

){this.radius

=

radius;Console.WriteLine

("Circle

(radius)

constructor

:

{0}

",}public

Circle

(int

x,

int

y,

double

radius

):

base

(x,

y

){this.radius

=

radius;Console.WriteLine

("Circle

(x,

y,

radius)

constructor

:}}class

Test{static

void

Main(){Point

a

=

new

Point();Circle

b

=

new

Circle

(3.5);Circle

c

=

new

Circle

(1,

1,

4.8);Console.Read

();132}}54212)靜態(tài)構(gòu)造函數(shù)的聲明語法形式:[屬性集信息] [靜態(tài)構(gòu)造函數(shù)修飾符]

標(biāo)識(shí)符(){靜態(tài)構(gòu)造函數(shù)體}靜態(tài)構(gòu)造函數(shù)修飾符——[extern]static

或者static

[extern]。如有extern修飾,則是一個(gè)外部靜態(tài)構(gòu)造函數(shù),不提供任何實(shí)際的實(shí)現(xiàn),靜態(tài)構(gòu)造函數(shù)體僅僅是一個(gè)分號(hào)標(biāo)識(shí)符——是靜態(tài)構(gòu)造函數(shù)名,必須與類同名且不能有參數(shù)靜態(tài)構(gòu)造函數(shù)體——只能對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行初始化22靜態(tài)構(gòu)造函數(shù)注意點(diǎn):靜態(tài)構(gòu)造函數(shù)不可繼承,不能直接調(diào)用調(diào)用時(shí)機(jī):創(chuàng)建類的實(shí)例引用類的任何靜態(tài)成員至多被執(zhí)行一次若類沒有聲明靜態(tài)構(gòu)造函數(shù),而又包含帶有初始設(shè)定的靜態(tài)字段時(shí),編譯器會(huì)自動(dòng)生成一個(gè)默認(rèn)的靜態(tài)構(gòu)造函數(shù)232.析構(gòu)函數(shù)語法形式:[屬性集信息] [

extern

]~標(biāo)識(shí)符

(

){析構(gòu)函數(shù)體}標(biāo)識(shí)符——必須與類名相同,前面需加“~”析構(gòu)函數(shù)——不能寫返回類型,也不能帶參數(shù),一個(gè)類最多只能有一個(gè)析構(gòu)函數(shù)析構(gòu)函數(shù)注意點(diǎn)析構(gòu)函數(shù)不能由程序顯式地調(diào)用,而是由系統(tǒng)在釋放對(duì)象時(shí)自動(dòng)調(diào)用派生類對(duì)象的析構(gòu)函數(shù)調(diào)用鏈:執(zhí)行派生類的析構(gòu)函數(shù)執(zhí)行基類的析構(gòu)函數(shù),直到調(diào)用object類的析構(gòu)函數(shù)為止24與執(zhí)行構(gòu)造函數(shù)的順序相反第3章 面向?qū)ο缶幊袒A(chǔ)理解基本概念理解類使用構(gòu)造函數(shù)學(xué)習(xí)方法學(xué)習(xí)屬性掌握25回顧對(duì)象——具有屬性和操作(方法)的實(shí)體類——對(duì)象的抽象,抽象的數(shù)據(jù)類型類是對(duì)象的模板對(duì)象是類的具體化或類的實(shí)例26類的成員271.類體中以類成員聲明形式引入的類成員包括:常數(shù)聲明、字段聲明、構(gòu)造函數(shù)聲明、析構(gòu)函數(shù)聲明、靜態(tài)構(gòu)造函數(shù)、方法聲明、

屬性聲明等2.直接從基類繼承而來的成員訪問修飾符28public訪問不受限制protected只能被本身或派生類的實(shí)例訪問private只能被本身訪問static靜態(tài),非實(shí)例構(gòu)造函數(shù)29構(gòu)造函數(shù)——實(shí)例構(gòu)造函數(shù)與類名同名在類進(jìn)行new運(yùn)算(即類實(shí)例化時(shí))this

:引用當(dāng)前類的實(shí)例base:用于從派生類中訪問基類的成員調(diào)用基類上已被其他方法重寫的方法指定創(chuàng)建派生類實(shí)例時(shí)應(yīng)該調(diào)用的基類構(gòu)造函數(shù)調(diào)用順序先基類后派生類303.3

方法3.3.1

方法的聲明語法形式:[屬性集信息] [方法修飾符]

返回類型

方法名(

[形參表]){方法體}C#中所有的變量、方法都必須封裝在類中對(duì)象間、類間只能通過類所提供的方法進(jìn)行互操作從方法的聲明、方法的參數(shù)、靜態(tài)方法與實(shí)例方法、方法的重載與覆蓋等方面理解31表3.2

方法修飾符修飾符作用說明new在一個(gè)繼承結(jié)構(gòu)中,用于隱藏基類同名的方法public表示該方法可以在任何地方被訪問,默認(rèn)publicprotected表示該方法可以在它的類體或派生類類體中被訪問,但不能在類體外訪問private表示該方法只能在這個(gè)類體內(nèi)被訪問internal表示該方法可以被同處于一個(gè)工程的文件(程序集)訪問static表示該方法屬于類本身,而不屬于某特定對(duì)象virtual表示該方法可在派生類中重寫,來更改該方法的實(shí)現(xiàn)abstract表示該方法僅僅定義了方法名及執(zhí)行方式,但沒有給出具體實(shí)現(xiàn),所以包含這種方法的類是抽象類,有待于派生類的實(shí)現(xiàn)override表示該方法是將從基類繼承的virtual方法的新實(shí)現(xiàn)sealed表示這是一個(gè)密封方法,它必須同時(shí)包含override修飾,以防止它的派生類進(jìn)一步重寫該方法extern表示該方法從外部實(shí)現(xiàn)32表3.3

修飾符的無效組合修飾符不能與下列選項(xiàng)一起使用staticvirtual、abstract

和overridevirtualstatic、abstract

和overrideoverridenew、static和virtualabstractvirtual

和staticnewoverrideextern

abstract返回類型——方法可以返回值也可以不返回值。返 回值類型為任意一種C#的數(shù)據(jù)類型,通過return語句返回。如果方法不返回值,則它的返回類型可標(biāo)為void,默認(rèn)情況下為void方法名:除Main()、關(guān)鍵字以外33【例3.6】下面程序中的StackTp類定義了幾個(gè)方法以模擬實(shí)現(xiàn)一個(gè)壓棧操作。using

System;class

StackTp{int

MaxSize;int

Top;int

[

]

StkList;//構(gòu)造函數(shù)public

StackTp

(

){MaxSize=100;Top=0;StkList=new

int

[MaxSize];構(gòu)造函數(shù)}public

StackTp(int

size)

//{MaxSize=size;Top=0;StkList=new

int

[MaxSize];//方法}public

bool

isEmptyStack(){if

(Top==0)elsereturn

true;return

false;}public

bool

isFullStack(){if(Top==MaxSize)

returntrue;else return

false;}public

void

push(int

x){StkList[Top]=x;Top++;}}class

Test{public

static

void

Main(){StackTp

ST

=

new

StackTp(20);string

s1;if(ST.isEmptyStack())//調(diào)用方法s1="Empty";elses1="not

Empty";Console.WriteLine

("Stack

is

"

+

s1);for

(int

i=0;

i<20;

i++)ST.push(i+1);if(ST.isFullStack())//調(diào)用方法s1="Full";elses1="not

Full";Console.WriteLine

("Stack

is

"

+

s1);Console.Read

();}}343.3.2

方法的參數(shù)形參(形式參數(shù)):聲明方法時(shí)包含的方法參數(shù)說明實(shí)參(實(shí)際參數(shù)):調(diào)用方法時(shí)給出的實(shí)際參數(shù)在C#中實(shí)參與形參有4種傳遞方式:值參數(shù)引用參數(shù)——ref輸出參數(shù)——out參數(shù)數(shù)組——params1.值參數(shù)在方法聲明時(shí)不加修飾的形參就是值參數(shù),它表明實(shí)參與形參之間按值傳遞在方法中對(duì)形參的修改不影響外部的實(shí)參屬于輸入?yún)?shù)35using

System;class

Myclass{public

void

Sort

(intx,

inty,int

z){int

tmp;//tmp是方法Sort的局部變量//將x,

y,z按從小到大排序

if(x>y){tmp=x;

x=y; y=tmp;

}if(x>z){tmp=x;

x=z; z=tmp;

}if(y>z){tmp=y;

y=z; z=tmp;

}//Console.WriteLine(“x={0},y={1},

z={2}"

x,y,z);}}class

Test{static

void

Main(){Myclass

m

=

new

Myclass

(

);int

a,

b,

c;a=30;

b=20;

c=10;m.Sort

(a,

b,

c);Console.WriteLine

("a={0},b={1},

c={2}"

,

a,

b,

c

);Console.Read

();}}【例3.7】演示了當(dāng)方法Sort傳遞的是值參數(shù)時(shí),對(duì)形參的修改不影響其實(shí)參。36是值參數(shù)傳遞方式,形參另外分配一塊內(nèi)存,接受實(shí)參的引用值副本對(duì)引用值的修改不會(huì)影響實(shí)參

如果改變的是所引用的對(duì)象,則將會(huì)影響實(shí)參所引用的對(duì)象值參數(shù)——傳遞引用對(duì)象內(nèi)存首地址37class

Test{static

void

Main(){Myclass

m

=

new

Myclass

(

);int

[

]

score

={

87,89,56,90,100,75,64,45,

80,

84}

;m.SortArray(score);for

(int

i=0;i<score.Length;i++){Console.Write

("score[{0}]={1},"

,

i

,

score[i]

);if

(i==4)

Console.WriteLine

();}Console.Read

();}}【例3.8】程序演示的是當(dāng)方法傳遞的是一個(gè)引用對(duì)象(如數(shù)組)時(shí),對(duì)形參的修改會(huì)影響到實(shí)參using

System;class

Myclass{public

void

SortArray

(int

[

]

a){int

i,

j,

pos,tmp;for

(i=0;

i<a.Length-1

;

i++){for

(pos=j=i;

j<a.Length;

j++)if(a

[pos]>a

[j])pos=j;

查詢最小值if

(pos

!=

i

){tmp=a[i];a[i]=a[pos];a[pos]=tmp;}}}}改變了引用的對(duì)象832.

引用參數(shù)引用參數(shù)——形參的改變影響實(shí)參1.例3.7中實(shí)際變量a、b、c是不隨形參x、y、z的,但如果想改變實(shí)際變量a、b、c的值,則用引用參數(shù)39using

System;class

Myclass{public

void

Sort

(intx,

inty,int

z){int

tmp;//tmp是方法Sort的局部變量//將x,

y,z按從小到大排序

if(x>y){tmp=x;

x=y; y=tmp;

}if(x>z){tmp=x;

x=z; z=tmp;

}if(y>z){tmp=y;

y=z; z=tmp;

}//Console.WriteLine(“x={0},y={1},

z={2}"

x,y,z);}}class

Test{static

void

Main(){Myclass

m

=

new

Myclass

(

);int

a,

b,

c;a=30;

b=20;

c=10;m.Sort

(a,

b,

c);Console.WriteLine

("a={0},b={1},

c={2}"

,

a,

b,

c

);Console.Read

();}}【例3.7】演示了當(dāng)方法Sort傳遞的是值參數(shù)時(shí),對(duì)形參的修改不影響其實(shí)參。42.

引用參數(shù)0引用參數(shù)——形參的改變影響實(shí)參例3.7中實(shí)際變量a、b、c是不隨形參x、y、z的,但如果想改變實(shí)際變量a、b、c的值,則用引用參數(shù)C#用ref修飾符聲明引用參數(shù)引用參數(shù)不創(chuàng)建新的存儲(chǔ)單元,與方法調(diào)用中的實(shí)際參數(shù)變量同處一個(gè)存儲(chǔ)單元——傳遞內(nèi)存地址屬于輸入?yún)?shù)【例3.9】將例3.7程序中Sort方法的值參數(shù)傳遞方式改成引用參數(shù)傳遞,這樣在方法Sort中對(duì)參數(shù)x、y、z按從小到大的排序影響了調(diào)用它的實(shí)參a、b、c。using

System;class

Myclass{public

void

Sort

(ref

int

x, ref

int

y,

refint

z){int

tmp;//tmp是方法Sort的局部變量//

將x,

y,

z按從小到大排序if

(x>y)

{

tmp=x;

x=y; y=tmp;

}if

(x>z)

{

tmp=x;

x=z; z=tmp;

}if

(y>z)

{

tmp=y;

y=z; z=tmp;

}}}class

Test{static

void

Main(){Myclass

m

=

new

Myclass

(

);int

a,

b,

c;a=30;

b=20;

c=10;m.Sort

(ref

a,

ref

b,

ref c);Console.WriteLine

("a={0},

b={1},c={2}",

a,

b,

c

);Console.Read();}}414使用ref聲明引用參數(shù)的注意:2方法的參數(shù)聲明中ref關(guān)鍵字僅對(duì)緊跟在它后面的參數(shù)有效,而不能應(yīng)用于整個(gè)參數(shù)表。例如,Sort方法中x、y、z都要加ref修飾在方法的調(diào)用中也要用ref修飾實(shí)參,且實(shí)參必須為變量,實(shí)參和形參的數(shù)據(jù)類型必須完全匹配在方法外(方法調(diào)用前),ref參數(shù)必須明確賦值ref參數(shù)也可以用于傳遞引用類型的對(duì)象第3章面向?qū)ο缶幊袒A(chǔ)43輸出參數(shù)——out參數(shù)數(shù)組——params方法方法聲明——如同C語言的“函數(shù)”訪問修飾符默認(rèn)為public方法參數(shù)值參數(shù)(值類型、引用類型)引用參數(shù)——ref方法重載與覆蓋方法簽名方法覆蓋——new

和虛方法virtual

override屬性propertyget訪問器set訪問器443.輸出參數(shù)45用法與ref參數(shù)相似,但為輸出參數(shù)值只能用于從方法中傳出值,因此必須在方法結(jié)束之前對(duì)out參數(shù)賦值在參數(shù)前加out修飾符的形式參數(shù)out參數(shù)也可以用于傳遞引用類型的對(duì)象46class

Test{static

void

Main(){Myclassm=

newMyclass(

);int

[

]

score

={

87,89,56,90,100,75,64,45,

80,

84}

;int

smax,smin;double

savg;m.MaxMinArray(score,outsmax,

out

smin,

out

savg);Console.Write

("Max={0},Min={1},

Avg={2}

"

,

smax,smin,savg

);Console.Read

();}}【例3.10】求一個(gè)數(shù)組中元素的最大值、最小值和平均值。using

System;class

Myclass{public

void

MaxMinArray

(int

[

]

a,out

int

max,

out

int

min,

out

double

avg

){int

sum

;sum

=

max

=

min

=

a[0]

;

for

(int

i=1;

i<a.Length

;

i++){if

(a[i]>max)

max=a[i];if

(a[i]<min)

min=a[i];sum+=a[i];}avg=sum

/

a.Length;}}47【例3.11】下面程序定義了兩個(gè)方法,一個(gè)是Swap1,一個(gè)是Swap2,它們都有兩個(gè)引用對(duì)象作為參數(shù),但Swap2的參數(shù)加了ref修飾,調(diào)用這兩個(gè)方法產(chǎn)生的結(jié)果是不一樣的。usingSystem;class

Myclass{public

void

Swap1

(string

s,

string

t){string

tmp;tmp=s;

s=t;t=tmp;}public

void

Swap2

(ref

string

s,

refstring

t){string

tmp;tmp=s;

s=t;t=tmp;}}class

Test{static

void

Main(){Myclass

m

=

new

Myclass

(

);string

s1="ABCDEFG",

string

s2="134567";m.Swap1(s1,s2);Console.WriteLine

("s1={0}"

,

s1

);Console.WriteLine

("s2={0}"

,

s2

);m.Swap2(ref

s1,

ref

s2);Console.WriteLine

("s1={0}"

,

s1

);Console.WriteLine

("s2={0}"

,

s2

);Console.Read

();}}s1,s2的引用并沒有改變s1,s2的引用互相交換了484.參數(shù)數(shù)組特點(diǎn):參數(shù)為可變長度使用params關(guān)鍵字來指定一個(gè)可變長度的參數(shù)表注意:一個(gè)方法中只能聲明一個(gè)params參數(shù)params參數(shù)必須放在參數(shù)表最后params參數(shù)是一個(gè)一維數(shù)組,參數(shù)數(shù)組的參數(shù):0~nparams不可與ref、out修飾符組合使用3.3.3

靜態(tài)方法與實(shí)例方法靜態(tài)方法用static修飾只能訪問類中的靜態(tài)成員49【例3.12】下面程序演示了Myclass類中的方法MaxMin有一個(gè)參數(shù)數(shù)組類型的參數(shù),在調(diào)用這個(gè)方法時(shí)具有靈活性。usingSystem;class

Myclass{public

void

MaxMin

(out

int

max,

outint

min,

paramsint

[

]

a){//如果可變參數(shù)為零個(gè),//取一個(gè)約定值或產(chǎn)生異常if

(a.Length==0){max=min=-1;return

;}max=

min

=

a[0]

;for(int

i=1;

i<a.Length

;

i++){if

(a[i]>max)

max=a[i];if

(a[i]<min)

min=a[i];}}}class

Test{static

void

Main(){Myclassm=

newMyclass();int

[]

score

=

{

87,89,56,90,100,75,64,45,

80,

84}int

smax,smin;m.MaxMin

(outsmax,outsmin);//可變參數(shù)的個(gè)數(shù)可以是零個(gè)Console.WriteLine

("Max={0},

Min={1}

"

,

smax,smin

);m.MaxMin(outsmax,outsmin,

45,76,89,90);//在4個(gè)數(shù)之間找最大、最小Console.WriteLine

("Max={0},

Min={1}

"

,

smax,smin

);m.MaxMin

(out

smax,

out

smin,

score);

//可變參數(shù)也可接受數(shù)組對(duì)象Console.WriteLine

("Max={0},

Min={1}

"

,

smaxsmin

);Console.Read

();}}503.3.4

方法的重載與覆蓋方法重載同一個(gè)類中存在具有相同方法名,但具有不同的形式參數(shù)個(gè)數(shù)、修飾符及類型的兩個(gè)或兩個(gè)以上的方法。重載是多態(tài)的形式之一。編譯時(shí)根據(jù)調(diào)用時(shí)給出的實(shí)參個(gè)數(shù)和類型調(diào)用相應(yīng)的方法,以實(shí)現(xiàn)多態(tài)方法簽名:方法名、形參個(gè)數(shù)、形參修飾符、形參類型一起構(gòu)成方法簽名51【例3.14】下面程序定義的Myclass類中含有4個(gè)名為max的方法,但它們或者參數(shù)個(gè)數(shù)不同,或者參數(shù)類型不同,在Main調(diào)用該方法時(shí),編譯器會(huì)根據(jù)參數(shù)的個(gè)數(shù)和類型確定調(diào)用哪個(gè)max方法。usingSystem;class

Myclass{public

int

max(int

x,

int

y){return

x>=y

?

x

:

y

;}public

double

max(double

x,

double

y){returnx>=y?x:

y;}public

int

max

(int

x,

int

y,

int

z){returnmax

(

max(x,

y),

z)

;}public

double

max

(

double

x,

double

y,double

z){returnmax

(

max(x,

y),

z)

;}}class

Test{staticvoidMain(){Myclass

m

=newMyclass();int

a,

b,

c;double

e,

f,

g

;a=10;

b=20;

c=30;e=

1.5;

f

=

3.5;

g

=

5.5;Console.WriteLine

("max({0},{1})=

{2}

",a,b,

m.max(a,b));Console.WriteLine

("max({0},{1},{2})={3}

"

,a,b,c,

m.max(a,b,c));Console.WriteLine

("max({0},{1})=

{2}"e,f,m.max(e,f));Console.WriteLine

("max({0},{1},{2})={3}

"

,e,f,g,

m.max(e,f,g));Console.Read

();}}52方法的覆蓋——使用new隱藏有相同簽名的方法當(dāng)派生類與基類有相同名稱或簽名的成員時(shí),在派生類中默認(rèn)隱藏基類成員,但提示警告在派生類成員聲明中加new修飾符,可以取消警告信息基類對(duì)象被引用到派生類對(duì)象時(shí),訪問的仍是基類的方法靜態(tài)多態(tài)53【例3.15】定義了一個(gè)基類Shape,含有字段域width和height,分別表示形狀的寬和高,并定義了一個(gè)area方法,求形狀的面積。它的派生類Triangle和Trapezia都用關(guān)鍵字new修飾了area方法using

System;class

Shape{

protected

double

width;protected

double

height;public

Shape(

){

width=height=0;

}public

Shape(double

x){

width=height=x;

}public

Shape(double

w,

double

h

){

width=w;height=h;

}public

double

area

(){ return

width*height;

}//三角形}class

Triangle

:

Shape{public

Triangle

(double

x,

double

y):base(x,y){

}new

public

double

area

()//派生類方法與基類方法同名,編譯時(shí)會(huì)有警告信息{ return

width*height/2

;

}}class

Trapezia:Shape

//梯形{ double

width2

;public

Trapezia(double

w1,

double

w2,

doubleh)

:

base

(w1,

h)

{ width2=w2;

}new

public

double

area

(

)//加new隱藏基類的area方法{ return

(width+width2)*height/2

;

}}class

Test{static

void

Main(){Shape

A

=

new

Shape(2,

4);Triangle

B

=

new

Triangle(1,

2);Trapezia

C

=

new

Trapezia(2,

3,4);Console.WriteLine("A.area=

{0}

",

A.area());//調(diào)Shape的area方法Console.WriteLine("B.area=

{0}

",

B.area());//調(diào)Triangle的area方法Console.WriteLine("C.area=

{0}

",

C.area());//調(diào)Trapezia的area方法A

=

B;//在C#中,基類的引用也能夠引用派生類對(duì)象Console.WriteLine("A.area=

{0}

",

A.area());//調(diào)Shape的area方法A

=

C;Console.WriteLine("A.area=

{0}

",

A.area());//調(diào)Shape的area方法Console.Read();}}基類方法45虛方法:基類的方法用關(guān)鍵字virtual修飾對(duì)基類的虛方法重載:派生類用關(guān)鍵字

override修飾與基類中虛方法有相同簽名的方法注意:不能將虛方法聲明為靜態(tài)的(static)不能將虛方法聲明為私有的(private)覆蓋方法必須與它相關(guān)的虛方法匹配一個(gè)覆蓋方法覆蓋的必須是虛方法實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)(動(dòng)態(tài)綁定)55【例3.16】將例3.15改寫,Shape類中的方法area用virtual修飾,而派生類Triangle和Trapezia用override修飾area方法。using

System;class

Shape{protected

double

width;protected

double

height;public

Shape(

){

width=height=0;

}public

Shape(double

x){

width=height=x;

}public

Shape(double

w,

double

h

){ width=w;

height=h;

}public

virtual

double

area

(

)//基類中用virtual修飾符聲明一個(gè)虛方法{ return

width*height;

}//三角形}class

Triangle:

Shape{public

Triangle

(double

x,

double

y):base(x,y){

}public

override

double

area

(

)//派生類中用override修飾符覆蓋基類虛方法{ return

width*height/2

;

}}class

Trapezia:Shape//梯形{ double

width2

;public

Trapezia(double

w1,

double

w2,

double

h)

:base

(w1,

h){

width2=w2;}public

override

double

area

(

)派生類中用override修飾符覆蓋基類虛方法{ return

(width+width2)*height/2

;

}class

Test{static

voidMain(){Shape

A

=

new

Shape(2,

4);Triangle

B

=

new

Triangle(1,

2);Trapezia

C

=

new

Trapezia(2,

3,

4);Console.WriteLine("A.area=

{0}

",A.area());

//調(diào)Shape的area方法Console.WriteLine("B.area=

{0}

",B.area());

//調(diào)Triangle的area方法Console.WriteLine("C.area=

{0}

",C.area());

//調(diào)Trapezia的area方法A

=B;Console.WriteLine("A.area=

{0}

",A.area());

//調(diào)派生類Triangle的area方法

A=C;Console.WriteLine("A.area=

{0}

",A.area());

//調(diào)派生類Trapezia的area方法

Console.Read();}}派生類方法563.4

屬性property1.回顧一下例3.2(P51)。①為了實(shí)現(xiàn)良好的數(shù)據(jù)封裝和數(shù)據(jù)隱藏,類的字段成員的訪問屬性一般設(shè)置成

private(默認(rèn))或protected②利用public

方法來訪問私有的或受保護(hù)的字段57public

string

getTime(){returnhour.ToString()+":"+minute.ToString()+":"+second.ToString();}【例3.2】Time類的構(gòu)造函數(shù)及其重載using

System;public

class

Time{private

int

hour,

minute,

second;public

Time

(

){hour=minute=second=0;}public

Time

(int

h){hour=h;minute=second=0;}public

Time

(int

h,

int

m){hour=h;minute=m;second=0;}public

Time

(int

h,

int

m,

int

s){hour=h;minute=m;second=s;}}class

Test{static

void

Main(){Time

t1,

t2,

t3,

t4

;t1=

new

Time

();

t2

=

new

Time(8);t3

=

new

Time(8,

30);

t4

=

new

Time(8,30,30);t1.getTime();

t2.getTime();t3.getTime();

t4.getTime();}}583.4

屬性1.

保持原有的數(shù)據(jù)封裝和數(shù)據(jù)隱藏,類的字段成員的訪問屬性仍然設(shè)置成private(默認(rèn))或protected?????2.

不利用public方法來訪問私有的或受保護(hù)的字段屬性(property)①屬性值的讀/寫與字段域語法相同;②利用get和set訪問器實(shí)現(xiàn)屬性值的讀/寫如何做??59語法形式:[屬性集信息] [屬性修飾符]

類型

成員名{訪問器聲明}屬性修飾符——與方法修飾符(public,private,protected,…)相同,包括new、static、virtual、abstract、override和4種訪問修飾符的合法組合,遵循相同的規(guī)則。訪問器聲明——聲明屬性的訪問器,get訪問器或set訪問器,或者兩個(gè)語法形式:get

//讀訪問器{…

//訪問器語句塊}set

//寫訪問器{…

//訪問器語句塊}屬性的聲明方法60get訪問器返回值類型與屬性的類型相同在語句塊中的return語句必須有一個(gè)可隱式轉(zhuǎn)換為屬性類型的表達(dá)式set訪問器沒有返回值有一個(gè)隱式的值參數(shù)value,類型與屬性的類型相同。屬性的種類讀/寫屬性:同時(shí)包含get和set訪問器的屬性只讀/只寫屬性:只包含get或set訪問器的屬性屬性中的訪問器使用注意61【例3.17】對(duì)TextBox類的text、fontname、fontsize、multiline域提供屬性方式的讀/寫訪問。using

System;class

TextBox{private

string

text;private

int

fontsize;

private

bool

multiline;public

TextBox

(

){text="text1";fontsize=12;fontname="宋體";multiline=false;}public

string

Text{

//

Text屬性,可讀可寫get

{

return

text;

}set

{

text=value;

}}public

string

FontName{ //

FontName屬性,只讀屬性get

{ return

fontname;

}}public

int

FontSize{

//FontSize屬性,可讀可寫

get{return

fontsize;}

set{fontsize=value;}}public

bool

MultiLine{

//MultiLine屬性,只寫

set{multiline=value;}}}class

Testprivate

string

fontname;

{static

void

Main(){TextBox

Text1=

new

TextBox

();//調(diào)用Text屬性的get訪問器Console.WriteLine("Text1.Text={0}",Text1.Text);Text1.Text="這是文本框";//調(diào)用Text屬性的set訪問器Console.WriteLine

("Text1.Text=

{0}

"

,

Text1.Text);Console.WriteLine

("Text1.Fontname=

{0}

"

,Text1.FontName);Text1.FontSize=36;Text1.MultiLine

=

true;Console.WriteLine

("Text1.FontSize=

{0}

"

,Text1.FontSize);Console.Read

();}}62【例3.18】定義Label類,設(shè)置Width和Heigh屬性,分別存放兩點(diǎn)之間在水平坐標(biāo)軸和垂直坐標(biāo)軸上的投影長度。using

System;class

Point{int

x,

y;public

int

X{get

{

return

x;

}}public

int

Y{get{

return

y;

}}public

Point

(

){

x=y=0;

}public

Point

(int

x,

int

y){this.x=x;this.y=y;}}class

Label{Point

p1=new

Point

(

);Point

p2=new

Point

(5,

10);public

int

Width//計(jì)算兩點(diǎn)之間在水平坐標(biāo)軸上的投影長度{get

{

return

p2.X-p1.X;

}}public

int

Height//計(jì)算兩點(diǎn)之間在垂直坐標(biāo)軸上的投影長度{ get

{

return

p2.Y-p1.Y;

}}}class

Test{static

void

Main(){Label

Label1=

new

Label

();Console.WriteLine

("Label1.Width=

{0}

",

Label1.Width);Console.WriteLine

("Label1.Height=

{0}

",

Label1.Height);Console.Read

();}}633.5

綜合應(yīng)用實(shí)例【例3.19】學(xué)生成績管理程序。根據(jù)學(xué)生選修的課程及課程學(xué)分和課程成績計(jì)算GPA,最后按GPA的值對(duì)學(xué)生進(jìn)行排序?;舅悸罚罕境绦虻膶W(xué)生總?cè)藬?shù)、課程名、課程學(xué)分可以由控制臺(tái)輸入,為敘述簡單,假定每個(gè)學(xué)生所選修的課程相同。Course類中定義了課程名、課程學(xué)分字段域,Name屬性、構(gòu)造函數(shù)。

Student類中定義字段:學(xué)生姓名、學(xué)號(hào)、選修課程數(shù)、Course類對(duì)象數(shù)組、成績和GPA等屬性:CourseNum靜態(tài)屬性、GPA屬性、Name屬性方法:SetCourse方法——設(shè)置課程名,靜態(tài)方法AddData方法——給每個(gè)學(xué)生加入姓名、學(xué)號(hào)、成績。

ComputeGPA

方法——計(jì)算學(xué)生成績的GPAstuSwap方法——對(duì)兩個(gè)Student對(duì)象內(nèi)容進(jìn)行交換。64//課程名//課程學(xué)分class

Course{string

courseName;int

courseMark;public

Course(){}public

Course(string

Name,

int

Mark){courseName=Name;courseMark=Mark;}//Name屬性,課程名可讀可寫public

string

Name{getreturn

courseName;}{set{courseName=value;

}//Mark屬性,課程學(xué)分可讀可寫returncourseMark;}courseMark=value;}}public

int

Mark{get{set{}}65class

Student{string

stuName;//學(xué)生姓名string

stuID;

//學(xué)生學(xué)號(hào)static

int

numberOfCourse;static

Course

[

]

list

;int[]stuScore;//每個(gè)學(xué)生對(duì)象的各課程成績//GPA值double

stuGPA;public

Student(){list=new

Course[numberOfCourse];for

(int

i=0;

i<numberOfCourse;i++)list[i]=new

Course();stuScore=new

int[numberOfCourse];}加static修飾符表明這個(gè)域?yàn)樗袑W(xué)生類對(duì)象共享Course類對(duì)象數(shù)組,用于設(shè)置每門課程名、課程學(xué)分66//將CourseNum定義成靜態(tài)屬性是因?yàn)樗粚?duì)靜態(tài)域進(jìn)行操作public

static

intCourseNum{get{set{return

numberOfCourse;

}numberOfCourse=value;

}//GPA屬性是只讀屬性}public

double

GPA{get{ return

stuGPA;

}//Name屬性可讀可寫}public

string

Name{getreturn

stuName;}{set{stuName=value;}}67//將SetCourse設(shè)為靜態(tài)方法,是因?yàn)樗鼉H訪問靜態(tài)數(shù)據(jù)域//不需要?jiǎng)?chuàng)建Student類對(duì)象就可直接用Student類名調(diào)用//它的形參是一個(gè)參數(shù)數(shù)組,這樣調(diào)用時(shí)就可根據(jù)實(shí)際選修的課程數(shù)來設(shè)置public

static

void

SetCourse(params

Course

[

]

topic){for

(int

i=0;

i<topic.Length

;

i++){list[i].Name

=topic[i].Name;list[i].Mark

=topic[i].Mark;}}//AddData方法將一個(gè)學(xué)生的數(shù)據(jù)添加到學(xué)生類對(duì)象數(shù)組中

public

void

AddData(string

name,

string

Id,

int[]score){stuName=name;stuID=Id;for

(int

i=0;i<score.Length;

i++)stuScore[i]=score[i];}68//根據(jù)課程的學(xué)分以及學(xué)生成績計(jì)算GPApublic

void

ComputeGPA()}{int

i;double

sMark,

sumMark=0,

sumGP=0;for

(i=0;i<stuScore.Length;i++){if

(stuScore[i]>=95)

sMark=4.5;else

if

(stuScore[i]>=90)

sMark=4;else

if

(stuScore[i]>=85)

sMark=3.5;else

if

(stuScore[i]>=80)

sMark=3;else

if

(stuScore[i]>=75)

sMark=2.5;else

if

(stuScore[i]>=70)

sMark=2;else

if

(stuScore[i]>=65)

sMark=1.5;else

if

(stuScore[i]==60)

sMark=1;else

sMark=0;sumGP+=list[i].Mark*sMark;sumMark+=list[i].Mark;}stuGPA=sumGP/sumMark;69//stuSwap方法提供兩個(gè)Student類對(duì)象的交換操作,注意形參被修飾為refpublic

void

stuSwap(ref

Student

stu1,ref

Student

stu2){string

name,Id;int

i;int

[]

score=new

int

[Student.CourseNum];double

gpa;name=stu1.Name;Id=stu1.stuID;gpa=stu1.GPA;f

溫馨提示

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

評(píng)論

0/150

提交評(píng)論