Java程序設(shè)計Java-03面向?qū)ο蟪绦蛟O(shè)計1_第1頁
Java程序設(shè)計Java-03面向?qū)ο蟪绦蛟O(shè)計1_第2頁
Java程序設(shè)計Java-03面向?qū)ο蟪绦蛟O(shè)計1_第3頁
Java程序設(shè)計Java-03面向?qū)ο蟪绦蛟O(shè)計1_第4頁
Java程序設(shè)計Java-03面向?qū)ο蟪绦蛟O(shè)計1_第5頁
已閱讀5頁,還剩148頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章Java面向?qū)ο蟪绦蛟O(shè)計-13.1面向?qū)ο蟪绦蛟O(shè)計方法概述3.2類與對象3.3對象初始化和回收3.4應(yīng)用舉例3.1面向?qū)ο蟪绦蛟O(shè)計方法概述對象(object)現(xiàn)實世界萬物皆對象都具有各自的屬性,對外界都呈現(xiàn)各自的行為

程序一切都是對象都具有標識(identity),屬性和行為(方法)通過一個或多個變量來保存其狀態(tài)通過方法(method)實現(xiàn)其行為3.1面向?qū)ο蟪绦蛟O(shè)計方法概述類(class)“人以類聚,物以群分”將屬性及行為相同或相似的對象歸為一類類可以看成是對象的抽象,是對象的集合,代表了此類對象所具有的共有屬性和行為。在面向?qū)ο蟮某绦蛟O(shè)計中,每一個對象都屬于某個特定的類。importjava.math.*;class

Circle{privatedouble

radius;

Circle(doublerads){radius=rads;}publicdoublegetArea(){

returnradius*radius*Math.PI;}}publicclassTestCircle{publicstaticvoidmain(String[]args){ Circlec=newCircle(20.0); System.out.println("Theareais:"+c.getArea());}}Demo:TestCircle.java3.1面向?qū)ο蟪绦蛟O(shè)計方法概述結(jié)構(gòu)化程序設(shè)計對應(yīng)的典型計算機語言,例如:C面向操作(action)的函數(shù)(方法)是程序的基本單位面向?qū)ο蟪绦蛟O(shè)計對應(yīng)的典型計算機語言,例如:Java面向?qū)ο?object)的類(class)是程序的基本單位方法(函數(shù))被封裝在類中數(shù)據(jù)也常常被封裝在類中3.1面向?qū)ο蟪绦蛟O(shè)計方法概述面向?qū)ο蟪绦蛟O(shè)計(Object-OrientedProgramming)與結(jié)構(gòu)化程序設(shè)計方法相比,更符合人類認識現(xiàn)實世界的思維方式已成為程序設(shè)計/軟件分析與設(shè)計的主流方向涉及的主要概念抽象——abstract封裝——encapsulation繼承——inheritance多態(tài)——polymorphism3.1.1抽象抽象(abstract)忽略問題中與當(dāng)前目標無關(guān)的方面,以便更充分地注意與當(dāng)前目標有關(guān)的方面計算機軟件開發(fā)中所使用的抽象有過程抽象數(shù)據(jù)抽象3.1.1抽象過程抽象將整個系統(tǒng)的功能劃分為若干部分,強調(diào)功能完成的過程和步驟,而隱藏其具體的實現(xiàn)基于過程抽象的兩個標準程序設(shè)計技術(shù)過程分解遞歸技術(shù)3.1.1抽象數(shù)據(jù)抽象將需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,抽象成不同的抽象數(shù)據(jù)類型每個抽象數(shù)據(jù)類型既包含了數(shù)據(jù),也包含了針對這些數(shù)據(jù)的操作相對于過程抽象,數(shù)據(jù)抽象是更為合理的抽象方法3.1.1抽象舉例1:鐘表-Clock數(shù)據(jù)(屬性)intHour;intMinute;intSecond;方法(行為)SetTime();ShowTime();3.1.1抽象舉例2:人-person數(shù)據(jù)(屬性)char*name;char*gender;intage;intid;方法(行為)生物行為Eat(),Step(),…社會行為Work(),Study(),…3.1.1抽象Javaimportjava.math.*;class

