Java程序結(jié)構(gòu)課件_第1頁(yè)
Java程序結(jié)構(gòu)課件_第2頁(yè)
Java程序結(jié)構(gòu)課件_第3頁(yè)
Java程序結(jié)構(gòu)課件_第4頁(yè)
Java程序結(jié)構(gòu)課件_第5頁(yè)
已閱讀5頁(yè),還剩78頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

返回

Java程式結(jié)構(gòu) Java語(yǔ)言是一種純面向?qū)ο蟮某淌皆O(shè)計(jì)語(yǔ)言,它的核心概念是類和對(duì)象,它的程式是基於類和對(duì)象建造的,程式中類的結(jié)構(gòu)決定了程式的結(jié)構(gòu)。這一章較深入系統(tǒng)地介紹Java程式的結(jié)構(gòu),介紹組成Java程式的類之間的關(guān)係。Java程式結(jié)構(gòu)類層次結(jié)構(gòu)對(duì)象的使用與對(duì)象間通信多態(tài)性介面與包訪問(wèn)控制與修飾符類層次結(jié)構(gòu)繼承的概念繼承的描述類的繼承規(guī)則變數(shù)的隱藏繼承的概念在日常生活中,我們常用“是一種(is-a)”關(guān)係來(lái)組織與表達(dá)知識(shí),從而將知識(shí)組織成一種有層次、可分類的結(jié)構(gòu)。面向?qū)ο蟪淌皆O(shè)計(jì)方法將is-a關(guān)係引入到程式設(shè)計(jì)領(lǐng)域,用於描述類與類之間的關(guān)係,稱之為繼承。多態(tài)性同一運(yùn)算或方法(如“+”)對(duì)不同類型的對(duì)象(如整型數(shù),或字串)有不同的語(yǔ)義解釋。這種在程式中同一方法對(duì)不同類型的對(duì)象有不同解釋的現(xiàn)象稱為多態(tài)性多態(tài)性與繼承是密不可分的。通常,兩類對(duì)象都有共同的父類,在父類中定義的方法在這兩個(gè)子類中分別有不同的實(shí)現(xiàn)超類與子類我們?cè)诼暶黝怉時(shí),指明類A繼承了類B(類B是一個(gè)已定義了的類),則類A通常就擁有了類B的成員變數(shù)和方法。此時(shí),類B稱為類A的直接超類(superclass),超類也稱為父類或基類;類A稱為類B的直接子類(subclass),子類也稱為派生類繼承的描述Java語(yǔ)言中,聲明類首部的格式如下:

[類的修飾符]class

類名

[extends

超類名][implement

介面名表]其中“extends

超類名”部分就是用來(lái)描述繼承的,這裏超類名指明所聲明類的直接超類

繼承描述的演示

classCar //聲明Car類

{

int

car_number; voidset_number(int

car_num) {

car_number=car_num; } voidshow_number() {

System.out.println("我的車(chē)號(hào)是:"+car_number); } } classTrashCarextendsCar//聲明TrashCar類,它繼承Car類

{

int

capacipy; voidset_capacity(int

trash_car_capacipy) {

capacipy=trash_car_capacipy; } voidshow_capacity() {

System.out.println("我的容量是:"+capacipy+""); } }類的繼承規(guī)則直接子類繼承那些被聲明為public或protected的直接超類成員(包括成員變數(shù)和成員方法,下同)直接子類繼承那些未被存取許可權(quán)修飾符修飾的直接超類成員,只要該子類與該超類在同一個(gè)包中如果直接子類聲明了一個(gè)與直接超類中的成員同名的成員,則該子類不繼承該超類中的該同名成員直接子類不繼承被修飾為private的直接超類的成員

