Java入门与进阶设计第11章:继承与Overriding_第1页
Java入门与进阶设计第11章:继承与Overriding_第2页
Java入门与进阶设计第11章:继承与Overriding_第3页
Java入门与进阶设计第11章:继承与Overriding_第4页
Java入门与进阶设计第11章:继承与Overriding_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java入門與進階設計第11章:繼承與Overriding,講師:紀俊男cnchi.tw,本章重點,所有物件的祖先java.lang.Object抽象類別abstractclass繼承可繼承成員,可覆蓋成員,不繼承成員無後代類別finalclass介面介紹,物件的終極祖先java.lang.Object,Java中的所有物件,全部繼承自java.lang.Object只要程式師沒有以extends指定superclass,Java會自動用Object作為所有物件的父物件。,java.lang.Object的方法,以下方法,可能是您想覆蓋的:cloneequalstoStringfinalize以下方法,宣告為final,不可以覆蓋:getClasshashCodenotifynotifyAllwait,java.lang.Object的方法,clone原始宣告:protectedObjectclone()throwsCloneNotSupportedException作用:複製一份物件本身,並傳回去。要求:蓋寫clone()函數的類別,需實作Cloneable介面。蓋寫clone()時,要攔截CloneNotSupportedException,clone範例(1),publicclassCloneTestpublicstaticvoidmain(Stringargs)PointFirstPoint=newPoint(1,2);PointSecondPoint=(Point)FirstPoint.clone();System.out.println(FirstPoint:(+FirstPoint.x+,+FirstPoint.y+);System.out.println(SecondPoint:(+SecondPoint.x+,+SecondPoint.y+);classPointimplementsCloneable/MemberVariablesintx;inty;,clone範例(2),/ConstructorspublicPoint()x=0;y=0;publicPoint(intx,inty)this.x=x;this.y=y;/MemberFuncationsvoiddraw()System.out.println(Onepointhasbeendrawnat(+x+,+y+);,clone範例(3),/Object.clone()(Overriding)protectedObjectclone()tryPointp=(Point)super.clone();p.x=this.x;p.y=this.y;returnp;catch(CloneNotSupportedExceptione)thrownewInternalError();,java.lang.Object的方法,equals原始宣告:publicbooleanequals(Objectobj);作用:比較兩個物件的內含值是否相等。要求:無,equals範例(1),publicclassEqualsTestpublicstaticvoidmain(Stringargs)PointFirstPoint=newPoint(1,2);PointSecondPoint=newPoint(1,2);if(FirstPoint.equals(SecondPoint)System.out.println(FirstPoint=SecondPoint);elseSystem.out.println(FirstPoint!=SecondPoint);classPoint/MemberVariablesintx;inty;/ConstructorspublicPoint()x=0;y=0;,equals範例(2),publicPoint(intx,inty)this.x=x;this.y=y;/MemberFuncationsvoiddraw()System.out.println(Onepointhasbeendrawnat(+x+,+y+);/Object.equals()(Overriding)publicbooleanequals(Pointobj)return(this.x=obj.x),java.lang.Object的方法,toString原始宣告:publicStringtoString();作用:傳回一個此物件的描述字串要求:無,toString範例(1),publicclasstoStringTestpublicstaticvoidmain(Stringargs)PointFirstPoint=newPoint(1,2);System.out.println(FirstPoint.toString();classPoint/MemberVariablesintx;inty;/ConstructorspublicPoint()x=0;y=0;,toString範例(2),publicPoint(intx,inty)this.x=x;this.y=y;/MemberFuncationsvoiddraw()System.out.println(Onepointhasbeendrawnat(+x+,+y+);/Object.toString()(Overriding)publicStringtoString()returnPoint(+x+,+y+);,java.lang.Object的方法,finalize原始宣告:protectedvoidfinalize()throwsThrowable作用:物件離開其有效範圍時,一定會被叫用的函式。用來清除本物件以new霸佔的記憶體。要求:要丟出Throwable,供Java攔截錯誤。程式碼最後一行,最好去呼叫super.finalize();因為父類別(此處為java.lang.Object)也有可能需要清除它自己霸佔的記憶體。,finalize範例(1),publicclassFinalizeTestpublicstaticvoidmain(Stringargs)LineMyLine=newLine(1,1,5,5);MyLine.draw();classPointpublicintx;publicinty;publicPoint()x=0;y=0;,finalize範例(2),publicPoint(intx,inty)this.x=x;this.y=y;publicvoiddraw()System.out.println(Onepointhasbeendrawnat+x+,+y);classLine/MemberVariablespublicPointStart;publicPointEnd;/ConstructorpublicLine()Start=newPoint(0,0);End=newPoint(0,0);,finalize範例(3),publicLine(inta,intb,intc,intd)Start=newPoint(a,b);End=newPoint(c,d);publicLine(Pointp1,Pointp2)Start=newPoint(p1.x,p1.y);End=newPoint(p2.x,p2.y);publicvoiddraw()System.out.println(Line:(+Start.x+,+Start.y+)-(+End.x+,+End.y+);protectedvoidfinalize()throwsThrowableStart=null;End=null;super.finalize();,finalize與GarbageCollection,在JavaVM中,有一個一直在工作的背景程式,叫做“GarbageCollector”。該程式會來回在記憶體中尋找沒有被任何變數擁有的記憶體。如果有,則將之回收。所以在Java中,要拋棄一個記憶體,只要:Start=null;End=null;,java.lang.Object的方法,getClass原始宣告:publicfinalClassgetClass();作用:可取得一個類別的所有資訊。包括類別名稱,父類別名稱,實作介面名稱,所有成員變數及成員函式,甚至於可以由取回的class資料個體化一個物件。要求:不准覆寫(Overriding)傳回值:傳回java.lang.Class。傳回後,您就可以使用所有java.lang.Class的屬性與方法。,getClass範例(1),publicclassgetClassTestpublicstaticvoidmain(Stringargs)PointFirstPoint=newPoint(1,2);System.out.println(Classname:+FirstPoint.getClass().getName();,getClass範例(2),classPointpublicintx;publicinty;publicPoint()x=0;y=0;publicPoint(intx,inty)this.x=x;this.y=y;publicvoiddraw()System.out.println(Onepointhasbeendrawnat+x+,+y);,java.lang.Object的方法,hashCode傳回物件在“雜湊表”(HashTable)中的索引值。通常配合java.util.Hashtable使用。notify,notifyAll,wait此三個函式用於多工處理。我們將在“執行緒(Thread)”一章解釋。,java.lang.Object摘要,所有物件的終極祖先是誰?Object內部有哪些方法?試述clone,equals,toString,finalize的作用。試述getClass,hashCode的作用。,繼承(Inheritance),定義子類別接收父類別的屬性,方法,並加以修改或覆蓋宣告class子類別名稱extends父類別名稱classLineextendsGraphicsObject注意Java不支援多重繼承,也就是說,一個子類別只能有一個父類別。,繼承(Inheritance),可繼承成員(InheritableMembers)Superclass中宣告為public或protected的成員。如果Subclass與Superclass在同一個package中,會繼承未做任何範圍宣告的成員。可覆蓋成員(OverridingMembers)任何與Superclass同名的成員必覆蓋成員宣告成abstract的成員不可蓋成員宣告成final的成員,繼承(Inheritance),不繼承成員如果Subclass與Superclass在不同package,所有未宣告有效範圍的成員全部不繼承。Superclass中宣告成private的成員,繼承範例(1),publicclassInheritTestpublicstaticvoidmain(Stringargs)ColorPointMyPoint=newColorPoint(1,2,Yellow);MyPoint.Draw();,繼承範例(2),classPointpublicintx;publicinty;publicPoint()x=0;y=0;publicPoint(intx,inty)this.x=x;this.y=y;publicvoidDraw()System.out.println(Onepointhasbeendrawnat+x+,+y);,繼承範例(3),classColorPointextendsPointpublicStringColor;publicColorPoint()Color=Black;publicColorPoint(intx,inty,StringnewColor)this.x=x;this.y=y;Color=newColor;publicvoidDraw()super.Draw();System.out.println(Color:+Color);,無後代類別(finalclass),定義一個不准被別人繼承的類別稱為finalclass。宣告finalclass類別名稱finalclassColorPoint使用時機防止他人繼承某類別後,以同名方式存在,行破壞之實。當一個類別已經十分完美時。,無後代類別範例,如:ColorPoint類別已經相當完美,您可以將它宣告為,finalclassColorPointextendsPointpublicStringColor;publicColorPoint()Color=Black;publicColorPoint(intx,inty,StringnewColor)this.x=x;this.y=y;Color=newColor;publicvoidDraw()super.Draw();System.out.println(Color:+Color);,不可覆寫函式(finalmethod),定義一個不准被subclass覆寫的函式稱為finalmethod宣告final傳回值型態函式名稱(參數,);使用時機當覆寫會出現問題時。,抽象類別(abstractclass),定義類別內部有尚未定義實作內容的函式,則此類別必須宣告為abstractclass,該函式需宣告為abstract函式。宣告方法abstractclassABCD特性宣告為abstract的類別無法產生實體。例如,您無法對上述類別做:ABCDmyABCD=newABCD();,抽象類別(abstractclass),使用時機當某類別只是在定義一些抽象概念,並不是想利用此類別實作一個物件時。範例,GraphicsObject,Rectangle,Circle,Line,abstract,抽象類別實例(1),publicclassAbstractTestpublicstaticvoidmain(Stringargs)PointMyPoint=newPoint(1,2);LineMyLine=newLine(1,2,3,4);RectangleMyRect=newRectangle(1,2,10,5);CircleMyCircle=newCircle(1,2,10);MyPoint.Draw();MyLine.Draw();MyRect.Draw();MyCircle.Draw();,抽象類別實例(2),classPointpublicintx;publicinty;publicPoint()x=0;y=0;publicPoint(intx,inty)this.x=x;this.y=y;publicvoidDraw()System.out.println(Onepointhasbeendrawnat+x+,+y);,抽象類別實例(3),abstractclassGraphicsObjectprotectedPointOrigin;publicGraphicsObject()Origin=newPoint(0,0);publicvoidmoveTo(intnewX,intnewY)Origin.x=newX;Origin.y=newY;publicabstractvoidDraw();protectedvoidfinalize()throwsThrowableOrigin=null;super.finalize();,抽象類別實例(4),classRectangleextendsGraphicsObjectpublicintLength;publicintHeight;publicRectangle()Length=0;Height=0;publicRectangle(intLeft,intTop,intLen,intHigh)Origin.x=Left;Origin.y=Top;Length=Len;Height=High;publicvoidDraw()System.out.println(Rectanglehasbeendrawnatn+(+Origin.x+,+Origin.y+)-(+(Origin.x+Length)+,+Origin.y+)n+(+Origin.x+,+(Origin.y+Height)+)-(+(Origin.x+Length)+,+(Origin.y+Height)+);,抽象類別實例(5),classCircleextendsGraphicsObjectpublicintRadius;publicCircle()Radius=0;publicCircle(inta,intb,intr)Origin.x=a;Origin.y=b;Radius=r;publicvoidDraw()System.out.println(Circlehasbeendrawnatn+Center:(+Origin.x+,+Origin.y+)n+Radius:+Radius);,抽象類別實例(6),classLineextendsGraphicsObjectpublicPointEnd;publicLine()End=newPoint(0,0);publicLine(inta,intb,intc,intd)Origin.x=a;Origin.y=b;End=newPoint(c,d);publicLine(Pointp1,Pointp2)Origin.x=p1.x;Origin.y=p1.y;End=newPoint(p2.x,p2.y);publicvoidDraw()System.out.println(Line:(+Origin.x+,+Origin.y+)-(+End.x+,+End.y+);protectedvoidfinalize()throwsThrowableEnd=null;super.finalize();,介面(Interface),定義一段只有常數與函式宣告,但沒有函式實作的程式碼。宣告publicinterface介面名稱extends父介面名稱作用讓某個功能,不論由誰實作,都能夠有相同的函式名稱,傳入值,傳出值,與存取範圍。,介面(Interface),例如:,GraphicsObject,Rectangle,Circle,Line,Paintable,介面(Interface),為何不用abstractclass?如果把外掛功能做成abstractclass而不是interface,會使得需要此外掛功能的class一定得繼承這個abstractclass。如此一來,它就不能繼承其它的類別了。(Java不支援多重繼承)因為多重繼承會有問題,但實際上又有多重繼承的需要,所以發明了interface,作為折衷的替代方案。,介面(Interface),注意事項如果某介面繼承另一個介面,則subclass能從superclass繼承到的只有常數與函式宣告而已。介面一旦公佈出去,開始供大家使用後,就請盡量不要更改。因為一旦更改,那些已經使用此介面的程式會因無法實作新功能,而不能執行。如果真要更改,請宣告新介面,其它人就可以決定要實作一個介面或兩個介面都實作。,介面實例(1),publicclassInterfaceTestpublicstaticvoidmain(Stringargs)Rectanglerect=newRectangle(1,1,10,5);rect.Draw();rect.FillColor(Blue);System.out.println(AreaofRectangle:+rect.Area();,介面實例(2),classPointpublicintx;publicinty;publicPoint()x=0;y=0;publicPoint(intx,inty)this.x=x;this.y=y;publicvoidDraw()System.out.println(Onepointhasbeendrawnat+x+,+y);,介面實例(3),abstractclassGraphicsObjectprotectedPointOrigin;publicGraphicsObject()Origin=newPoint(0,0);publicvoidmoveTo(intnewX,intnewY)Origin.x=newX;Origin.y=newY;publi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论