版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
返回第4章Java程序結(jié)構(gòu)1. Java語(yǔ)言是一種純面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言,它的核心概念是類(lèi)和對(duì)象,它的程序是基于類(lèi)和對(duì)象建造的,程序中類(lèi)的結(jié)構(gòu)決定了程序的結(jié)構(gòu)。這一章較深入系統(tǒng)地介紹Java程序的結(jié)構(gòu),介紹組成Java程序的類(lèi)之間的關(guān)系。2.Java程序結(jié)構(gòu)類(lèi)層次結(jié)構(gòu)對(duì)象的使用與對(duì)象間通信多態(tài)性接口與包訪(fǎng)問(wèn)控制與修飾符3.類(lèi)層次結(jié)構(gòu)繼承的概念繼承的描述類(lèi)的繼承規(guī)那么變量的隱藏4.繼承的概念在日常生活中,我們常用“是一種〔is-a〕〞關(guān)系來(lái)組織與表達(dá)知識(shí),從而將知識(shí)組織成一種有層次、可分類(lèi)的結(jié)構(gòu)。面向?qū)ο蟪绦蛟O(shè)計(jì)方法將is-a關(guān)系引入到程序設(shè)計(jì)領(lǐng)域,用于描述類(lèi)與類(lèi)之間的關(guān)系,稱(chēng)之為繼承。5.多態(tài)性同一運(yùn)算或方法〔如“+〞〕對(duì)不同類(lèi)型的對(duì)象〔如整型數(shù),或字符串〕有不同的語(yǔ)義解釋。這種在程序中同一方法對(duì)不同類(lèi)型的對(duì)象有不同解釋的現(xiàn)象稱(chēng)為多態(tài)性多態(tài)性與繼承是密不可分的。通常,兩類(lèi)對(duì)象都有共同的父類(lèi),在父類(lèi)中定義的方法在這兩個(gè)子類(lèi)中分別有不同的實(shí)現(xiàn)6.超類(lèi)與子類(lèi)我們?cè)诼暶黝?lèi)A時(shí),指明類(lèi)A繼承了類(lèi)B〔類(lèi)B是一個(gè)已定義了的類(lèi)〕,那么類(lèi)A通常就擁有了類(lèi)B的成員變量和方法。此時(shí),類(lèi)B稱(chēng)為類(lèi)A的直接超類(lèi)〔superclass〕,超類(lèi)也稱(chēng)為父類(lèi)或基類(lèi);類(lèi)A稱(chēng)為類(lèi)B的直接子類(lèi)〔subclass〕,子類(lèi)也稱(chēng)為派生類(lèi)7.繼承的描述Java語(yǔ)言中,聲明類(lèi)首部的格式如下:[類(lèi)的修飾符]class類(lèi)名[extends超類(lèi)名][implement接口名表]其中“extends超類(lèi)名〞局部就是用來(lái)描述繼承的,這里超類(lèi)名指明所聲明類(lèi)的直接超類(lèi)8.繼承描述的演示 classCar //聲明Car類(lèi)
{ intcar_number; voidset_number(intcar_num) { car_number=car_num; } voidshow_number() { System.out.println("我的車(chē)號(hào)是:"+car_number); } } classTrashCarextendsCar//聲明TrashCar類(lèi),它繼承Car類(lèi)
{ intcapacipy; voidset_capacity(inttrash_car_capacipy) { capacipy=trash_car_capacipy; } voidshow_capacity() { System.out.println("我的容量是:"+capacipy+""); } }9.類(lèi)的繼承規(guī)那么直接子類(lèi)繼承那些被聲明為public或protected的直接超類(lèi)成員〔包括成員變量和成員方法,下同〕直接子類(lèi)繼承那些未被存取權(quán)限修飾符修飾的直接超類(lèi)成員,只要該子類(lèi)與該超類(lèi)在同一個(gè)包中如果直接子類(lèi)聲明了一個(gè)與直接超類(lèi)中的成員同名的成員,那么該子類(lèi)不繼承該超類(lèi)中的該同名成員直接子類(lèi)不繼承被修飾為private的直接超類(lèi)的成員10.變量的隱藏直接子類(lèi)聲明了一個(gè)與其直接超類(lèi)的成員變量同名的成員變量,那么稱(chēng)該超類(lèi)的該成員變量在該直接子類(lèi)中被隱藏,關(guān)鍵字this和super分別用來(lái)指明直接子類(lèi)和其直接超類(lèi)中同名的成員變量當(dāng)超類(lèi)的成員變量、子類(lèi)的成員變量和類(lèi)中方法使用的局部變量三者同名,或其中的兩者同名時(shí),可以使用關(guān)鍵字this和super來(lái)指定所要使用的變量11.this和super區(qū)別同名變量的演示classA{ intx; //類(lèi)A中聲明了成員變量x ┇}classBextendsA //類(lèi)B繼承類(lèi)A,也繼承了類(lèi)A的成員變量x{ intx; //類(lèi)B中又聲明了成員變量x ┇ voidm() { intx; //方法m聲明了自己的局部變量x ┇ super.x=2; //super.x是其所在類(lèi)的父類(lèi)即類(lèi)A的x this.x=1; //this.x是其所在類(lèi)即類(lèi)B的x x=100; //x是方法本身的局部變量x ┇ }}12.對(duì)象的使用與對(duì)象間通信對(duì)象的創(chuàng)立對(duì)象的使用對(duì)象間的通信〔消息〕與實(shí)例方法的調(diào)用13.對(duì)象的創(chuàng)立Java中,類(lèi)是某一類(lèi)對(duì)象的共同特征〔屬性、行為〕的描述,即類(lèi)中含有某一類(lèi)對(duì)象具有哪些屬性、哪些行為的信息。而由類(lèi)創(chuàng)立的多個(gè)對(duì)象都具有類(lèi)所定義的那些屬性和行為。但是,由同一個(gè)類(lèi)所創(chuàng)立的不同對(duì)象的同一個(gè)屬性的值可能不同14.對(duì)象的生命周期對(duì)象和現(xiàn)實(shí)生活中的事物一樣,有它的產(chǎn)生、開(kāi)展和消亡的過(guò)程,在Java中分別稱(chēng)之為對(duì)象的創(chuàng)立、使用和釋放,這一過(guò)程稱(chēng)為對(duì)象的生命周期15.定義一個(gè)學(xué)生類(lèi)classStudent //Student是學(xué)生類(lèi)名{ //定義成員變量
privateintsNumber; //學(xué)號(hào)
privateStringsName; //姓名
privateStringsClass; //班號(hào)。以下是定義成員方法
voidsetSNumber(intxNumber) //成員方法setSNumber { sNumber=xNumber; } intgetSNumber() //成員方法getSNumber { returnsNumber; } voidsetSName(StringxName)//成員方法setSName { sName=xName; } StringgetSName() //成員方法getSName { returnsName; } voidsetSClass(StringxClass) //成員方法setSClass { sClass=xClass; } StringgetSClass(); //成員方法getSClass { returnsClass; }}16.創(chuàng)立對(duì)象過(guò)程對(duì)象的聲明對(duì)象的實(shí)例化對(duì)象的初始化17.對(duì)象的聲明對(duì)象聲明的語(yǔ)法形式為:類(lèi)名對(duì)象名;該語(yǔ)句從指定的類(lèi)創(chuàng)立對(duì)象。18.對(duì)象的實(shí)例化和初始化 必須給一個(gè)對(duì)象分配相應(yīng)的存儲(chǔ)空間,才能使用它。在聲明一個(gè)對(duì)象時(shí),并沒(méi)有為該對(duì)象分配存儲(chǔ)空間。對(duì)象的實(shí)例化完成對(duì)象的空間分配,對(duì)象實(shí)例化是通過(guò)new操作完成。構(gòu)造方法的調(diào)用那么確定了對(duì)象的初始狀態(tài),這一過(guò)程就是初始化19.對(duì)象創(chuàng)立過(guò)程的演示classCourse //Course是課程類(lèi)名{ //定義成員變量
privateintcNumber;//課程編號(hào)
privateStringcName;//課程名
privateintcUnit;//學(xué)分?jǐn)?shù)
//定義成員方法
voidsetCNumber(intxNumber) //成員方法setCNumber { cNumber=xNumber; } intgetCNumber()//成員方法getCNumber { returncNumber; } voidsetCName(StringxName)//成員方法setCName { cName=xName; }20. StringgetCName()//成員方法getCName { returncName; } voidsetCUnit(intxUnit)//成員方法setCUnit { cUnit=xUnit; } intgetCUnit() //成員方法getCUnit { returncUnit; } publicclassInitialDemo1 { publicstaticvoidmain(String[]args) { Coursecs1=newCourse();//聲明一個(gè)Course對(duì)象cs1 System.out.println(cs1.getCNumber());//輸出初始值cNumber System.out.println(cs1.getCName());//輸出初始值cName System.out.println(cs1.getCUnit());//輸出初始值cUnit }}21.演示對(duì)象的初始化classCourse //Course是類(lèi)名{ //定義成員變量 intcNumber=1; //課程編號(hào) StringcName=〞Wang〞;//課程名 intcUnit=2;//學(xué)分?jǐn)?shù)} publicclassInitialDemo2{ publicstaticvoidmain(String[]args) { Coursecs1=newCourse();//聲明一個(gè)Course對(duì)象cs1 System.out.println(cs1.cNumber);//輸出初始值cNumber System.out.println(cs1.cName);//輸出初始值cName System.out.println(cs1.cUnit);//輸出初始值cUnit }}22.演示使用構(gòu)造方法進(jìn)行初始化classCourse //Course是類(lèi)名{ //定義成員變量 intcNumber=1; StringcName; intcUnit=2; //構(gòu)造方法 Course(StringName,intUnit) { cName=Name; cUnit=Unit; }} publicclassInitialDemo3{ publicstaticvoidmain(String[ ]args) { Coursecs1=newCourse(“Zhang〞,6);//使用類(lèi)中聲明的構(gòu)造方法 //聲明一個(gè)Course對(duì)象cs1 System.out.println(cs1.cNumber); System.out.println(cs1.cName); System.out.println(cs1.cUnit); }}23.演示由子類(lèi)創(chuàng)立對(duì)象的過(guò)程classA{ intx=1; inty=1; A(intx1,inty1) { x=x1; y=y1; }}classBextendsA{ intx=2; floatz; B(intxx,intyy) { super(0,0);//子類(lèi)的構(gòu)造方法中先調(diào)用超類(lèi)的構(gòu)造方法,否那么Java調(diào)用默認(rèn)的構(gòu)造方法A() this.x=xx;this.y=yy; }}24.publicclassEtndsDemo{publicstaticvoidmain(String[]args){ Bb1=newB(1,2); System.out.println(b1.x); System.out.println(b1.y); System.out.println(b1.z);}}25.對(duì)象的使用引用對(duì)象的成員變量調(diào)用對(duì)象的成員方法對(duì)象作數(shù)組元素對(duì)象作類(lèi)的成員變量26.引用對(duì)象的成員變量
引用對(duì)象成員變量的語(yǔ)法形式為:
對(duì)象名.成員變量名;
27.例:Rectangle類(lèi)的聲明classRectangle{ intwidth;
intheight;
Rectangle()//Rectangle類(lèi)的構(gòu)造方法
{ width=20;height=30;
}}28.靜態(tài)變量和實(shí)例變量類(lèi)
myclassintVar1;staticintVar2;對(duì)象myobject1Var1Var2對(duì)象myobject2Var1Var2myobject1.Var2myobject2.Var2myobject1.Var1myobject2.Var1靜態(tài)變量實(shí)例變量
29.調(diào)用對(duì)象的成員方法如前所述,調(diào)用對(duì)象成員方法的語(yǔ)法形式為:對(duì)象名.成員方法名〔[實(shí)際參數(shù)表]〕;其中:⑴對(duì)象名指定所使用的對(duì)象;⑵成員方法名指定所要調(diào)用的成員方法;⑶實(shí)際參數(shù)表由0個(gè)或多個(gè)表達(dá)式構(gòu)成,表達(dá)式之間用逗號(hào)“,〞分隔30.調(diào)用對(duì)象方法參數(shù)傳遞過(guò)程演示classMethodDemo1{ //實(shí)現(xiàn)兩個(gè)形式參數(shù)x、y的相加,其和以方法返回值的形式傳回floatadd(floatx,floaty) { floatz; z=x+y; returnz; }}publicclassCallMethodDemo1{ publicstaticvoidmain(String[]args) { floatresult; methodDemo1addCall=newmethodDemo1(); result=addCall.add(3,5);//調(diào)用對(duì)象addCall的add方法,計(jì)算3+5System.out.println(result);//result的值為3+5 }}31.說(shuō)明實(shí)例
本例中類(lèi)MethodDemo1給出一個(gè)實(shí)現(xiàn)兩float型數(shù)相加的方法。方法的參數(shù)x、y是參與加法的操作數(shù),相加的結(jié)果存于局部變量z中,return語(yǔ)句指明z的值即是方法的返回值。類(lèi)CallMethodDemo1的add對(duì)象調(diào)用了類(lèi)MethodDemo1的方法add,實(shí)參為整型3和532.演示方法的一種用法classFact{floatfact(intn)//定義計(jì)算n!的方法
{ inti; floatx=1; for(i=1;i<n;i++) x=x*i; returnx;}}publicclassMethodCallDemo2{ publicstaticvoidmain(Stringargs[]) { Factx=newFact(); System.out.println(x.fact(10));//計(jì)算10!
System.out.println(x.fact(15));//計(jì)算15!
}}33.演示靜態(tài)方法的用法classFact{staticfloatfact(intn)//將方法fact聲名為靜態(tài)方法
{ inti; floatx=1; for(i=1;i<n;i++) x=x*i; returnx;}}publicclassMethodCallDemo5{ publicstaticvoidmain(Stringargs[]) { System.out.println(Fact.fact(10));//直接用類(lèi)名.方法名調(diào)用靜態(tài)方法
System.out.println(Fact.fact(15)); }}34.演示數(shù)組作為方法的參數(shù)Java中數(shù)組是作為對(duì)象來(lái)處理的classmethodDemo5{ floatfindMax(floatarr[])//形式參數(shù)arr[]是數(shù)組
{ inti; floattemp; temp=arr[0]; for(i=1;i<arr.length;i++) if(arr[i]>temp)temp=arr[i]; returntemp; }}35.publicclassMethodCallDemo6{ publicstaticvoidmain(Stringargs[]) { floatmax; floatx[]={1,2,3,4,5}; methodDemo5y=newmethodDemo5(); max=y.findMax(x);//實(shí)參x是數(shù)組,數(shù)組調(diào)用的返回值為5.0 System.out.println(max);}}36.對(duì)象作數(shù)組元素 對(duì)象也可以作數(shù)組元素,當(dāng)對(duì)象作數(shù)組元素時(shí),其數(shù)組稱(chēng)為對(duì)象的數(shù)組。創(chuàng)立對(duì)象的數(shù)組時(shí),首先對(duì)數(shù)組初始化,然后對(duì)數(shù)組的每個(gè)元素初始化37.對(duì)象作數(shù)組元素用法的演示classnode{ privateintdata; privatenodenext; voidsetData(intx) { data=x; } intgetData() { returndata; } nodegetNext() { returnnext; } voidsetNext(nodex) { next=x; }}38.publicclassObjAsArrayElementDemo{ publicstaticvoidmain(Stringargs[]) { //創(chuàng)立3個(gè)結(jié)點(diǎn) nodex[]=newnode[3]; //創(chuàng)立元素為node型對(duì)象的數(shù)組并初始化數(shù)組 inti; for(i=0;i<x.length;i++)//初始化數(shù)組元素——對(duì)象 x[i]=newnode(); //給結(jié)點(diǎn)的data賦值,并組成鏈表 for(i=0;i<x.length;i++) { x[i].setData(i); if(i<x.length-1)x[i].setNext(x[i+1]); } //利用start依次輸出鏈表各結(jié)點(diǎn)的值 nodestart=newnode(); start=x[0]; //指向鏈表的第1個(gè)結(jié)點(diǎn) System.out.println(start.getData()); //輸出x[0].data while(start.getNext()!=null) { start=start.getNext(); //指向下一結(jié)點(diǎn) System.out.println(start.getData()); //輸出x[i].data } }}39.對(duì)象作類(lèi)的成員變量classdate{ Stringyy;//年
Stringmm;//月
Stringdd;//日
date(Stringxyy,Stringxmm,Stringxdd) //date構(gòu)造方法
{ yy=xyy;mm=xmm;dd=xdd; }}classStudent{ privateintidNumber,height; //學(xué)號(hào)、身高
privatecharsex; //性別
datebirthday; //出生日期birthday是對(duì)象
//Student構(gòu)造方法
Student(intid,inth,chars,Stringxyy,Stringxmm,Stringxdd){ idNumber=id; height=h; sex=s; //調(diào)用date構(gòu)造方法
birthday=newdate(xyy,xmm,xdd); }
40. intgetHeight(){returnheight;} intgetSex(){returnsex;} voidshow(){//輸出學(xué)號(hào),身高,性別,出生年份 System.out.println(); System.out.print("/t"+idNumber); System.out.print("/t"+height); System.out.print("/t"+sex); System.out.println("/t"+birthday.yy); }}publicclassUseStudent{ publicstaticvoidmain(String[]args)throwsjava.io.IOException{ intsum=0; doubleave; Student[]a=newStudent[3];//創(chuàng)立對(duì)象的數(shù)組,數(shù)組元素初始化 a[0]=newStudent(100001,169,'女',"1976","06","12"); a[1]=newStudent(100002,155,'女',"1976","02","03"); a[2]=newStudent(100003,175,'男',"1976","05","25");//求平均身高 for(inti=0;i<a.length;i++){ sum=sum+a[i].getHeight(); } ave=sum/3.0; //輸出超過(guò)平均身高的女生學(xué)號(hào)與身高 System.out.println("超過(guò)平均身高的女生學(xué)號(hào)與身高為"); for(inti=0;i<a.length;i++) if((a[i].getHeight()>=ave)&(a[i].getSex()=='女')) a[i].show(); }}41.對(duì)象間的通信〔消息〕與實(shí)例方法的調(diào)用消息是一個(gè)對(duì)象發(fā)送給另一對(duì)象的信息,用來(lái)驅(qū)動(dòng)接受這一消息的對(duì)象的某個(gè)行為。消息由三局部組成:接受消息的對(duì)象、對(duì)象中描述某一行為的方法以及這一方法所需要的參數(shù)。這些問(wèn)題包括對(duì)象作方法的參數(shù)、作方法的返回值、作數(shù)組元素以及作類(lèi)的成員變量。42.對(duì)象作方法的參數(shù) 當(dāng)方法的參數(shù)時(shí)類(lèi)類(lèi)型時(shí),方法的實(shí)參就是一個(gè)對(duì)象,這就是對(duì)象作方法的參數(shù)的情形。與根本數(shù)據(jù)類(lèi)型的變量作方法參數(shù)的情形不同,在根本數(shù)據(jù)類(lèi)型的變量作方法參數(shù)的情形下,進(jìn)行方法調(diào)用時(shí)的語(yǔ)義動(dòng)作,是將實(shí)參的值傳遞給相應(yīng)的形參。43.對(duì)象作方法參數(shù)的演示classobjPara //定義對(duì)象作為參數(shù)的類(lèi){ floattemp; //用成員變量temp傳遞參數(shù)值}classmethodDemo4{ voidadd(floatx,floaty,objParaz)//對(duì)象z作為方法add的參數(shù)
{ z.temp=x+y; //方法體對(duì)對(duì)象z進(jìn)行操作,可以改變z的值
} voidcallAdd2(floatm,floatn) { objParak=newobjPara(); add(m,n,k);//向方法add發(fā)消息,將參數(shù)m,n的值分別傳遞給x,y,并將k的
//存儲(chǔ)地址值傳送給z,然后執(zhí)行方法add的方法體,計(jì)算x+y,
//計(jì)算結(jié)果通過(guò)k傳回callAdd方法
System.out.print(m+"+"+n+"="+k.temp);//k.temp的值即為m+n }}44.publicclassMethodCallDemo7{publicstaticvoidmain(Stringargs[]) { objParax=newobjPara(); methodDemo4y=newmethodDemo4(); System.out.println(x.temp);//x.temp值為0.0 y.add(1,2,x); //調(diào)用對(duì)象y的add方法,計(jì)算結(jié)果存于對(duì)象x的temp變量中
System.out.println(x.temp); //x.temp值為3.0 y.callAdd2(1,2);//輸出1+2的結(jié)果
}}45.對(duì)象作方法的返回值classnode{ privateintdata; privatenodenext;//成員變量next是node類(lèi)型,而node是正在聲明的類(lèi)類(lèi)型
voidsetData(intx) { data=x; } intgetData() { returndata; } nodegetNext()//此方法的返回值類(lèi)型是類(lèi)類(lèi)型
{ returnnext; } voidsetNext(nodex) { next=x; }}46.publicclassObjAsRetValDemo{ publicstaticvoidmain(Stringargs[]) { //創(chuàng)立3個(gè)結(jié)點(diǎn) nodex1=newnode(); nodex2=newnode(); nodex3=newnode(); //給結(jié)點(diǎn)的data賦值 x1.setData(1); x2.setData(2); x3.setData(3); //把3個(gè)結(jié)點(diǎn)組成鏈表 x1.setNext(x2);x2.setNext(x3); //利用start依次輸出鏈表各結(jié)點(diǎn)的值 nodestart=newnode(); start=x1;//指向結(jié)點(diǎn)x1 System.out.println(start.getData()); //輸出x1.data start=start.getNext();//指向下一結(jié)點(diǎn)x2 System.out.println(start.getData()); //輸出x2.data start=start.getNext();//指向下一結(jié)點(diǎn)x3 System.out.println(start.getData()); //輸出x3.data }}47.多態(tài)性方法的重構(gòu)與重載方法的動(dòng)態(tài)調(diào)用抽象類(lèi)48.多態(tài)性多態(tài)性,就是程序中同一操作在不同的環(huán)境中有不同語(yǔ)義解釋的現(xiàn)象。和繼承機(jī)制一樣,多態(tài)性是面向?qū)ο蠓椒ǖ囊淮筇厣?,它提供了使同一程序有很?qiáng)的適應(yīng)不同環(huán)境的能力的描述機(jī)制。49.方法的重構(gòu)與重載在直接子類(lèi)中定義的某個(gè)方法與其直接超類(lèi)的某個(gè)方法有相同的名稱(chēng)和參數(shù),那么稱(chēng)該子類(lèi)重構(gòu)〔Overriding〕了該超類(lèi)的該方法,重構(gòu)也稱(chēng)為覆蓋在同一個(gè)類(lèi)中定義了多個(gè)同名的方法,它們或有不同的形參個(gè)數(shù)或有不同的形參類(lèi)型,那么稱(chēng)該方法被重載〔Overloading〕50.方法重構(gòu)的演示classFather{voidspeak()//超類(lèi)定義的speak方法
{ System.out.println("IamFather!"); }}classSonextendsFather{ voidspeak()//子類(lèi)重構(gòu)的speak方法
{ System.out.println("IamSon!"); }}51.方法重構(gòu)的演示classFather{ voidspeak()//超類(lèi)定義的speak方法
{ System.out.println("IamFather!"); }}classDemoThisSuperextendsFather{ voidspeak()//子類(lèi)重構(gòu)的speak方法
{ System.out.println("IamSon!"); } voiddemThisSuper() { super.speak();//調(diào)用超類(lèi)Father的speak方法
this.speak();//調(diào)用子類(lèi)DemoThisSuper重構(gòu)的speak方法}}52.classMethodCallDemo4{ publicstaticvoidmain(Stringargs[]) { Fatherx=newFather(); DemoThisSupery=newDemoThisSuper(); x.speak(); //執(zhí)行方法體System.out.println("IamFather!"); y.speak(); //執(zhí)行方法體System.out.println("IamSon!"); y.demThisSuper(); //super.speak()執(zhí)行方法體System.out.println("IamFather!"); //this.speak()執(zhí)行方法體System.out.println("IamSon!"); }}53.演示方法的重載classDemoverload{ intadd(intx,inty) { returnx+y; } doubleadd(doublex,doubley) { returnx+y; }}classMethodCallDemo3{ publicstaticvoidmain(Stringargs[]) { Demoverloadx=newDemoverload(); intim=1,in=2; doublefm=1.0,fn=2.0; System.out.println(x.add(im,in));//調(diào)用時(shí),匹配整型加方法intadd(intx,inty) System.out.println(x.add(fm,fn)); //調(diào)用時(shí),匹配單精度型加方法
//doubleadd(doublex,doubley) }}54.方法重構(gòu)的規(guī)定子類(lèi)重構(gòu)父類(lèi)方法時(shí),子類(lèi)方法的返回類(lèi)型應(yīng)當(dāng)與被重構(gòu)方法的相同子類(lèi)不能重構(gòu)父類(lèi)的final和private方法子類(lèi)不能用實(shí)例方法去重構(gòu)父類(lèi)的static方法。子類(lèi)的static方法可重構(gòu)父類(lèi)的static方法,但不能重構(gòu)父類(lèi)的實(shí)例方法子類(lèi)方法重構(gòu)父類(lèi)方法時(shí),子類(lèi)方法的訪(fǎng)問(wèn)權(quán)限修飾詞不能?chē)?yán)于父類(lèi)方法的訪(fǎng)問(wèn)權(quán)限修飾詞子類(lèi)假設(shè)要引用父類(lèi)中的被重構(gòu)方法,應(yīng)使用“super.方法名〞的方式55.方法的動(dòng)態(tài)調(diào)用classLocation{//位置類(lèi)intx,y;//位置的坐標(biāo)
Location(intlocX,intlocY){x=locX;y=locY;} voidshow(){System.out.print("("+x+","+y+")");}}classPointextendsLocation{ //點(diǎn)類(lèi)
booleanvisible; //可見(jiàn)性
Point(intpointX,intpointY,booleantrueOrFalse){ super(pointX,pointY); //調(diào)用超類(lèi)的構(gòu)造方法
visible=trueOrFalse;} voidmoveTo(intnewX,intnewY){//方法----移動(dòng)到新位置
x=newX;y=newY; }}classCircleextendsPoint{ //圓類(lèi)
intr; //r存放半徑
Circle(intcentX,intcentY,intradius,booleantureOrFalse){ super(centX,centY,tureOrFalse); r=radius;}56.
voidexpand(intdelta){r=r+delta;}//方法----擴(kuò)展
voidcontract(intdelta){r=r–delta;}//方法----收縮
voidshow(){ System.out.print("\t圓心位于"); super.show(); System.out.print("\t半徑為"+r); if(visible)System.out.println("\t此圓發(fā)亮"); elseSystem.out.println("\t此圓不發(fā)亮");}}classTestPointCircle{publicstaticvoidmain(String[]args){Pointp=newPoint(200,200,false);System.out.print("\t點(diǎn)p的位置是");p.show();//調(diào)用超類(lèi)Location的show方法
System.out.println();Circlec=newCircle(100,100,20,true);c.show();//調(diào)用Circle類(lèi)的show方法
c.moveTo(300,400);c.expand(40);c.show();}}57.說(shuō)明 子類(lèi)對(duì)象的引用可以賦給超類(lèi)對(duì)象的引用;方法形參為某類(lèi)對(duì)象時(shí),可用其子類(lèi)對(duì)象作實(shí)參。當(dāng)子類(lèi)對(duì)象引用賦給父類(lèi)對(duì)象引用后,父類(lèi)對(duì)象引用引用的是子類(lèi)實(shí)例,用這個(gè)父類(lèi)引用來(lái)引用子類(lèi)實(shí)例成員〔變量與方法〕時(shí)只能引用與父類(lèi)成員同名的那些成員。假設(shè)成員變量出現(xiàn)隱藏,引用的是父類(lèi)變量,假設(shè)成員方法出現(xiàn)重構(gòu),引用的是子類(lèi)的方法。58.方法動(dòng)態(tài)調(diào)用的演示classTwoDimension{ voidshow(){}}classPointextendsTwoDimension{ privateintx,y; Point(intpx,intpy){x=px;y=py;} voidshow(){//重構(gòu)了超類(lèi)的show方法,輸出點(diǎn)的位置
System.out.println("點(diǎn)的位置是("+x+","+y+")"); }}classLineextendsTwoDimension{ privateintx1,y1,x2,y2; Line(intpx,intpy,intqx,intqy){ x1=px;y1=py;x2=qx;y2=qy; } voidshow(){//重構(gòu)了超類(lèi)的方法,輸出線(xiàn)段兩端位置,方法體語(yǔ)句略
}}59.classCircleextendsTwoDimension{ privateintcX,cY,radius; Circle(intx,inty,intr){ cX=x;cY=y;radius=r; } voidshow(){//重構(gòu)了超類(lèi)的方法,輸出圓心坐標(biāo)及半徑,方法體語(yǔ)句略
}}classUseTwoDimension{ staticvoidshowParameter(TwoDimensionplc){ plc.show(); } publicstaticvoidmain(String[]args){ Pointp=newPoint(10,10); Linel=newLine(0,20,100,20); Circlec=newCircle(100,100,50); //p,l,c均是TwoDimension類(lèi)的子類(lèi)類(lèi)型,充當(dāng)showParameter方法的實(shí)參
//將子類(lèi)對(duì)象引用賦給超類(lèi)對(duì)象引用
showParameter(p); //執(zhí)行p.show() showParameter(l); //執(zhí)行l(wèi).show() showParameter(c); //執(zhí)行c.show() }}60.抽象類(lèi) 使用修飾符abstract對(duì)類(lèi)加以修飾,這個(gè)類(lèi)就是抽象類(lèi)〔abstractclass〕,抽象類(lèi)不能被實(shí)例化。通常,抽象類(lèi)中含有抽象方法,抽象方法是指只給出方法聲明但沒(méi)有方法體的方法。子類(lèi)在繼承抽象類(lèi)時(shí),必須重構(gòu)其父類(lèi)的抽象方法,給出具體的定義。61.演示抽象類(lèi)及其用法abstractclassFigure //聲明抽象類(lèi)Figure{ doublex,y; voidset_size(doublesize1,doublesize2) { x=size1; y=size2; } //聲明抽象方法get_area,它沒(méi)有方法體
abstractdoubleget_area();} classTriangleextendsFigure //Triangle繼承抽象類(lèi)Figure { doubleget_area() //重構(gòu)其超類(lèi)的抽象方法get_area() { return(x*y/2); //三角形面積=底*高/2 } }classRectangleextendsFigure //Rectangle繼承抽象類(lèi)Figure{ doubleget_area() //重構(gòu)其超類(lèi)的抽象方法get_area() { return(x*y); //矩形面積=長(zhǎng)*寬
}}62.接口與包接口包63.接口接口〔interface〕是一個(gè)協(xié)定,它定義了一組行為的界面,但沒(méi)有定義行為的具體實(shí)現(xiàn)過(guò)程。任何一個(gè)類(lèi)都可以實(shí)現(xiàn)一個(gè)接口。所謂一個(gè)類(lèi)實(shí)現(xiàn)一個(gè)接口,是指這個(gè)類(lèi)給出這個(gè)接口的所有行為的具體實(shí)現(xiàn)過(guò)程。從語(yǔ)法上看,接口由接口首部和接口體組成。接口首部給出接口名,如果存在接口的繼承關(guān)系,也要在接口首部中給出。接口體主要是一組方法首部的說(shuō)明,接口體中也可以聲明一些常量。64.接口聲明、實(shí)現(xiàn)和使用的演示//聲明接口FigureinterfaceFigure//接口首部,interface是關(guān)鍵字,F(xiàn)igure是接口名//接口體{ voidset_size(doublesize1,doublesize2);//方法首部給出行為的界面
doubleget_area();}//接口聲明結(jié)束classTriangleimplementsFigure//Triangle實(shí)現(xiàn)接口Figure,implements是關(guān)鍵字{ doublex,y; //實(shí)現(xiàn)接口的方法,給出所實(shí)現(xiàn)接口的所有方法首部的方法體
publicvoidset_size(doublesize1,doublesize2) { x=size1; y=size2; } publicdoubleget_area() { return(x*y/2);//三角形面積=底*高/2 }}65.classRectangleimplementsFigure //Rectangle實(shí)現(xiàn)接口Figure{ doublex,y; publicvoidset_size(doublesize1,doublesize2) { x=size1; y=size2; } publicdoubleget_area() { return(x*y); //矩形面積=長(zhǎng)*寬 }}classoutput //output類(lèi)使用接口Figure{ staticvoidput(Figureq) //此方法的參數(shù)是接口類(lèi)型 { System.out.println(q.get_area()); }}publicclassTestInterface{ publicstaticvoidmain(String[]args){ Figureft=newTriangle();//創(chuàng)立接口對(duì)象,其方法的具體實(shí)現(xiàn)過(guò)程 //由Triangle類(lèi)給出 Figurefr=newRectangle();//創(chuàng)立接口對(duì)象,其方法的具體實(shí)現(xiàn)過(guò)程 //由Rectangle類(lèi)給出 Rectangler=newRectangle();r.set_size(2,2); ft.set_size(2,2);fr.set_size(2,2); output.put(ft);//實(shí)參是接口對(duì)象,輸出三角形面積:2 output.put(fr);//實(shí)參是接口對(duì)象,輸出矩形面積:4 output.put(r);//實(shí)參是實(shí)現(xiàn)接口的類(lèi)的對(duì)象,輸出矩形面積:4 }}66.接口與抽象類(lèi)的主要區(qū)別接口不能實(shí)現(xiàn)任何方法〔即不能給出方法的具體實(shí)現(xiàn)過(guò)程〕,而抽象類(lèi)卻可以一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能有一個(gè)直接超類(lèi)接口不是任何類(lèi)的繼承層次的組成局部,無(wú)關(guān)的幾個(gè)類(lèi)可以實(shí)現(xiàn)同一個(gè)接口67.包包的概念包的創(chuàng)立包中成員的使用68.包的概念包〔package〕是一組相關(guān)類(lèi)和接口的集合,它提供了訪(fǎng)問(wèn)權(quán)限和命名的管理機(jī)制。Java中的包主要有三個(gè)作用: 1〕使得功能相關(guān)的類(lèi)易于查找和使用----同一包中的類(lèi)和接口通常是功能相關(guān)的; 2〕防止了命名的沖突----不同包中的不同類(lèi)可以同名; 3〕提供一種訪(fǎng)問(wèn)權(quán)限的控制機(jī)制69.包的創(chuàng)立創(chuàng)立一個(gè)包,只需在定義了類(lèi)和接口的源文件的第一行使用package語(yǔ)句package語(yǔ)句的作用域是包含該語(yǔ)句的整個(gè)源文件70.包中成員的使用三種方法使用包中的成員。如果要使用包A中的成員x,我們可以:⑴用長(zhǎng)名A.x引用成員x;⑵importA.x語(yǔ)句裝入包的成員x;⑶importA語(yǔ)句裝入整個(gè)包A。71.訪(fǎng)問(wèn)控制與修飾符類(lèi)成員的訪(fǎng)問(wèn)權(quán)限類(lèi)的修飾符72.類(lèi)成員的訪(fǎng)問(wèn)權(quán)限private、protected和public是類(lèi)成員〔包括成員變量和成員方法〕的訪(fǎng)問(wèn)權(quán)限修飾符。73.類(lèi)成員的訪(fǎng)問(wèn)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物流運(yùn)輸服務(wù)標(biāo)準(zhǔn)制定與執(zhí)行協(xié)議3篇
- 2025年人教新課標(biāo)九年級(jí)科學(xué)下冊(cè)階段測(cè)試試卷
- 二手房銷(xiāo)售協(xié)議格式文件(2024年版)版B版
- 二零二五年度茶葉廢棄物資源化利用合同5篇
- 2024起訴離婚前夫妻共同財(cái)產(chǎn)評(píng)估及分割律師服務(wù)合同6篇
- 2024砂石材料采購(gòu)與礦山節(jié)能減排技術(shù)應(yīng)用合同3篇
- 簡(jiǎn)單運(yùn)輸車(chē)輛租賃合同范本
- 2024版汽車(chē)租賃合同模板
- 2025年度廠(chǎng)房出售附帶售后服務(wù)保障合同3篇
- 軟件開(kāi)發(fā)的合同模板
- 四年級(jí)小學(xué)英語(yǔ)答題卡模板1
- 實(shí)驗(yàn)室清潔、消毒記錄登記表
- 電視綜藝娛樂(lè)類(lèi)節(jié)目主持精選課件
- 藥品生產(chǎn)質(zhì)量管理規(guī)范(2010版)(含13個(gè)附錄)
- 合唱與指揮課程教學(xué)大綱
- 110千伏、35千伏線(xiàn)路遷改工程技術(shù)條款
- 航空服務(wù)禮儀ppt課件(PPT 20頁(yè))
- 性格色彩培訓(xùn)-ppt課件
- 胸腔積液小講課PPT課件
- TPM之成本損失分析
- 協(xié)和復(fù)旦上醫(yī)同濟(jì)哈醫(yī)等各大醫(yī)科院校近年內(nèi)科學(xué)考博真題集
評(píng)論
0/150
提交評(píng)論