變數(shù)的隱藏直接子類聲明了一個(gè)與其直接超類的成員變數(shù)同名的成員變數(shù),則稱該超類的該成員變數(shù)在該直接子類中被隱藏,關(guān)鍵字this和super分別用來(lái)指明直接子類和其直接超類中同名的成員變數(shù)當(dāng)超類的成員變數(shù)、子類的成員變數(shù)和類中方法使用的局部變數(shù)三者同名,或其中的兩者同名時(shí),可以使用關(guān)鍵字this和super來(lái)指定所要使用的變數(shù)this和super區(qū)別同名變數(shù)的演示classA{

intx; //類A中聲明了成員變數(shù)x ┇}classBextendsA //類B繼承類A,也繼承了類A的成員變數(shù)x{

intx; //類B中又聲明了成員變數(shù)x ┇ voidm() {

intx; //方法m聲明了自己的局部變數(shù)x ┇

super.x=2; //super.x是其所在類的父類即類A的x

this.x=1; //this.x

是其所在類即類B的x x=100; //x是方法本身的局部變數(shù)x ┇ }}對(duì)象的使用與對(duì)象間通信對(duì)象的創(chuàng)建對(duì)象的使用對(duì)象間的通信(消息)與實(shí)例方法的調(diào)用對(duì)象的創(chuàng)建Java中,類是某一類對(duì)象的共同特徵(屬性、行為)的描述,即類中含有某一類對(duì)象具有哪些屬性、哪些行為的資訊。而由類創(chuàng)建的多個(gè)對(duì)象都具有類所定義的那些屬性和行為。但是,由同一個(gè)類所創(chuàng)建的不同對(duì)象的同一個(gè)屬性的值可能不同對(duì)象的生命週期對(duì)象和現(xiàn)實(shí)生活中的事物一樣,有它的產(chǎn)生、發(fā)展和消亡的過(guò)程,在Java中分別稱之為對(duì)象的創(chuàng)建、使用和釋放,這一過(guò)程稱為對(duì)象的生命週期

定義一個(gè)學(xué)生類classStudent //Student是學(xué)生類名{ //定義成員變數(shù)

privateint

sNumber; //學(xué)號(hào)

privateStringsName; //姓名

privateStringsClass; //班號(hào)。以下是

定義成員方法

voidsetSNumber(int

xNumber) //成員方法setSNumber { sNumber=xNumber; }

int

getSNumber() //成員方法getSNumber { returnsNumber; } voidsetSName(String

xName)//成員方法setSName { sName=xName; } StringgetSName() //成員方法getSName { returnsName; } voidsetSClass(String

xClass) //成員方法setSClass { sClass=xClass; } StringgetSClass(); //成員方法getSClass { returnsClass; }}創(chuàng)建對(duì)象過(guò)程對(duì)象的聲明對(duì)象的實(shí)例化對(duì)象的初始化對(duì)象的聲明對(duì)象聲明的語(yǔ)法形式為:

類名對(duì)象名;該語(yǔ)句從指定的類創(chuàng)建對(duì)象。對(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ò)程就是初始化對(duì)象創(chuàng)建過(guò)程的演示classCourse //Course是課程類名{ //定義成員變數(shù)

privateint

cNumber;//課程編號(hào)

privateStringcName;//課程名

privateint

cUnit;//學(xué)分?jǐn)?shù)

//定義成員方法

voidsetCNumber(int

xNumber) //成員方法setCNumber {

cNumber=xNumber; }

int

getCNumber()//成員方法getCNumber { returncNumber; } voidsetCName(String

xName)//成員方法setCName {

cName=xName; } StringgetCName()//成員方法getCName { returncName; } voidsetCUnit(int

xUnit)//成員方法setCUnit {

cUnit=xUnit; }

int

getCUnit() //成員方法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 }}演示對(duì)象的初始化classCourse //Course是類名{ //定義成員變數(shù)

int

cNumber=1; //課程編號(hào)

StringcName=”Wang”;//課程名

int

cUnit=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 }}演示使用構(gòu)造方法進(jìn)行初始化classCourse //Course是類名{ //定義成員變數(shù)

int

cNumber=1; StringcName;

int

cUnit=2; //構(gòu)造方法

