版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第三章Java面向?qū)ο蟪绦蛟O(shè)計(jì)-13.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.2類與對(duì)象3.3對(duì)象初始化和回收3.4應(yīng)用舉例3.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象(object)現(xiàn)實(shí)世界萬(wàn)物皆對(duì)象都具有各自的屬性,對(duì)外界都呈現(xiàn)各自的行為
程序一切都是對(duì)象都具有標(biāo)識(shí)(identity),屬性和行為(方法)通過(guò)一個(gè)或多個(gè)變量來(lái)保存其狀態(tài)通過(guò)方法(method)實(shí)現(xiàn)其行為3.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述類(class)“人以類聚,物以群分”將屬性及行為相同或相似的對(duì)象歸為一類類可以看成是對(duì)象的抽象,是對(duì)象的集合,代表了此類對(duì)象所具有的共有屬性和行為。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,每一個(gè)對(duì)象都屬于某個(gè)特定的類。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è)計(jì)方法概述結(jié)構(gòu)化程序設(shè)計(jì)對(duì)應(yīng)的典型計(jì)算機(jī)語(yǔ)言,例如:C面向操作(action)的函數(shù)(方法)是程序的基本單位面向?qū)ο蟪绦蛟O(shè)計(jì)對(duì)應(yīng)的典型計(jì)算機(jī)語(yǔ)言,例如:Java面向?qū)ο?object)的類(class)是程序的基本單位方法(函數(shù))被封裝在類中數(shù)據(jù)也常常被封裝在類中3.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述面向?qū)ο蟪绦蛟O(shè)計(jì)(Object-OrientedProgramming)與結(jié)構(gòu)化程序設(shè)計(jì)方法相比,更符合人類認(rèn)識(shí)現(xiàn)實(shí)世界的思維方式已成為程序設(shè)計(jì)/軟件分析與設(shè)計(jì)的主流方向涉及的主要概念抽象——abstract封裝——encapsulation繼承——inheritance多態(tài)——polymorphism3.1.1抽象抽象(abstract)忽略問(wèn)題中與當(dāng)前目標(biāo)無(wú)關(guān)的方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面計(jì)算機(jī)軟件開(kāi)發(fā)中所使用的抽象有過(guò)程抽象數(shù)據(jù)抽象3.1.1抽象過(guò)程抽象將整個(gè)系統(tǒng)的功能劃分為若干部分,強(qiáng)調(diào)功能完成的過(guò)程和步驟,而隱藏其具體的實(shí)現(xiàn)基于過(guò)程抽象的兩個(gè)標(biāo)準(zhǔn)程序設(shè)計(jì)技術(shù)過(guò)程分解遞歸技術(shù)3.1.1抽象數(shù)據(jù)抽象將需要處理的數(shù)據(jù)和這些數(shù)據(jù)上的操作結(jié)合在一起,抽象成不同的抽象數(shù)據(jù)類型每個(gè)抽象數(shù)據(jù)類型既包含了數(shù)據(jù),也包含了針對(duì)這些數(shù)據(jù)的操作相對(duì)于過(guò)程抽象,數(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(),…社會(huì)行為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ù)的操作封裝在一起用戶只能看到對(duì)象的封裝接口信息,對(duì)象的內(nèi)部細(xì)節(jié)對(duì)用戶是隱蔽的封裝的目的在于將對(duì)象的使用者和設(shè)計(jì)者分開(kāi),使用者不必知道行為實(shí)現(xiàn)的細(xì)節(jié),只需使用設(shè)計(jì)者提供的消息來(lái)訪問(wèn)對(duì)象3.1.2封裝Javaimportjava.math.*;class
Circle{privatedoubleradius;
Circle(doublerads){radius=rads;}
publicdoublegetArea(){
returnradius*radius*Math.PI;}}3.1.2封裝封裝的定義清楚的邊界所有對(duì)象的內(nèi)部信息被限定在這個(gè)邊界內(nèi)接口對(duì)象向外界提供的方法,外界可以通過(guò)這些方法與對(duì)象進(jìn)行交互受保護(hù)的內(nèi)部實(shí)現(xiàn)功能的實(shí)現(xiàn)細(xì)節(jié),不能從類外訪問(wèn)。封裝的意義在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類封裝了數(shù)據(jù)及對(duì)數(shù)據(jù)的操作,是程序中的最小模塊3.1.3繼承動(dòng)物類層次舉例3.1.3繼承繼承(inheritance)是指新的類可以獲得已有類(稱為超類/基類/父類)的屬性和行為,稱新類為已有類的派生類(也稱為子類)繼承過(guò)程中派生類繼承了基類的特性,包括屬性和方法派生類也可修改繼承的方法或增加新的方法,使之更適合特殊的需要有助于解決軟件的可重用性問(wèn)題,使程序結(jié)構(gòu)清晰,降低了編碼和維護(hù)的工作量Employee類繼承Person類publicclassPerson{publicStringname;publicStringgetName(){returnname;}}publicclassEmployee
extends
Person{publicintemployeeNumber;publicintgetEmployeeNumber(){returnemployeeNumber;}}3.1.3繼承3.1.3繼承單繼承任何一個(gè)派生類都只有單一的直接父類類層次結(jié)構(gòu)為樹(shù)狀結(jié)構(gòu)多繼承一個(gè)類可以有一個(gè)以上的直接父類類層次結(jié)構(gòu)為網(wǎng)狀結(jié)構(gòu),設(shè)計(jì)及實(shí)現(xiàn)比較復(fù)雜Java語(yǔ)言僅支持單繼承3.1.4多態(tài)多態(tài)(polymorphism)一個(gè)程序中同名的不同方法共存不同類的對(duì)象可以響應(yīng)同名的消息(方法),具體的實(shí)現(xiàn)方法卻不同Circle.draw();Triangle.draw();Square.draw();使語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好地解決了應(yīng)用程序方法同名問(wèn)題第三章Java面向?qū)ο蟪绦蛟O(shè)計(jì)-13.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.2類與對(duì)象3.3對(duì)象初始化和回收3.4應(yīng)用舉例3.2類與對(duì)象類與對(duì)象在程序中,對(duì)象是通過(guò)一種抽象數(shù)據(jù)類型來(lái)描述的,這種抽象數(shù)據(jù)類型稱為類(class)一個(gè)類是對(duì)一組相同/相似對(duì)象的描述。類是構(gòu)造對(duì)象的模板對(duì)象是類的具體實(shí)例(instance)3.2類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.1類的聲明編寫(xiě)類的“模板”聲明形式 [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)鍵字用來(lái)定義一個(gè)類Circle是類名稱3.2.1類的聲明關(guān)鍵字class表明其后聲明的是一個(gè)類extends如果所聲明的類是從某一父類派生而來(lái),那么,父類的名字應(yīng)寫(xiě)在extends之后implements如果所聲明的類要實(shí)現(xiàn)某些接口,那么,接口的名字應(yīng)寫(xiě)在implements之后3.2.1類的聲明修飾符可以有多個(gè),用來(lái)限定類的使用方式public表明此類為公有類abstract指明此類為抽象類final指明此類為終結(jié)類
類的聲明體變量成員聲明及初始化可以有多個(gè)方法聲明及方法體可以有多個(gè)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類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.2對(duì)象的聲明與引用變量和對(duì)象變量除了存儲(chǔ)基本數(shù)據(jù)類型的數(shù)據(jù),還能存儲(chǔ)對(duì)象的引用,“引用”一個(gè)對(duì)象的變量稱為“引用類型”的變量,簡(jiǎn)稱“對(duì)象變量”或“引用變量”。類的對(duì)象也稱為類的實(shí)例(instance)3.2.2對(duì)象的聲明與引用對(duì)象的聲明(declaration)格式
類名變量名;例如Clock是已經(jīng)聲明的類名,則下面語(yǔ)句聲明的變量aclock將用于存儲(chǔ)該類對(duì)象的引用:
Clockaclock;聲明一個(gè)對(duì)象變量時(shí),實(shí)際上并沒(méi)有創(chuàng)建一個(gè)對(duì)象,此變量=null。3.2.2對(duì)象的聲明與引用對(duì)象的創(chuàng)建(creation)生成對(duì)象的格式:
new<類名>(…);例如:aclock=newClock();其作用是:在內(nèi)存中為此對(duì)象分配內(nèi)存空間返回對(duì)象的引用(reference,相當(dāng)于對(duì)象的存儲(chǔ)地址)引用變量可以被賦以空值例如: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對(duì)象的聲明與引用小結(jié)1、創(chuàng)建對(duì)象(生成對(duì)象)Clockc1=newClock();定義對(duì)象變量:類名對(duì)象名;
Clockc1;聲明一個(gè)引用變量時(shí)并沒(méi)有對(duì)象生成分配內(nèi)存:new
運(yùn)算符返回對(duì)象的引用(reference,相當(dāng)于對(duì)象的存儲(chǔ)地址)初始化對(duì)象:即初始化對(duì)象中的實(shí)例變量。對(duì)象可以被賦以空值:例如:c1=null;
Clockc1=newClock();1、創(chuàng)建對(duì)象2、指派對(duì)象引用2、使用對(duì)象例:獲取Clock對(duì)象的時(shí)間:c1.showTime()。訪問(wèn)對(duì)象的成員調(diào)用對(duì)象的方法:c1.showTime();
引用對(duì)象的數(shù)據(jù):c1.hour;對(duì)象做類的成員方法中使用對(duì)象:方法參數(shù)和返回值3、釋放對(duì)象自動(dòng)垃圾回收(標(biāo)記);finalize()3.2.2對(duì)象的聲明與引用3.2類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用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í)還可以指定其他特性
在一個(gè)類中成員變量名是唯一的數(shù)據(jù)成員的類型可以是Java中任意的數(shù)據(jù)類型(簡(jiǎn)
單類型,類,接口,數(shù)組)分為實(shí)例變量和類變量3.2.3數(shù)據(jù)成員聲明格式
[public|protected|private]
[static][final][transient][volatile]
變量數(shù)據(jù)類型變量名1[=變量初值], 變量名2[=變量初值],…;格式說(shuō)明public,protected,private為訪問(wèn)控制符static指明這是一個(gè)靜態(tài)成員變量final指明變量的值不能被修改transient指明變量是臨時(shí)狀態(tài)volatile指明變量是一個(gè)共享變量3.2.3數(shù)據(jù)成員實(shí)例變量(InstanceVariables)沒(méi)有static修飾的變量稱為實(shí)例(對(duì)象)變量用來(lái)存儲(chǔ)所有實(shí)例都需要的屬性信息,不同實(shí)例的屬性值可能會(huì)不同可通過(guò)下面的表達(dá)式訪問(wèn)對(duì)象屬性的值<對(duì)象名>.<對(duì)象變量名>例如:c1.hour;3.2.3數(shù)據(jù)成員例子定義一個(gè)表示圓的類,保存在文件Circle.java
中。然后編寫(xiě)測(cè)試類,保存在文件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ù)成員編譯后運(yùn)行結(jié)果如下:Circle@592fa617radius=0解釋@之后的數(shù)值為x所指的對(duì)象的存儲(chǔ)地址x的值及對(duì)象的狀態(tài)如圖聲明一個(gè)表示矩形的類,保存在Rectangle.java中;編寫(xiě)測(cè)試類,保存在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ù)成員編譯后運(yùn)行結(jié)果如下:Circle@82f0db45Rectangle@92d342df解釋Circle及Rectangle類對(duì)象的狀態(tài)如圖@之后的數(shù)值為x所指的對(duì)象的存儲(chǔ)地址3.2.3數(shù)據(jù)成員對(duì)ShapeTester類進(jìn)行修改,使兩個(gè)實(shí)例具有不同的實(shí)例變量值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ù)成員編譯后運(yùn)行結(jié)果如下:50;10.128;68.94解釋Circle及Rectangle類對(duì)象的狀態(tài)如圖3.2.3數(shù)據(jù)成員例子:地址簿程序一個(gè)人的地址通常包括以下信息: 姓名,省份,城市,街道,門(mén)牌號(hào),郵政編碼采用過(guò)程化的程序設(shè)計(jì)方法,使用簡(jiǎn)單變量存儲(chǔ),則存儲(chǔ)兩個(gè)人地址的代碼如下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è)計(jì)方法,則需要首先聲明Address類如下publicclassAddress{Stringname;introomNumber;StringstreetName;Stringcity;Stringprovince;StringpostalCode;//方法成員略}3.2.3數(shù)據(jù)成員主方法改寫(xiě)如下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)變量,聲明時(shí)需加static修飾符不管類的對(duì)象有多少,類變量只存在一份,在整個(gè)類中只有一個(gè)值類初始化的同時(shí)就被賦值適用情況類中所有對(duì)象都相同的屬性經(jīng)常需要共享的數(shù)據(jù)系統(tǒng)中用到的一些常量值引用格式<類名|對(duì)象名>.<類變量名>3.2.3數(shù)據(jù)成員對(duì)于一個(gè)圓類的所有對(duì)象,計(jì)算圓的面積時(shí),都需用到π的值,可在Circle類的聲明中增加一個(gè)類屬性PIpublicclassCircle{
staticdoublePI=3.14159265;intradius;}當(dāng)生成Circle類的實(shí)例時(shí),在每一個(gè)實(shí)例中并沒(méi)有存儲(chǔ)PI的值,PI的值存儲(chǔ)在類中3.2.3數(shù)據(jù)成員對(duì)類變量進(jìn)行測(cè)試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);}}測(cè)試結(jié)果3.141592653.141592653.143.14推薦使用類名來(lái)直接訪問(wèn)靜態(tài)數(shù)據(jù)。publicclassPoint{privateintx;privateinty;publicstaticintpointCount=0;publicPoint(intx,inty){
this.x=x;this.y=y;pointCount++;}}聲明一個(gè)Point類,有兩個(gè)私有變量保存點(diǎn)坐標(biāo),一個(gè)類變量保存已有點(diǎn)的個(gè)數(shù)(Demo:Point.java)測(cè)試類
(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);}}測(cè)試結(jié)果12true2數(shù)據(jù)成員——final修飾符用途:定義常量實(shí)例變量和類變量都可被聲明為finalfinal實(shí)例變量必須在每個(gè)構(gòu)造方法結(jié)束之前賦初值,以保證使用之前會(huì)被初始化final類變量必須在聲明的同時(shí)初始化final變量一旦被初始化便不可改變3.2.3數(shù)據(jù)成員3.2類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用3.2.3數(shù)據(jù)成員3.2.4方法成員3.2.5方法成員重載3.2.6成員方法參數(shù)3.2.4
方法成員方法成員定義類的行為一個(gè)對(duì)象能夠做的事情能夠從一個(gè)對(duì)象取得的信息可以沒(méi)有,也可以有多個(gè);一旦在類中聲明了方法,它就成為了類聲明的一部分分為實(shí)例方法和類方法3.2.4
方法成員方法(Method)是為執(zhí)行一個(gè)操作而組合在一起的語(yǔ)句組publicstatic
intmax(intn1,intn2){
intresult;
if(n1>=n2){result=n1;}
else{result=n2;}
returnresult;}返回值方法體參數(shù)列表返回值類型方法頭方法名稱方法修飾intm=max(x,y);定義方法調(diào)用方法形參實(shí)參與C++程序不同的是:每個(gè)方法都必須隸屬于某個(gè)類聲明格式
[public
|
protected
|
private]
[static][final][abstract][native][synchronized]
返回類型方法名([參數(shù)列表])[throwsexceptionList] {
方法體 }返回類型:返回?cái)?shù)據(jù)的數(shù)據(jù)類型除了構(gòu)造方法,一般要求返回類型:要么為void
,要么為任意Java數(shù)據(jù)類型最多只能返回一個(gè)值方法名:任何一個(gè)合法的標(biāo)識(shí)符參數(shù)列表:用逗號(hào)(,)分隔開(kāi);參數(shù)類型與返回值類型同,可以為空
3.2.4
方法成員格式說(shuō)明方法修飾public、protected、private
為存取控制符static:指明方法是一個(gè)類方法final:指明方法是一個(gè)終結(jié)方法abstract:指明方法是一個(gè)抽象方法native:用來(lái)集成java代碼和其它語(yǔ)言的代碼synchronized:用來(lái)控制多個(gè)并發(fā)線程對(duì)共享數(shù)據(jù)的訪問(wèn)
3.2.4
方法成員格式說(shuō)明(續(xù))返回類型方法返回值的類型,可以是任意的Java數(shù)據(jù)類型當(dāng)不需要返回值時(shí),返回類型為void除了void外,方法中必須包含return語(yǔ)句參數(shù)類型簡(jiǎn)單數(shù)據(jù)類型,引用類型(數(shù)組、類或接口)可以有多個(gè)參數(shù),也可以沒(méi)有參數(shù),方法聲明時(shí)的參數(shù)稱為形式參數(shù)方法體方法的實(shí)現(xiàn)包括局部變量的聲明以及所有合法的Java指令局部變量的作用域只在該方法內(nèi)部throwsexceptionList用來(lái)處理異常
3.2.4
方法成員方法調(diào)用給對(duì)象發(fā)消息意味著調(diào)用對(duì)象的某個(gè)方法從對(duì)象中取得信息修改對(duì)象的狀態(tài)或進(jìn)行某種操作進(jìn)行計(jì)算及取得結(jié)果等調(diào)用格式<對(duì)象名>.<方法名>([參數(shù)列表])稱點(diǎn)操作符“.”前面的<對(duì)象名>為消息的接收者(receiver)參數(shù)傳遞值傳遞:參數(shù)類型為基本數(shù)據(jù)類型時(shí)引用傳遞:參數(shù)類型為對(duì)象類型或數(shù)組時(shí)
3.2.4
方法成員實(shí)例方法表示特定對(duì)象的行為聲明時(shí)前面不加static修飾符使用時(shí)需要發(fā)送給一個(gè)類實(shí)例
3.2.4
方法成員舉例:在Circle類中聲明計(jì)算周長(zhǎng)的方法publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}}由于radius是實(shí)例變量,在程序運(yùn)行時(shí),Java會(huì)自動(dòng)取其接收者對(duì)象的屬性值也可將circumference方法體改為:
return2*PI*this.radius;
關(guān)鍵字this代表此方法的接收者對(duì)象獨(dú)特的對(duì)象引用:this對(duì)象中的所有數(shù)據(jù)字段都是通過(guò)this指針間接引用的。同一類中的方法可以相互調(diào)用,其中隱含了一個(gè)this調(diào)用。
3.2.4
方法成員方法調(diào)用測(cè)試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
方法成員運(yùn)行結(jié)果Circle1hascircumference314.159265Circle2hascircumference62.831853說(shuō)明在使用實(shí)例方法時(shí),需要將其發(fā)送給一個(gè)實(shí)例對(duì)象(也稱給對(duì)象發(fā)送一條消息),radius的值即是接收者對(duì)象的值在執(zhí)行c1.circumference()時(shí),radius的值為c1的radius屬性值;在執(zhí)行c2.circumference()時(shí),radius的值為c2的radius屬性值
3.2.4
方法成員在Circle類及Rectangle類中聲明計(jì)算面積的方法area()publicclassCircle{staticdoublePI=3.14159265;intradius;publicdoublecircumference(){return2*PI*radius;}publicdoublearea(){
returnPI*radius*radius;
}}publicclassRectangle{doublewidth;doubleheight;publicdoublearea(){returnwidth*height;}}
3.2.4
方法成員聲明測(cè)試類AreaTester,對(duì)Circle類及Rectangle類的area()方法進(jìn)行測(cè)試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());}}說(shuō)明不同的類中可以聲明相同方法名的方法使用時(shí),系統(tǒng)會(huì)根據(jù)接收者對(duì)象的類型找到相應(yīng)類的方法運(yùn)行結(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
方法成員測(cè)試類EnlargeTester運(yùn)行結(jié)果Circle1的周長(zhǎng):314.159265Circle2的周長(zhǎng):62.831853Circle2擴(kuò)大后的周長(zhǎng):251.327412publicclassEnlargeTester{publicstaticvoidmain(Stringargs[]){ Circlec1=newCircle(); c1.radius=50; Circlec2=newCircle(); c2.radius=10; System.out.println("Circle1的周長(zhǎng):"+c1.circumference()); System.out.println("Circle2的周長(zhǎng):"+c2.circumference());
c2.enlarge(4); System.out.println("Circle2擴(kuò)大后的周長(zhǎng):"+c2.circumference()); }}舉例:在Circle類中增加fitsInside方法判斷一個(gè)圓是否在一個(gè)長(zhǎng)方形內(nèi),需要以Rectangle類的對(duì)象作為參數(shù)。(以對(duì)象作為參數(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);}}測(cè)試類InsideTester運(yùn)行結(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)方法,表示類中對(duì)象的共有行為聲明時(shí),前面需加static修飾符不能被聲明為抽象方法類方法可以在不建立對(duì)象的情況下用類名直接調(diào)用,也可用類實(shí)例調(diào)用
3.2.4
方法成員舉例:將攝氏溫度(centigrade)轉(zhuǎn)換成華氏溫度(fahrenheit)轉(zhuǎn)換公式為
fahrenheit=centigrade*9/5+32除了攝氏溫度值及公式中需要的常量值,此功能不依賴于具體的類實(shí)例的屬性值,因此可聲明為類方法。轉(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)方法在訪問(wèn)本類的成員時(shí),靜態(tài)方法只能訪問(wèn)靜態(tài)成員!classEmployee{Stringname;longsalary;shortemployee_id;
static
inttotal_employees;
static
voidclear(){total_employees=0;}}3.2類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用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)一個(gè)類中名字相同的多個(gè)方法這些方法的參數(shù)必須不同,Java可通過(guò)參數(shù)列表的不同來(lái)辨別重載的方法或者參數(shù)個(gè)數(shù)不同或者參數(shù)類型不同返回值可以相同,也可以不同重載的價(jià)值在于它允許通過(guò)使用一個(gè)方法名來(lái)訪問(wèn)多個(gè)方法3.2.5方法成員重載在編譯時(shí)就能夠被識(shí)別針對(duì):同一個(gè)類內(nèi)的同名方法例如:publicint
square(int
x){returnx*x;}publicdouble
square(double
x){returnx*x;}識(shí)別標(biāo)志:參數(shù)的個(gè)數(shù)、類型、數(shù)據(jù)類型的排列順序返回值不能做為識(shí)別的標(biāo)志?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)有時(shí)一個(gè)方法調(diào)用會(huì)有兩個(gè)或更多可能的匹配,編譯器無(wú)法判斷哪個(gè)更為合適。這稱為歧義調(diào)用。歧義調(diào)用會(huì)產(chǎn)生編譯錯(cuò)誤,考慮如下代碼:
max(int,double){……}
max(double,int){……}
都可能與max(1,2)匹配。由于兩個(gè)方法誰(shuí)也不比誰(shuí)更合適,所以這個(gè)調(diào)用是有歧義的,導(dǎo)致編譯錯(cuò)誤。舉例:歧義調(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類與對(duì)象3.2.1類的聲明3.2.2對(duì)象的聲明與引用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ù)類型傳遞到方法中不能將一個(gè)方法作為參數(shù)傳給另一個(gè)方法傳值與傳地址(引用)在方法中,簡(jiǎn)單數(shù)據(jù)類型的參數(shù)是傳值的,而不是引用變量本身。好處:帶來(lái)一定的安全性,使方法不能隨意改變作用域外的變量。缺點(diǎn):有時(shí)需要改變一個(gè)或多個(gè)參數(shù)的值,用return也只能返回一個(gè)值。對(duì)象的引用是對(duì)象在內(nèi)存中的地址,從而使方法中的局部變量與調(diào)用者中的變量指向了同一個(gè)內(nèi)存位置。3.2.6成員方法參數(shù)舉例:通過(guò)值傳遞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的值并沒(méi)有被交換這是因?yàn)镴ava的方法調(diào)用是“通過(guò)值傳遞參數(shù)的”!在方法調(diào)用時(shí),實(shí)參的值,被copy給形參。在方法內(nèi)部改變形參的值,并不會(huì)影響到實(shí)參的值。publicstatic
voidmain(String[]args){
intx=1;
inty=2;swap(x,y);}publicstatic
voidswap(intn1,intn2){
inttemp=n1;n1=n2;n2=temp;}實(shí)參形參copy3.2.6成員方法參數(shù)給方法傳遞對(duì)象參數(shù)對(duì)象可以作為方法的參數(shù),進(jìn)行傳遞使用“按值傳遞”的規(guī)則,進(jìn)行傳遞給基本類型值傳值:(傳值給參數(shù))給引用類型(對(duì)象)值傳值:(值是對(duì)象的引用)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í)行過(guò)程-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對(duì)象radius=1myCircle對(duì)象引用跟蹤執(zhí)行過(guò)程-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對(duì)象radius=1myCircle對(duì)象引用n5跟蹤執(zhí)行過(guò)程-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對(duì)象radius=1myCircle對(duì)象引用n5跟蹤執(zhí)行過(guò)程-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對(duì)象radius=1c對(duì)象引用n55timesmyCircle對(duì)象引用跟蹤執(zhí)行過(guò)程-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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 酒店客房設(shè)備采購(gòu)與供應(yīng)商管理制度
- 酒店財(cái)務(wù)預(yù)算管理制度
- 濟(jì)寧線下培訓(xùn)班
- 槍支培訓(xùn)工作匯報(bào)
- 松花粉培訓(xùn)課件
- 2024-2025學(xué)年山東省聊城市高一下學(xué)期期中考試歷史試題 (解析版)
- 2026年網(wǎng)絡(luò)系統(tǒng)管理與維護(hù)實(shí)操指南安全與管理試題集
- 2026年金融投資顧問(wèn)招聘考試模擬題
- 2026年化學(xué)工程安全與環(huán)保知識(shí)試題集
- 2026年環(huán)境心理學(xué)與人力資源管理壓力管理與激勵(lì)機(jī)制測(cè)試題
- 2026四川涼山州雷波縣糧油貿(mào)易總公司面向社會(huì)招聘6人備考題庫(kù)及答案詳解一套
- 四川省攀枝花市2025-2026學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)檢測(cè)(含答案)
- 勞動(dòng)人事法律培訓(xùn)課件
- 2026中國(guó)電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘?jìng)淇碱}庫(kù)參考答案詳解
- 清真生產(chǎn)過(guò)程管控制度
- 途虎養(yǎng)車安全培訓(xùn)課件
- 2025-2026學(xué)年人教版(新教材)小學(xué)數(shù)學(xué)二年級(jí)下冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附教材目錄P161)
- 物業(yè)小區(qū)春節(jié)前安全培訓(xùn)課件
- 刷單協(xié)議書(shū)合同范本
- 內(nèi)科學(xué)總論小兒遺傳代謝病課件
- 2026小紅書(shū)平臺(tái)營(yíng)銷通案
評(píng)論
0/150
提交評(píng)論