Circle{privatedoubleradius;

Circle(doublerads){radius=rads;}publicdouble

getArea(){

returnradius*radius*Math.PI;}}3.1.2封裝封裝(encapsulation)是一種信息隱蔽技術(shù)將數(shù)據(jù)和基于數(shù)據(jù)的操作封裝在一起用戶只能看到對象的封裝接口信息,對象的內(nèi)部細節(jié)對用戶是隱蔽的封裝的目的在于將對象的使用者和設(shè)計者分開,使用者不必知道行為實現(xiàn)的細節(jié),只需使用設(shè)計者提供的消息來訪問對象3.1.2封裝Javaimportjava.math.*;class

Circle{privatedoubleradius;

Circle(doublerads){radius=rads;}

publicdoublegetArea(){

returnradius*radius*Math.PI;}}3.1.2封裝封裝的定義清楚的邊界所有對象的內(nèi)部信息被限定在這個邊界內(nèi)接口對象向外界提供的方法,外界可以通過這些方法與對象進行交互受保護的內(nèi)部實現(xiàn)功能的實現(xiàn)細節(jié),不能從類外訪問。封裝的意義在面向?qū)ο蟪绦蛟O(shè)計中,類封裝了數(shù)據(jù)及對數(shù)據(jù)的操作,是程序中的最小模塊3.1.3繼承動物類層次舉例3.1.3繼承繼承(inheritance)是指新的類可以獲得已有類(稱為超類/基類/父類)的屬性和行為,稱新類為已有類的派生類(也稱為子類)繼承過程中派生類繼承了基類的特性,包括屬性和方法派生類也可修改繼承的方法或增加新的方法,使之更適合特殊的需要有助于解決軟件的可重用性問題,使程序結(jié)構(gòu)清晰,降低了編碼和維護的工作量Employee類繼承Person類publicclassPerson{publicStringname;publicStringgetName(){returnname;}}publicclassEmployee

extends

Person{publicintemployeeNumber;publicintgetEmployeeNumber(){returnemployeeNumber;}}3.1.3繼承3.1.3繼承單繼承任何一個派生類都只有單一的直接父類類層次結(jié)構(gòu)為樹狀結(jié)構(gòu)多繼承一個類可以有一個以上的直接父類類層次結(jié)構(gòu)為網(wǎng)狀結(jié)構(gòu),設(shè)計及實現(xiàn)比較復(fù)雜Java語言僅支持單繼承3.1.4多態(tài)多態(tài)(polymorphism)一個程序中同名的不同方法共存不同類的對象可以響應(yīng)同名的消息(方法),具體的實現(xiàn)方法卻不同Circle.draw();Triangle.draw();Square.draw();使語言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢,很好地解決了應(yīng)用程序方法同名問題第三章Java面向?qū)ο蟪绦蛟O(shè)計-13.1面向?qū)ο蟪绦蛟O(shè)計方法概述3.2類與對象3.3對象初始化和回收3.4應(yīng)用舉例3.2類與對象類與對象在程序中,對象是通過一種抽象數(shù)據(jù)類型來描述的,這種抽象數(shù)據(jù)類型稱為類(class)一個類是對一組相同/相似對象的描述。類是構(gòu)造對象的模板對象是類的具體實例(instance)3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.1類的聲明編寫類的“模板”聲明形式 [public][abstract|final]class

類名稱

[extends

父類名稱][implements

接口名稱列表]

{

public/private

數(shù)據(jù)類型變量名;//變量成員聲明初始化

public/private

數(shù)據(jù)類型方法名(參數(shù)列表);//方法聲

明及方法體

}3.2.1類的聲明importjava.math.*;class

Circle{

double

radius;Circle(){}

Circle(doublerads){radius=rads;}

doublegetArea(){

returnradius*radius*Math.PI;}}數(shù)據(jù)域構(gòu)造方法方法class關(guān)鍵字用來定義一個類Circle是類名稱3.2.1類的聲明關(guān)鍵字class表明其后聲明的是一個類extends如果所聲明的類是從某一父類派生而來,那么,父類的名字應(yīng)寫在extends之后implements如果所聲明的類要實現(xiàn)某些接口,那么,接口的名字應(yīng)寫在implements之后3.2.1類的聲明修飾符可以有多個,用來限定類的使用方式public表明此類為公有類abstract指明此類為抽象類final指明此類為終結(jié)類

類的聲明體變量成員聲明及初始化可以有多個方法聲明及方法體可以有多個3.2.1類的聲明public