Course(StringName,intUnit) {

cName=Name;

cUnit=Unit; }} publicclassInitialDemo3{ publicstaticvoidmain(String[ ]args) { Coursecs1=newCourse(“Zhang”,6);//使用類中聲明的構(gòu)造方法

//聲明一個(gè)Course對(duì)象cs1 System.out.println(cs1.cNumber); System.out.println(cs1.cName); System.out.println(cs1.cUnit); }}演示由子類創(chuàng)建對(duì)象的過(guò)程classA{

intx=1;

inty=1;

A(intx1,inty1) { x=x1; y=y1; }}classBextendsA{

intx=2; floatz;

B(int

xx,int

yy) { super(0,0);//子類的構(gòu)造方法中先調(diào)用超類的構(gòu)造方法,否則Java調(diào)用默認(rèn)的構(gòu)造方法A()

this.x=xx;this.y=yy; }}publicclassEtndsDemo

{publicstaticvoidmain(String[]args){ Bb1=newB(1,2); System.out.println(b1.x); System.out.println(b1.y); System.out.println(b1.z);}}對(duì)象的使用引用對(duì)象的成員變數(shù)調(diào)用對(duì)象的成員方法對(duì)象作數(shù)組元素對(duì)象作類的成員變數(shù)引用對(duì)象的成員變數(shù)

引用對(duì)象成員變數(shù)的語(yǔ)法形式為:

對(duì)象名.成員變數(shù)名;

例:Rectangle類的聲明classRectangle{

intwidth;

intheight;

Rectangle()//Rectangle類的構(gòu)造方法

{ width=20;height=30;

}}靜態(tài)變數(shù)和實(shí)例變數(shù)類

myclassintVar1;staticintVar2;對(duì)象myobject1Var1Var2對(duì)象myobject2Var1Var2myobject1.Var2myobject2.Var2myobject1.Var1myobject2.Var1靜態(tài)變數(shù)實(shí)例變數(shù)

調(diào)用對(duì)象的成員方法如前所述,調(diào)用對(duì)象成員方法的語(yǔ)法形式為:

對(duì)象名.成員方法名([實(shí)際參數(shù)表]);其中:⑴對(duì)象名指定所使用的對(duì)象;⑵成員方法名指定所要調(diào)用的成員方法;⑶實(shí)際參數(shù)表由0個(gè)或多個(gè)運(yùn)算式構(gòu)成,運(yùn)算式之間用逗號(hào)“,”分隔調(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+5

System.out.println(result);//result的值為3+5 }}說(shuō)明實(shí)例

本例中類MethodDemo1給出一個(gè)實(shí)現(xiàn)兩float型數(shù)相加的方法。方法的參數(shù)x、y是參與加法的運(yùn)算元,相加的結(jié)果存於局部變數(shù)z中,return語(yǔ)句指明z的值即是方法的返回值。類CallMethodDemo1的add對(duì)象調(diào)用了類MethodDemo1的方法add,實(shí)參為整型3和5演示方法的一種用法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!

}}演示靜態(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));//直接用類名.方法名調(diào)用靜態(tài)方法

System.out.println(Fact.fact(15)); }}演示數(shù)組作為方法的參數(shù)Java中數(shù)組是作為對(duì)象來(lái)處理的classmethodDemo5{ floatfindMax(float

arr[])//形式參數(shù)arr[]是數(shù)組

{

inti; floattemp; temp=arr[0];

for(i=1;i<arr.length;i++) if(arr[i]>temp)temp=arr[i]; returntemp; }}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);}}對(duì)象作數(shù)組元素

對(duì)象也可以作數(shù)組元素,當(dāng)對(duì)象作數(shù)組元素時(shí),其數(shù)組稱為對(duì)象的數(shù)組。創(chuàng)建對(duì)象的數(shù)組時(shí),首先對(duì)數(shù)組初始化,然後對(duì)數(shù)組的每個(gè)元素初始化對(duì)象作數(shù)組元素用法的演示classnode{ privateintdata; privatenodenext; voidsetData(intx) { data=x; }

int

getData() { returndata; } nodegetNext() { returnnext; } voidsetNext(nodex) { next=x; }}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 } }}對(duì)象作類的成員變數(shù)classdate{ Stringyy;//年

Stringmm;//月

Stringdd;//日

date(String

xyy,Stringxmm,Stringxdd) //date構(gòu)造方法

{

yy=xyy;mm=xmm;dd=xdd; }}classStudent{ privateint

idNumber,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); }

