版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
返回
Java程式結(jié)構(gòu) Java語言是一種純面向?qū)ο蟮某淌皆O(shè)計(jì)語言,它的核心概念是類和對(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)性介面與包訪問控制與修飾符類層次結(jié)構(gòu)繼承的概念繼承的描述類的繼承規(guī)則變數(shù)的隱藏繼承的概念在日常生活中,我們常用“是一種(is-a)”關(guān)係來組織與表達(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ù),或字串)有不同的語義解釋。這種在程式中同一方法對(duì)不同類型的對(duì)象有不同解釋的現(xiàn)象稱為多態(tài)性多態(tài)性與繼承是密不可分的。通常,兩類對(duì)象都有共同的父類,在父類中定義的方法在這兩個(gè)子類中分別有不同的實(shí)現(xiàn)超類與子類我們在聲明類A時(shí),指明類A繼承了類B(類B是一個(gè)已定義了的類),則類A通常就擁有了類B的成員變數(shù)和方法。此時(shí),類B稱為類A的直接超類(superclass),超類也稱為父類或基類;類A稱為類B的直接子類(subclass),子類也稱為派生類繼承的描述Java語言中,聲明類首部的格式如下:
[類的修飾符]class
類名
[extends
超類名][implement
介面名表]其中“extends
超類名”部分就是用來描述繼承的,這裏超類名指明所聲明類的直接超類
繼承描述的演示
classCar //聲明Car類
{
int
car_number; voidset_number(int
car_num) {
car_number=car_num; } voidshow_number() {
System.out.println("我的車號(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分別用來指明直接子類和其直接超類中同名的成員變數(shù)當(dāng)超類的成員變數(shù)、子類的成員變數(shù)和類中方法使用的局部變數(shù)三者同名,或其中的兩者同名時(shí),可以使用關(guān)鍵字this和super來指定所要使用的變數(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ā)展和消亡的過程,在Java中分別稱之為對(duì)象的創(chuàng)建、使用和釋放,這一過程稱為對(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ì)象過程對(duì)象的聲明對(duì)象的實(shí)例化對(duì)象的初始化對(duì)象的聲明對(duì)象聲明的語法形式為:
類名對(duì)象名;該語句從指定的類創(chuàng)建對(duì)象。對(duì)象的實(shí)例化和初始化
必須給一個(gè)對(duì)象分配相應(yīng)的存儲(chǔ)空間,才能使用它。在聲明一個(gè)對(duì)象時(shí),並沒有為該對(duì)象分配存儲(chǔ)空間。對(duì)象的實(shí)例化完成對(duì)象的空間分配,對(duì)象實(shí)例化是通過new操作完成。構(gòu)造方法的調(diào)用則確定了對(duì)象的初始狀態(tài),這一過程就是初始化對(duì)象創(chuàng)建過程的演示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ì)象的過程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ù)的語法形式為:
對(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ì)象成員方法的語法形式為:
對(duì)象名.成員方法名([實(shí)際參數(shù)表]);其中:⑴對(duì)象名指定所使用的對(duì)象;⑵成員方法名指定所要調(diào)用的成員方法;⑶實(shí)際參數(shù)表由0個(gè)或多個(gè)運(yùn)算式構(gòu)成,運(yùn)算式之間用逗號(hào)“,”分隔調(diào)用對(duì)象方法參數(shù)傳遞過程演示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 }}說明實(shí)例
本例中類MethodDemo1給出一個(gè)實(shí)現(xiàn)兩float型數(shù)相加的方法。方法的參數(shù)x、y是參與加法的運(yùn)算元,相加的結(jié)果存於局部變數(shù)z中,return語句指明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ì)象來處理的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; //輸出超過平均身高的女生學(xué)號(hào)與身高
System.out.println("超過平均身高的女生學(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ì)象的資訊,用來驅(qū)動(dòng)接受這一消息的對(duì)象的某個(gè)行為。消息由三部分組成:接受消息的對(duì)象、對(duì)象中描述某一行為的方法以及這一方法所需要的參數(shù)。這些問題包括對(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í)的語義動(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é)果通過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)境中有不同語義解釋的現(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í),子類方法的訪問許可權(quán)修飾詞不能嚴(yá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; //可見性
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();}}說明
子類對(duì)象的引用可以賦給超類對(duì)象的引用;方法形參為某類對(duì)象時(shí),可用其子類對(duì)象作實(shí)參。當(dāng)子類對(duì)象引用賦給父類對(duì)象引用後,父類對(duì)象引用引用的是子類實(shí)例,用這個(gè)父類引用來引用子類實(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)了超類的方法,輸出線段兩端位置,方法體語句略
}}classCircleextendsTwoDimension{ privateint
cX,cY,radius;
Circle(intx,inty,intr){
cX=x;cY=y;radius=r; } voidshow(){//重構(gòu)了超類的方法,輸出圓心座標(biāo)及半徑,方法體語句略
}}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í)例化。通常,抽象類中含有抽象方法,抽象方法是指只給出方法聲明但沒有方法體的方法。子類在繼承抽象類時(shí),必須重構(gòu)其父類的抽象方法,給出具體的定義。演示抽象類及其用法abstractclassFigure //聲明抽象類Figure{ doublex,y; voidset_size(doublesize1,doublesize2) { x=size1; y=size2; } //聲明抽象方法get_area,它沒有方法體
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); //矩形面積=長*寬
}}介面與包介面包介面介面(interface)是一個(gè)協(xié)定,它定義了一組行為的介面,但沒有定義行為的具體實(shí)現(xiàn)過程。任何一個(gè)類都可以實(shí)現(xiàn)一個(gè)介面。所謂一個(gè)類實(shí)現(xiàn)一個(gè)介面,是指這個(gè)類給出這個(gè)介面的所有行為的具體實(shí)現(xiàn)過程。從語法上看,介面由介面首部和介面體組成。介面首部給出介面名,如果存在介面的繼承關(guān)係,也要在介面首部中給出。介面體主要是一組方法首部的說明,介面體中也可以聲明一些常量。介面聲明、實(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); //矩形面積=長*寬
}}classoutput //output類使用介面Figure{ staticvoidput(Figureq) //此方法的參數(shù)是介面類型
{ System.out.println(q.get_area()); }}publicclassTestInterface{ publicstaticvoidmain(String[]args){ Figureft=newTriangle();//創(chuàng)建介面對(duì)象,其方法的具體實(shí)現(xiàn)過程
//由Triangle類給出
Figurefr=newRectangle();//創(chuàng)建介面對(duì)象,其方法的具體實(shí)現(xiàn)過程
//由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)過程),而抽象類卻可以一個(gè)類可以實(shí)現(xiàn)多個(gè)介面,但只能有一個(gè)直接超類介面不是任何類的繼承層次的組成部分,無關(guān)的幾個(gè)類可以實(shí)現(xiàn)同一個(gè)介面包包的概念包的創(chuàng)建包中成員的使用包的概念包(package)是一組相關(guān)類和介面的集合,它提供了訪問許可權(quán)和命名的管理機(jī)制。Java中的包主要有三個(gè)作用:
1)使得功能相關(guān)的類易於查找和使用----同一包中的類和介面通常是功能相關(guān)的;
2)避免了命名的衝突----不同包中的不同類可以同名;
3)提供一種訪問許可權(quán)的控制機(jī)制包的創(chuàng)建創(chuàng)建一個(gè)包,只需在定義了類和介面的原始檔案的第一行使用package語句package語句的作用域是包含該語句的整個(gè)原始檔案包中成員的使用三種方法使用包中的成員。如果要使用包A中的成員x,我們可以:⑴用長名A.x引用成員x;⑵importA.x語句裝入包的成員x;⑶importA語句裝入整個(gè)包A。訪問控制與修飾符類成員的訪問許可權(quán)類的修飾符類成員的訪問許可權(quán)private、protected和public是類成員(包括成員變數(shù)和成員方法)的
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國男士精梳細(xì)針彈力內(nèi)褲數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國恭喜發(fā)財(cái)工藝品數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2030年中國光學(xué)輪廓儀數(shù)據(jù)監(jiān)測研究報(bào)告
- 2025至2031年中國蘋果酸鋅行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025年度航空零部件代工與銷售合同4篇
- 臨時(shí)用電供應(yīng)合同樣本版
- 2025年度模具租賃與全球市場拓展合同2篇
- 2025年印刷玩具彩盒行業(yè)深度研究分析報(bào)告
- 2025年度房地產(chǎn)抵押典當(dāng)貸款業(yè)務(wù)合作協(xié)議4篇
- 二零二五版虛擬現(xiàn)實(shí)技術(shù)路演投資協(xié)議4篇
- 2025年上半年江蘇連云港灌云縣招聘“鄉(xiāng)村振興專干”16人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- DB3301T 0382-2022 公共資源交易開評(píng)標(biāo)數(shù)字見證服務(wù)規(guī)范
- 人教版2024-2025學(xué)年八年級(jí)上學(xué)期數(shù)學(xué)期末壓軸題練習(xí)
- 江蘇省無錫市2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題(原卷版)
- 俄語版:中國文化概論之中國的傳統(tǒng)節(jié)日
- 2022年湖南省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 婦科一病一品護(hù)理匯報(bào)
- 哪吒之魔童降世
- 2022年上海市各區(qū)中考一模語文試卷及答案
- 2024年全國統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- 我國無菌包裝行業(yè)消費(fèi)量已超千億包-下游需求仍存擴(kuò)容潛力
評(píng)論
0/150
提交評(píng)論