classClock{//成員變量

inthour;intminute;intsecond;//成員方法

publicvoidsetTime(intnewH,intnewM,intnewS){

hour=newH;minute=newM;second=news;}publicvoidshowTime()

{

System.out.println(hour+":"+minute+":"+second);}}3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.2對象的聲明與引用變量和對象變量除了存儲基本數(shù)據(jù)類型的數(shù)據(jù),還能存儲對象的引用,“引用”一個對象的變量稱為“引用類型”的變量,簡稱“對象變量”或“引用變量”。類的對象也稱為類的實例(instance)3.2.2對象的聲明與引用對象的聲明(declaration)格式

類名變量名;例如Clock是已經(jīng)聲明的類名,則下面語句聲明的變量aclock將用于存儲該類對象的引用:

Clockaclock;聲明一個對象變量時,實際上并沒有創(chuàng)建一個對象,此變量=null。3.2.2對象的聲明與引用對象的創(chuàng)建(creation)生成對象的格式:

new<類名>(…);例如:aclock=newClock();其作用是:在內(nèi)存中為此對象分配內(nèi)存空間返回對象的引用(reference,相當(dāng)于對象的存儲地址)引用變量可以被賦以空值例如:aclock=null;Demo:TestClock.javapublicclassTestClock{publicstaticvoidmain(String[]args){

Scannerin=newScanner(System.in);

//getinput

System.out.print("Whatisthehour?");

intin_hour=in.nextInt();

System.out.print("Whatistheminute?");

intin_minute=in.nextInt();

System.out.print("Whatisthesecond?");

intin_second=in.nextInt();

Clockc1=newClock();

c1.setTime(in_hour,in_minute,in_second);

System.out.print("Thecurrenttimeis:");

c1.showTime(); }}3.2.2對象的聲明與引用小結(jié)1、創(chuàng)建對象(生成對象)Clockc1=newClock();定義對象變量:類名對象名;

Clockc1;聲明一個引用變量時并沒有對象生成分配內(nèi)存:new

運算符返回對象的引用(reference,相當(dāng)于對象的存儲地址)初始化對象:即初始化對象中的實例變量。對象可以被賦以空值:例如:c1=null;

Clockc1=newClock();1、創(chuàng)建對象2、指派對象引用2、使用對象例:獲取Clock對象的時間:c1.showTime()。訪問對象的成員調(diào)用對象的方法:c1.showTime();

引用對象的數(shù)據(jù):c1.hour;對象做類的成員方法中使用對象:方法參數(shù)和返回值3、釋放對象自動垃圾回收(標記);finalize()3.2.2對象的聲明與引用3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.3數(shù)據(jù)成員數(shù)據(jù)成員表示Java類的狀態(tài)聲明數(shù)據(jù)成員必須給出變量名及其所屬的類型,

同時還可以指定其他特性

在一個類中成員變量名是唯一的數(shù)據(jù)成員的類型可以是Java中任意的數(shù)據(jù)類型(簡

單類型,類,接口,數(shù)組)分為實例變量和類變量3.2.3數(shù)據(jù)成員聲明格式

[public|protected|private]

[static][final][transient][volatile]

變量數(shù)據(jù)類型變量名1[=變量初值], 變量名2[=變量初值],…;格式說明public,protected,private為訪問控制符static指明這是一個靜態(tài)成員變量final指明變量的值不能被修改transient指明變量是臨時狀態(tài)volatile指明變量是一個共享變量3.2.3數(shù)據(jù)成員實例變量(InstanceVariables)沒有static修飾的變量稱為實例(對象)變量用來存儲所有實例都需要的屬性信息,不同實例的屬性值可能會不同可通過下面的表達式訪問對象屬性的值<對象名>.<對象變量名>例如:c1.hour;3.2.3數(shù)據(jù)成員例子定義一個表示圓的類,保存在文件Circle.java