int

getHeight(){returnheight;}

int

getSex(){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)throws

java.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(); }}對(duì)象間的通信(消息)與實(shí)例方法的調(diào)用消息是一個(gè)對(duì)象發(fā)送給另一對(duì)象的資訊,用來(lái)驅(qū)動(dòng)接受這一消息的對(duì)象的某個(gè)行為。消息由三部分組成:接受消息的對(duì)象、對(duì)象中描述某一行為的方法以及這一方法所需要的參數(shù)。這些問(wèn)題包括對(duì)象作方法的參數(shù)、作方法的返回值、作數(shù)組元素以及作類的成員變數(shù)。對(duì)象作方法的參數(shù)

當(dāng)方法的參數(shù)時(shí)類類型時(shí),方法的實(shí)參就是一個(gè)對(duì)象,這就是對(duì)象作方法的參數(shù)的情形。與基本數(shù)據(jù)類型的變數(shù)作方法參數(shù)的情形不同,在基本數(shù)據(jù)類型的變數(shù)作方法參數(shù)的情形下,進(jìn)行方法調(diào)用時(shí)的語(yǔ)義動(dòng)作,是將實(shí)參的值傳遞給相應(yīng)的形參。對(duì)象作方法參數(shù)的演示classobjPara //定義對(duì)象作為參數(shù)的類{ floattemp; //用成員變數(shù)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 }}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變數(shù)中

System.out.println(x.temp); //x.temp值為3.0 y.callAdd2(1,2);//輸出1+2的結(jié)果

}}對(duì)象作方法的返回值classnode{ privateintdata; privatenodenext;//成員變數(shù)next是node類型,而node是正在聲明的類類型

voidsetData(intx) { data=x; }

int

getData() { returndata; } nodegetNext()//此方法的返回值類型是類類型

{ returnnext; } voidsetNext(nodex) { next=x; }}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 }}多態(tài)性方法的重構(gòu)與重載方法的動(dòng)態(tài)調(diào)用抽象類多態(tài)性多態(tài)性,就是程式中同一操作在不同的環(huán)境中有不同語(yǔ)義解釋的現(xiàn)象。和繼承機(jī)制一樣,多態(tài)性是面向?qū)ο蠓椒ǖ囊淮筇厣?,它提供了使同一程式有很?qiáng)的適應(yīng)不同環(huán)境的能力的描述機(jī)制。方法的重構(gòu)與重載在直接子類中定義的某個(gè)方法與其直接超類的某個(gè)方法有相同的名稱和參數(shù),則稱該子類重構(gòu)(Overriding)了該超類的該方法,重構(gòu)也稱為覆蓋在同一個(gè)類中定義了多個(gè)同名的方法,它們或有不同的形參個(gè)數(shù)或有不同的形參類型,則稱該方法被重載(Overloading)方法重構(gòu)的演示classFather{voidspeak()//超類定義的speak方法

{

System.out.println("IamFather!"); }}classSonextendsFather{ voidspeak()//子類重構(gòu)的speak方法

{

System.out.println("IamSon!"); }}方法重構(gòu)的演示classFather{ voidspeak()//超類定義的speak方法

{

System.out.println("IamFather!"); }}classDemoThisSuperextendsFather{ voidspeak()//子類重構(gòu)的speak方法

{

System.out.println("IamSon!"); } voiddemThisSuper() {

super.speak();//調(diào)用超類Father的speak方法

this.speak();//調(diào)用子類DemoThisSuper重構(gòu)的speak方法}}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!"); }}演示方法的重載classDemoverload{ int

add(int

x,inty) { returnx+y; } doubleadd(double

x,doubley) { returnx+y; }}classMethodCallDemo3{ publicstaticvoidmain(Stringargs[]) { Demoverloadx=newDemoverload();

int

im=1,in=2; doublefm=1.0,fn=2.0;

System.out.println(x.add(im,in));//調(diào)用時(shí),匹配整型加方法int

add(int

x,inty)

System.out.println(x.add(fm,fn)); //調(diào)用時(shí),匹配單精確度型加方法

//doubleadd(double

x,doubley) }}方法重構(gòu)的規(guī)定子類重構(gòu)父類方法時(shí),子類方法的返回類型應(yīng)當(dāng)與被重構(gòu)方法的相同子類不能重構(gòu)父類的final和private方法子類不能用實(shí)例方法去重構(gòu)父類的static方法。子類的static方法可重構(gòu)父類的static方法,但不能重構(gòu)父類的實(shí)例方法子類方法重構(gòu)父類方法時(shí),子類方法的訪問(wèn)許可權(quán)修飾詞不能?chē)?yán)於父類方法的訪問(wèn)許可權(quán)修飾詞子類若要引用父類中的被重構(gòu)方法,應(yīng)使用“super.方法名”的方式方法的動(dòng)態(tài)調(diào)用classLocation{//位置類int

x,y;//位置的座標(biāo)

Location(int

locX,int

locY){x=locX;y=locY;} voidshow(){System.out.print("("+x+","+y+")");}}classPointextendsLocation{ //點(diǎn)類

booleanvisible; //可見(jiàn)性

Point(int

pointX,int

pointY,boolean

trueOrFalse){

super(pointX,pointY); //調(diào)用超類的構(gòu)造方法

visible=trueOrFalse;} voidmoveTo(int

newX,int

newY){//方法----移動(dòng)到新位置

x=newX;y=newY; }}classCircleextendsPoint{ //圓類

intr; //r存放半徑

Circle(int

centX,int

centY,int

radius,boolean

tureOrFalse){

super(centX,centY,tureOrFalse); r=radius;}

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)用超類Location的show方法