中。然后編寫測試類,保存在文件ShapeTester.java中,并與Circle.java放在相同的目錄下importjava.math.*;publicclassCircle{publicdoubleradius;publicdoublegetArea(){

returnradius*radius*Math.PI;}}classShapeTester{publicstaticvoidmain(Stringargs[]){ CircleaCircle=newCircle();System.out.println(aCircle); System.out.println("radius="+aCircle.radius);}}3.2.3數(shù)據(jù)成員編譯后運行結(jié)果如下:Circle@592fa617radius=0解釋@之后的數(shù)值為x所指的對象的存儲地址x的值及對象的狀態(tài)如圖聲明一個表示矩形的類,保存在Rectangle.java中;編寫測試類,保存在ShapeTester.java中,二文件保存在相同的目錄下publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley; x=newCircle();y=newRectangle();System.out.println(x+""+y);}}publicclassRectangle{

doublewidth=10.128;

doubleheight=5.734;}3.2.3數(shù)據(jù)成員編譯后運行結(jié)果如下:Circle@82f0db45Rectangle@92d342df解釋Circle及Rectangle類對象的狀態(tài)如圖@之后的數(shù)值為x所指的對象的存儲地址3.2.3數(shù)據(jù)成員對ShapeTester類進行修改,使兩個實例具有不同的實例變量值publicclassShapeTester{publicstaticvoidmain(Stringargs[]){Circlex;Rectangley,z;x=newCircle();y=newRectangle();z=newRectangle();x.radius=50;

z.width=68.94;

z.height=47.54;System.out.println(x.radius+“;"+y.width+“;"+z.width);}}3.2.3數(shù)據(jù)成員編譯后運行結(jié)果如下:50;10.128;68.94解釋Circle及Rectangle類對象的狀態(tài)如圖3.2.3數(shù)據(jù)成員例子:地址簿程序一個人的地址通常包括以下信息: 姓名,省份,城市,街道,門牌號,郵政編碼采用過程化的程序設(shè)計方法,使用簡單變量存儲,則存儲兩個人地址的代碼如下3.2.3數(shù)據(jù)成員publicstaticvoidmain(Stringargs[]){Stringname1,name2;introomNumber1,roomNumber2;StringstreetName1,streetName2;Stringcity1,city2;Stringprovince1,province2;StringpostalCode1,postalCode2;

name1="ZhangLi";roomNumber1=15;streetName1="TsinghuaEastRoad";city1="Beijing";province1=“Beijing";postalCode1="100084";

name2="LiHong";roomNumber2=2;streetName2="BeiNong";city2="Beijing";province2="Beijing";postalCode2="102206";

//...dosomethinginteresting}采用面向?qū)ο蟮某绦蛟O(shè)計方法,則需要首先聲明Address類如下publicclassAddress{Stringname;introomNumber;StringstreetName;Stringcity;Stringprovince;StringpostalCode;//方法成員略}3.2.3數(shù)據(jù)成員主方法改寫如下publicstaticvoidmain(Stringargs[]){Addressaddress1=newAddress(),address2=newAddress();

=“ZhangLi";address1.streetNumber=15;address1.streetName=“TsinghuaEastRoad";address1.city=“Beijing";vince=“Beijing";address1.postalCode=“100084";

=“LiHong";address2.streetNumber=2;address2.streetName=“BeiNong";address2.city=“Beijing";vince=“Beijing";address2.postalCode=“102206";//...dosomethinginteresting}類變量——Static變量也稱為靜態(tài)變量,聲明時需加static修飾符不管類的對象有多少,類變量只存在一份,在整個類中只有一個值類初始化的同時就被賦值適用情況類中所有對象都相同的屬性經(jīng)常需要共享的數(shù)據(jù)系統(tǒng)中用到的一些常量值引用格式<類名|對象名>.<類變量名>3.2.3數(shù)據(jù)成員對于一個圓類的所有對象,計算圓的面積時,都需用到π的值,可在Circle類的聲明中增加一個類屬性PIpublicclassCircle{

staticdoublePI=3.14159265;intradius;}當(dāng)生成Circle類的實例時,在每一個實例中并沒有存儲PI的值,PI的值存儲在類中3.2.3數(shù)據(jù)成員對類變量進行測試3.2.3數(shù)據(jù)成員publicclassClassVariableTester{publicstaticvoidmain(String[]args){Circlex=newCircle();System.out.println(x.PI);System.out.println(Circle.PI);

Circle.PI=3.14;System.out.println(x.PI);System.out.println(Circle.PI);}}測試結(jié)果3.141592653.141592653.143.14推薦使用類名來直接訪問靜態(tài)數(shù)據(jù)。publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){

this.x=x;this.y=y;pointCount++;}}聲明一個Point類,有兩個私有變量保存點坐標,一個類變量保存已有點的個數(shù)(Demo:Point.java)測試類