System.out.println();Circlec=newCircle(100,100,20,true);

c.show();//調(diào)用Circle類的show方法

c.moveTo(300,400);c.expand(40);

c.show();}}說(shuō)明

子類對(duì)象的引用可以賦給超類對(duì)象的引用;方法形參為某類對(duì)象時(shí),可用其子類對(duì)象作實(shí)參。當(dāng)子類對(duì)象引用賦給父類對(duì)象引用後,父類對(duì)象引用引用的是子類實(shí)例,用這個(gè)父類引用來(lái)引用子類實(shí)例成員(變數(shù)與方法)時(shí)只能引用與父類成員同名的那些成員。若成員變數(shù)出現(xiàn)隱藏,引用的是父類變數(shù),若成員方法出現(xiàn)重構(gòu),引用的是子類的方法。方法動(dòng)態(tài)調(diào)用的演示

classTwoDimension{ voidshow(){}}classPointextendsTwoDimension{ privateintx,y;

Point(int

px,int

py){x=px;y=py;} voidshow(){//重構(gòu)了超類的show方法,輸出點(diǎn)的位置

System.out.println("點(diǎn)的位置是("+x+","+y+")"); }}classLineextendsTwoDimension{ privateintx1,y1,x2,y2;

Line(int

px,int

py,int

qx,int

qy){ x1=px;y1=py;x2=qx;y2=qy; } voidshow(){//重構(gòu)了超類的方法,輸出線段兩端位置,方法體語(yǔ)句略

}}classCircleextendsTwoDimension{ privateint

cX,cY,radius;

Circle(intx,inty,intr){

cX=x;cY=y;radius=r; } voidshow(){//重構(gòu)了超類的方法,輸出圓心座標(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類的子類類型,充當(dāng)showParameter方法的實(shí)參

//將子類對(duì)象引用賦給超類對(duì)象引用

showParameter(p); //執(zhí)行p.show()

showParameter(l); //執(zhí)行l(wèi).show()

showParameter(c); //執(zhí)行c.show() }}抽象類

使用修飾符abstract對(duì)類加以修飾,這個(gè)類就是抽象類(abstractclass),抽象類不能被實(shí)例化。通常,抽象類中含有抽象方法,抽象方法是指只給出方法聲明但沒(méi)有方法體的方法。子類在繼承抽象類時(shí),必須重構(gòu)其父類的抽象方法,給出具體的定義。演示抽象類及其用法abstractclassFigure //聲明抽象類Figure{ doublex,y; voidset_size(doublesize1,doublesize2) { x=size1; y=size2; } //聲明抽象方法get_area,它沒(méi)有方法體

abstractdoubleget_area();} classTriangleextendsFigure //Triangle繼承抽象類Figure { doubleget_area() //重構(gòu)其超類的抽象方法get_area() { return(x*y/2); //三角形面積=底*高/2 } }classRectangleextendsFigure //Rectangle繼承抽象類Figure{ doubleget_area() //重構(gòu)其超類的抽象方法get_area() {

return(x*y); //矩形面積=長(zhǎng)*寬

}}介面與包介面包介面介面(interface)是一個(gè)協(xié)定,它定義了一組行為的介面,但沒(méi)有定義行為的具體實(shí)現(xiàn)過(guò)程。任何一個(gè)類都可以實(shí)現(xiàn)一個(gè)介面。所謂一個(gè)類實(shí)現(xiàn)一個(gè)介面,是指這個(gè)類給出這個(gè)介面的所有行為的具體實(shí)現(xiàn)過(guò)程。從語(yǔ)法上看,介面由介面首部和介面體組成。介面首部給出介面名,如果存在介面的繼承關(guān)係,也要在介面首部中給出。介面體主要是一組方法首部的說(shuō)明,介面體中也可以聲明一些常量。介面聲明、實(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 }}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類使用介面Figure{ staticvoidput(Figureq) //此方法的參數(shù)是介面類型

{ System.out.println(q.get_area()); }}publicclassTestInterface{ publicstaticvoidmain(String[]args){ Figureft=newTriangle();//創(chuàng)建介面對(duì)象,其方法的具體實(shí)現(xiàn)過(guò)程

//由Triangle類給出

Figurefr=newRectangle();//創(chuàng)建介面對(duì)象,其方法的具體實(shí)現(xiàn)過(guò)程

//由Rectangle類給出

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)介面的類的對(duì)象,輸出矩形面積:4 }}介面與抽象類的主要區(qū)別介面不能實(shí)現(xiàn)任何方法(即不能給出方法的具體實(shí)現(xiàn)過(guò)程),而抽象類卻可以一個(gè)類可以實(shí)現(xiàn)多個(gè)介面,但只能有一個(gè)直接超類介面不是任何類的繼承層次的組成部分,無(wú)關(guān)的幾個(gè)類可以實(shí)現(xiàn)同一個(gè)介面包包的概念包的創(chuàng)建包中成員的使用包的概念包(package)是一組相關(guān)類和介面的集合,它提供了訪問(wèn)許可權(quán)和命名的管理機(jī)制。Java中的包主要有三個(gè)作用:

1)使得功能相關(guān)的類易於查找和使用----同一包中的類和介面通常是功能相關(guān)的;

2)避免了命名的衝突----不同包中的不同類可以同名;

3)提供一種訪問(wèn)許可權(quán)的控制機(jī)制包的創(chuàng)建創(chuàng)建一個(gè)包,只需在定義了類和介面的原始檔案的第一行使用package語(yǔ)句package語(yǔ)句的作用域是包含該語(yǔ)句的整個(gè)原始檔案包中成員的使用三種方法使用包中的成員。如果要使用包A中的成員x,我們可以:⑴用長(zhǎng)名A.x引用成員x;⑵importA.x語(yǔ)句裝入包的成員x;⑶importA語(yǔ)句裝入整個(gè)包A。訪問(wèn)控制與修飾符類成員的訪問(wèn)許可權(quán)類的修飾符類成員的訪問(wèn)許可權(quán)private、protected和public是類成員(包括成員變數(shù)和成員方法)的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論