(Demo:PointTester.java)classPointTester{publicstaticvoidmain(String[]args){Pointp=newPoint(1,1);System.out.println(p.pointCount);Pointq=newPoint(2,2);System.out.println(q.pointCount);System.out.println(q.pointCount==Point.pointCount);System.out.println(Point.pointCount);}}測試結(jié)果12true2數(shù)據(jù)成員——final修飾符用途:定義常量實例變量和類變量都可被聲明為finalfinal實例變量必須在每個構(gòu)造方法結(jié)束之前賦初值,以保證使用之前會被初始化final類變量必須在聲明的同時初始化final變量一旦被初始化便不可改變3.2.3數(shù)據(jù)成員3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.4

方法成員方法成員定義類的行為一個對象能夠做的事情能夠從一個對象取得的信息可以沒有,也可以有多個;一旦在類中聲明了方法,它就成為了類聲明的一部分分為實例方法和類方法3.2.4

方法成員方法(Method)是為執(zhí)行一個操作而組合在一起的語句組publicstatic

intmax(intn1,intn2){

intresult;

if(n1>=n2){result=n1;}

else{result=n2;}

returnresult;}返回值方法體參數(shù)列表返回值類型方法頭方法名稱方法修飾intm=max(x,y);定義方法調(diào)用方法形參實參與C++程序不同的是:每個方法都必須隸屬于某個類聲明格式

[public

|

protected

|

private]

[static][final][abstract][native][synchronized]

返回類型方法名([參數(shù)列表])[throwsexceptionList] {

方法體 }返回類型:返回數(shù)據(jù)的數(shù)據(jù)類型除了構(gòu)造方法,一般要求返回類型:要么為void

,要么為任意Java數(shù)據(jù)類型最多只能返回一個值方法名:任何一個合法的標識符參數(shù)列表:用逗號(,)分隔開;參數(shù)類型與返回值類型同,可以為空

3.2.4

方法成員格式說明方法修飾public、protected、private

為存取控制符static:指明方法是一個類方法final:指明方法是一個終結(jié)方法abstract:指明方法是一個抽象方法native:用來集成java代碼和其它語言的代碼synchronized:用來控制多個并發(fā)線程對共享數(shù)據(jù)的訪問

3.2.4

方法成員格式說明(續(xù))返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型當(dāng)不需要返回值時,返回類型為void除了void外,方法中必須包含return語句參數(shù)類型簡單數(shù)據(jù)類型,引用類型(數(shù)組、類或接口)可以有多個參數(shù),也可以沒有參數(shù),方法聲明時的參數(shù)稱為形式參數(shù)方法體方法的實現(xiàn)包括局部變量的聲明以及所有合法的Java指令局部變量的作用域只在該方法內(nèi)部throwsexceptionList用來處理異常

3.2.4

方法成員方法調(diào)用給對象發(fā)消息意味著調(diào)用對象的某個方法從對象中取得信息修改對象的狀態(tài)或進行某種操作進行計算及取得結(jié)果等調(diào)用格式<對象名>.<方法名>([參數(shù)列表])稱點操作符“.”前面的<對象名>為消息的接收者(receiver)參數(shù)傳遞值傳遞:參數(shù)類型為基本數(shù)據(jù)類型時引用傳遞:參數(shù)類型為對象類型或數(shù)組時

3.2.4

方法成員實例方法表示特定對象的行為聲明時前面不加static修飾符使用時需要發(fā)送給一個類實例

3.2.4

方法成員舉例:在Circle類中聲明計算周長的方法publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}}由于radius是實例變量,在程序運行時,Java會自動取其接收者對象的屬性值也可將circumference方法體改為:

return2*PI*this.radius;

關(guān)鍵字this代表此方法的接收者對象獨特的對象引用:this對象中的所有數(shù)據(jù)字段都是通過this指針間接引用的。同一類中的方法可以相互調(diào)用,其中隱含了一個this調(diào)用。

3.2.4

方法成員方法調(diào)用測試publicclassCircumferenceTester

{publicstaticvoidmain(Stringargs[]){Circlec1=newCircle();c1.radius=50;Circlec2=newCircle();c2.radius=10;

doublecircum1=c1.circumference();doublecircum2=c2.circumference();

System.out.println("Circle1hascircumference"+circum1);System.out.println("Circle2hascircumference"+circum2);}}

3.2.4

方法成員運行結(jié)果Circle1hascircumference314.159265Circle2hascircumference62.831853說明在使用實例方法時,需要將其發(fā)送給一個實例對象(也稱給對象發(fā)送一條消息),radius的值即是接收者對象的值在執(zhí)行c1.circumference()時,radius的值為c1的radius屬性值;在執(zhí)行c2.circumference()時,radius的值為c2的radius屬性值

3.2.4

方法成員在Circle類及Rectangle類中聲明計算面積的方法area()publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicdoublearea(){

returnPI*radius*radius;

}}publicclassRectangle{doublewidth;doubleheight;publicdoublearea(){returnwidth*height;}}

3.2.4

方法成員聲明測試類AreaTester,對Circle類及Rectangle類的area()方法進行測試publicclassAreaTester{publicstaticvoidmain(Stringargs[]){Circlec=newCircle();c.radius=50;Rectangler=newRectangle();r.width=20;r.height=30; System.out.println("Circlehasarea"+c.area());System.out.println("Rectanglehasarea"+r.area());}}說明不同的類中可以聲明相同方法名的方法使用時,系統(tǒng)會根據(jù)接收者對象的類型找到相應(yīng)類的方法運行結(jié)果Circlehasarea7853.981625Rectanglehasarea600.0舉例:在Circle類中增加方法改變圓的半徑。(帶參數(shù)的方法)publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicdoublearea(){returnPI*radius*radius;}publicvoid

enlarge(intfactor){radius=radius*factor;

}}

3.2.4

方法成員測試類EnlargeTester運行結(jié)果Circle1的周長:314.159265Circle2的周長:62.831853Circle2擴大后的周長:251.327412publicclassEnlargeTester{publicstaticvoidmain(Stringargs[]){ Circlec1=newCircle(); c1.radius=50; Circlec2=newCircle(); c2.radius=10; System.out.println("Circle1的周長:"+c1.circumference()); System.out.println("Circle2的周長:"+c2.circumference());

c2.enlarge(4); System.out.println("Circle2擴大后的周長:"+c2.circumference()); }}舉例:在Circle類中增加fitsInside方法判斷一個圓是否在一個長方形內(nèi),需要以Rectangle類的對象作為參數(shù)。(以對象作為參數(shù)的方法)publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicvoidenlarge(intfactor){radius=radius*factor;}

publicbooleanfitsInside(Rectangler){

return(2*radius<=r.width)&&(2*radius<=r.height);}}測試類InsideTester運行結(jié)果Circle1fitsinsideRectangle:trueCircle2fitsinsideRectangle:falsepublicclassInsideTester{publicstaticvoidmain(Stringargs[]){ Circlec1=newCircle(); c1.radius=8; Circlec2=newCircle(); c2.radius=15; Rectangler=newRectangle(); r.width=20; r.height=30; System.out.println("Circle1fitsinsideRect:"+c1.fitsInside(r)); System.out.println("Circle2fitsinsideRect:"+c2.fitsInside(r));}}類方法——static方法也稱為靜態(tài)方法,表示類中對象的共有行為聲明時,前面需加static修飾符不能被聲明為抽象方法類方法可以在不建立對象的情況下用類名直接調(diào)用,也可用類實例調(diào)用

3.2.4

方法成員舉例:將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為

fahrenheit=centigrade*9/5+32除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實例的屬性值,因此可聲明為類方法。轉(zhuǎn)換方法centigradeToFahrenheit放在類Converter中publicclassConverter{publicstaticintcentigradeToFahrenheit(intcent){return(cent*9/5+32);}}方法調(diào)用Converter.centigradeToFahrenheit(40);

3.2.4

方法成員3.2.4

方法成員類的靜態(tài)方法在訪問本類的成員時,靜態(tài)方法只能訪問靜態(tài)成員!classEmployee{Stringname;longsalary;shortemployee_id;

static

inttotal_employees;

static

voidclear(){total_employees=0;}}3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.5方法成員重載importjava.math.*;class

Circle{

doubleradius=1.0;Circle(){}

Circle(double

rads){radius=rads;}

doublegetArea(){

returnradius*radius*Math.PI;}}3.2.5方法成員重載方法重載(overloading)一個類中名字相同的多個方法這些方法的參數(shù)必須不同,Java可通過參數(shù)列表的不同來辨別重載的方法或者參數(shù)個數(shù)不同或者參數(shù)類型不同返回值可以相同,也可以不同重載的價值在于它允許通過使用一個方法名來訪問多個方法3.2.5方法成員重載在編譯時就能夠被識別針對:同一個類內(nèi)的同名方法例如:publicint

square(int

x){returnx*x;}publicdouble

square(double

x){returnx*x;}識別標志:參數(shù)的個數(shù)、類型、數(shù)據(jù)類型的排列順序返回值不能做為識別的標志?publicclass

OverloadTest{

publicstaticvoidmain(String[]args){

System.out.printf("Themaximumbetween%dand%dis%d\n",1,2,max(1,2));System.out.printf("Themaximumbetween%fand%fis%f\n",1.0,2.0,max(1.0,2.0));System.out.printf("Themaximumbetween%f,%f,and%fis%f\n",1.0,2.0,3.0,max(1.0,2.0,3.0));}

publicstaticintmax(intn1,intn2){

if(n1>=n2)returnn1;

else

returnn2;}

publicstaticdoublemax(doublen1,doublen2){

return(n1>=n2)?n1:n2;}

publicstaticdoublemax(doublen1,doublen2,doublen3){

returnmax(max(n1,n2),n3);}}Demo:OverloadTest.java3.2.5方法成員重載歧義調(diào)用(ambiguousinvocation)有時一個方法調(diào)用會有兩個或更多可能的匹配,編譯器無法判斷哪個更為合適。這稱為歧義調(diào)用。歧義調(diào)用會產(chǎn)生編譯錯誤,考慮如下代碼:

max(int,double){……}

max(double,int){……}

都可能與max(1,2)匹配。由于兩個方法誰也不比誰更合適,所以這個調(diào)用是有歧義的,導(dǎo)致編譯錯誤。舉例:歧義調(diào)用解決方法:

publicclassAmbiguousOverloadTest{

publicstaticvoidmain(String[]args){

System.out.println(max(1,2));}

publicstaticdoublemax(doublen1,intn2){

if(n1>=n2)returnn1;

elsereturnn2;}

publicstaticdoublemax(intn1,doublen2){ if(n1>=n2)returnn1; elsereturnn2;}}System.out.println(max(1,(double)2));或

System.out.println(max((double)1,2));判斷:哪些是重載方法?publicclassOverloadExample{publicstaticintmax(intn1,intn2){

//......}

publicstaticdoublemax(intn1,intn2){

//......}

publicstaticintmax(inta1,inta2){

//......}

publicstaticintmax(Strings1,shorts2){

//......}}參數(shù)表不變,只改變返回值,不是重載只改變了參數(shù)表中的形參的命名,類型未變化,不是重載3.2類與對象3.2.1類的聲明3.2.2對象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.6成員方法參數(shù)參數(shù)名方法的參數(shù)名可以和類的成員變量同名classCircle{intx,y,radius;

publicCircle(intx,inty,intradius)

{this.x=x;

this.y=y;

this.radius=radius;

}}參數(shù)類型任何合法的數(shù)據(jù)類型傳遞到方法中不能將一個方法作為參數(shù)傳給另一個方法傳值與傳地址(引用)在方法中,簡單數(shù)據(jù)類型的參數(shù)是傳值的,而不是引用變量本身。好處:帶來一定的安全性,使方法不能隨意改變作用域外的變量。缺點:有時需要改變一個或多個參數(shù)的值,用return也只能返回一個值。對象的引用是對象在內(nèi)存中的地址,從而使方法中的局部變量與調(diào)用者中的變量指向了同一個內(nèi)存位置。3.2.6成員方法參數(shù)舉例:通過值傳遞publicclass

PassByValueExample{

publicstaticvoidmain(String[]args){

intx=1;

inty=2;

System.out.printf("Beforeinvoketheswapmethod:x=%d,y=%d\n",x,y);

swap(x,y);

System.out.printf("Afterinvoketheswapmethod:x=%d,y=%d\n",x,y);

}

publicstatic

voidswap(intn1,intn2){

System.out.printf("\tInsidetheswapmethod\n");

System.out.printf("\t\tBeforeswap:n1=%d,n2=%d\n",n1,n2);

inttemp=n1;

n1=n2;

n2=temp;

System.out.printf("\t\tAfterswap:n1=%d,n2=%d\n",n1,n2);

}}Beforeinvoketheswapmethod:x=1,y=2InsidetheswapmethodBeforeswap:n1=1,n2=2Afterswap:n1=2,n2=1Afterinvoketheswapmethod:x=1,y=2輸出結(jié)果:值傳遞3.2.6成員方法參數(shù)可以看到,這次swap失敗了…x、y的值并沒有被交換這是因為Java的方法調(diào)用是“通過值傳遞參數(shù)的”!在方法調(diào)用時,實參的值,被copy給形參。在方法內(nèi)部改變形參的值,并不會影響到實參的值。publicstatic

voidmain(String[]args){

intx=1;

inty=2;swap(x,y);}publicstatic

voidswap(intn1,intn2){

inttemp=n1;n1=n2;n2=temp;}實參形參copy3.2.6成員方法參數(shù)給方法傳遞對象參數(shù)對象可以作為方法的參數(shù),進行傳遞使用“按值傳遞”的規(guī)則,進行傳遞給基本類型值傳值:(傳值給參數(shù))給引用類型(對象)值傳值:(值是對象的引用)3.2.6成員方法參數(shù)publicclassCircle3{

privatedoubleradius;

publicCircle3(doublenewRadius){

radius=newRadius;}

publicdoublegetRadius(){

returnradius;}

publicvoidsetRadius(doublenewRadius){

radius=newRadius;}

publicdoublegetArea(){

return

radius*radius*Math.PI;}}publicclassTestPassObject{

publicstaticvoidmain(String[]args){

Circle3myCircle=newCircle3(1);

intn=5;

printAreas(myCircle,n);

System.out.print("\n"+"Radiusis"+myCircle.getRadius());

System.out.println(",nis"+n);}

publicstaticvoidprintAreas(Circle3c,inttimes){

System.out.println("Radius\t\tArea");

while(times>=1)

{

System.out.println(c.getRadius()+"\t\t"+c.getArea());

c.setRadius(c.getRadius()+1);

times--;

}}}跟蹤執(zhí)行過程-1publicclassTestPassObject{

publicstaticvoidmain(String[]args){Circle3myCircle=newCircle3(1);

intn=5;printAreas(myCircle,n);System.out.print("\n"+"Radiusis"+myCircle.getRadius());System.out.println(",nis"+n);}

publicstaticvoidprintAreas(Circle3c,

inttimes){System.out.println("Radius\t\tArea");

while(times>=1){System.out.println(c.getRadius()+"\t\t"+c.getArea());c.setRadius(c.getRadius()+1);times--;}}}Circle3對象radius=1myCircle對象引用跟蹤執(zhí)行過程-2publicclassTestPassObject{

publicstaticvoidmain(String[]args){Circle3myCircle=newCircle3(1);

intn=5;printAreas(myCircle,n);System.out.print("\n"+"Radiusis"+myCircle.getRadius());System.out.println(",nis"+n);}

publicstaticvoidprintAreas(Circle3c,

inttimes){System.out.println("Radius\t\tArea");

while(times>=1){System.out.println(c.getRadius()+"\t\t"+c.getArea());c.setRadius(c.getRadius()+1);times--;}}}Circle3對象radius=1myCircle對象引用n5跟蹤執(zhí)行過程-3publicclassTestPassObject{

publicstaticvoidmain(String[]args){Circle3myCircle=newCircle3(1);

intn=5;printAreas(myCircle,n);System.out.print("\n"+"Radiusis"+myCircle.getRadius());System.out.println(",nis"+n);}

publicstaticvoidprintAreas(Circle3c,

int

times){System.out.println("Radius\t\tArea");

while(times>=1){System.out.println(c.getRadius()+"\t\t"+c.getArea());c.setRadius(c.getRadius()+1);times--;}}}Circle3對象radius=1myCircle對象引用n5跟蹤執(zhí)行過程-4publicclassTestPassObject{

publicstaticvoidmain(String[]args){Circle3myCircle=newCircle3(1);

intn=5;printAreas(myCircle,n);System.out.print("\n"+"Radiusis"+myCircle.getRadius());System.out.println(",nis"+n);}

publicstaticvoidprintAreas(Circle3c,

int

times){System.out.println("Radius\t\tArea");

while(times>=1){System.out.println(c.getRadius()+"\t\t"+c.getArea());c.setRadius(c.getRadius()+1);times--;}}}Circle3對象radius=1c對象引用n55timesmyCircle對象引用跟蹤執(zhí)行過程-5publicclassTestPassObject{

publicstaticvoidmain(String[]args){Circle3myCircle=newCircle3(1);

intn=5;printAreas(myCircle,n);System.out.print("\n"+"Radiusis"+myCircle.getRadius());System.out.println(",nis"+n);}

pu

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論