呼叫相同類別底下的另一個建構(gòu)元課件_第1頁
呼叫相同類別底下的另一個建構(gòu)元課件_第2頁
呼叫相同類別底下的另一個建構(gòu)元課件_第3頁
呼叫相同類別底下的另一個建構(gòu)元課件_第4頁
呼叫相同類別底下的另一個建構(gòu)元課件_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

ManagingInheritanceLecturer:曾學文ManagingInheritanceLecturer:曾1Outlinethis存取控制(AccessControl)static關鍵字實體成員與類別成員static初值設定區(qū)塊YourTurn物件導向語言三大特性封裝(Encapsulation)繼承(Inheritance)同名異型(Polymorphism)OverridingOverloadingsuper關鍵字Java物件祖先:Object類別FinalClassesandMethodsYourTurnOutlinethis2this關鍵字this關鍵字:用來存取目前的物件通常在instancemethod或建構(gòu)元(constructor)內(nèi)使用this,可以呼叫目前物件的任何成員。原因:成員變數(shù)被method或是建構(gòu)元內(nèi)的同名參數(shù)給『遮蔽』了常使用在constructor裡,當參數(shù)與成員變數(shù)名稱相同時在method裡使用this的目的,是為了要避免成員變數(shù)與參數(shù)之間的混用(ambiguity),尤其當參數(shù)名稱與成員變數(shù)名稱相同時this也可用來呼叫此物件的methodsthis也可以用來呼叫此物件的constructorthis關鍵字this關鍵字:用來存取目前的物件3this關鍵字可以透過this,呼叫相同類別底下的另一個建構(gòu)元publicclassAClass{ privateintx,y; privateintwidth,height; publicAClass(){

this(0,0,0,0); } publicAClass(intwidth,intheight){

this(0,0,width,height); } publicAClass(intx,inty,intwidth,intheight){ this.x=x; this.y=y; this.width=width; this.height=height; } ...}this關鍵字可以透過this,呼叫相同類別底下的另一個4this關鍵字具有二個建構(gòu)元的Box類別classBox{ doublewidth,height,depth;

//預設的建構(gòu)元

Box(){ this(1,2,3); } //可以自行指定長寬的建構(gòu)元

Box(intwidth,intheight,intdepth){ this.width=width; this.height=height; this.depth=depth; }}this關鍵字具有二個建構(gòu)元的Box類別classB5this關鍵字Example:BoxDemo.javaclassBoxDemo{ publicstaticvoidmain(Stringargs[]){ //宣告、配置與初始化Box物件

BoxmyBox1=newBox(); BoxmyBox2=newBox(10,20,30); doublevol1,vol2; //顯示第一個盒子的體積

myBox1.showVolume(); //獲得第二個盒子的體積 myBox2.showVolume(); }}this關鍵字Example:BoxDemo.javac6YourTurn建立一個Rectangle類別此類別必須完成下列要求建構(gòu)元初始化預設長、寬各為8、4可自行設定矩形之長與寬可以複製相同物件的建構(gòu)元(傳進去的參數(shù)為要copy的物件)顯示目前的長、寬之值取得目前矩形之面積畫矩形,由*構(gòu)成邊長sdfsadsadsa在RectangleDemo類別下,寫個main()來測試所有功能YourTurn建立一個Rectangle類別7YourTurnHintclassRectangle{ finalintDEFAULT_LENGTH=8; finalintDEFAULT_WIDTH=4; privateintlength; privateintwidth;

Rectangle(){…}

Rectangle(intlength,intwidth){…} Rectangle(Rectangleobj){…}

voidshowLW(){…}

doublegetArea(){…}

voiddrawRect(){…} publicstaticvoidmain(String[]args){…}}YourTurnHintclassRectangle{8存取控制(AccessControl)控制存取的關鍵字public、protected、private置於類別或成員宣告之前若沒有指定任何存取權(quán)限,表示此類別或成員僅供相同類別庫的其他類別使用,稱為packageaccess

層級將類別或成員設定為packageaccess層級的好處是可使同在一個類別庫下的每個類別互相使用成員存取控制(AccessControl)控制存取的關鍵字9存取控制(AccessControl)public任何類別皆可存取defaultpacketageaccessprotected允許宣告的類別、子類別與同一個套件中的類別使用private只有在類別內(nèi)部可以存取對於成員變數(shù),通常設定為private權(quán)限,再透過methods,如get/set來存取資料存取控制(AccessControl)public10存取控制(AccessControl)ClassAccess類別不可設定為private或protected若為了避免他人任意使用constructors建立物件可將constructors設定為private另外提供static的methods建立物件、複製物件main()必須由程式外部的程式碼來呼叫(Java執(zhí)行時期系統(tǒng)),所以main()必須為public設計存取秘訣:設定適合但最嚴苛的存取等級。因此,盡量使用private。如此在修改成員變數(shù)內(nèi)容時,只能透過method。除非,在評估設為public後會對於程式效能有顯著提升的情況。存取控制(AccessControl)ClassAcce11存取控制(AccessControl)Example:Alpha.javaprivateintiamprivate=1;intiampackage=2;//packageaccessprotectedintiamprotected=3;publicintiampublic=4;privatevoidprivateMethod(){System.out.println("iamprivateMethod");}voidpackageMethod(){//default:packageaccessSystem.out.println("iampackageMethod");}protectedvoidprotectedMethod(){System.out.println("iamprotectedMethod");}publicvoidpublicMethod(){System.out.println("iampublicMethod");}存取控制(AccessControl)Example:A12存取控制(AccessControl)Example:DeltaOne.javapackageOne;publicclassDeltaOne{publicstaticvoidmain(String[]args){Alphaa=newAlpha();//a.privateMethod();//illegala.packageMethod();//legaltectedMethod();//legala.publicMethod();//legal

//System.out.println("iamprivate:“+a.iamprivate);//illegalSystem.out.println("iampackage:“+a.iampackage);//legalSystem.out.println("iamprotected:“+a.iamprotected);//legalSystem.out.println("iampublic:“+a.iampublic);//legal}}存取控制(AccessControl)Example:D13存取控制(AccessControl)Example:DeltaTwo.javapackageTwo;importOne.*;publicclassDeltaTwo{publicstaticvoidmain(String[]args){Alphaalpha=newAlpha();//alpha.privateMethod();//illegal//alpha.packageMethod();//illegal//tectedMethod();//illegalalpha.publicMethod();//legal//System.out.println("iamprivate:“+alpha.iamprivate);//illegal//System.out.println("iampackage:“+alpha.iampackage);//illegal//System.out.println("iamprotected:“+alpha.iamprotected);//illegalSystem.out.println("iampublic:“+alpha.iampublic);//legal}}存取控制(AccessControl)Example:D14static關鍵字實體成員與類別成員變數(shù)或methods若宣告為static,則此變數(shù)或methods即為類別變數(shù)(classvariables)或類別方法(classmethods)宣告為static的變數(shù)或methods不屬於任何此類別的物件,屬於此類別所有物件共同擁有宣告staticDataTypeVarName;staticReturnType

MethodName(ArgList)使用ClassName.VarNameClassName.MethodName(ArgList)static關鍵字實體成員與類別成員15static關鍵字使用時機無論此類別擁有多少物件,這份資料只需要一份某種方法在實行時,與個別的物件無關即便是沒有任何物件被產(chǎn)生,依舊可以使用被宣告成static的變數(shù)與methods;相反的,instancevariables與methods必須透過物件才能實施在staticmethods裡,無法直接呼叫instancemethods或直接使用instancevariables因為instancevariables與methods必須透過物件才能實施static關鍵字使用時機16static關鍵字被用static宣告的類別方法和類別變數(shù),意思上就像是其他程式語言中的全域函數(shù)(globalfunctions)和全域變數(shù)(globalvariables),例如:C語言因此,如果要很多宣告成static的方法或變數(shù)的話,必須要謹慎使用!static關鍵字被用static宣告的類別方法和類別17static關鍵字-實體成員與類別成員static關鍵字-實體成員與類別成員18static關鍵字-實體成員與類別成員Example:StaticDemo.javapublicclassStaticDemo{publicintinstanceInteger=0;publicintinstanceMethod(){returninstanceInteger;}publicstaticintclassInteger=0;publicstaticintclassMethod(){returnclassInteger;}publicstaticvoidmain(String[]args){…}}static關鍵字-實體成員與類別成員Example:19static初值設定區(qū)塊class變數(shù)或是實體變數(shù),可以直接設定初值publicclassBedAndBreakfast{publicstaticfinalintMAX_CAPACITY=10;//initializeto10privatebooleanfull=false;//initializetofalse}限制:不能用if-else來設定初值設定初值時,不可以處理exceptions若發(fā)生exceptions,也無法做錯誤處理static初值設定區(qū)塊class變數(shù)或是實體變數(shù),可以20static初值設定區(qū)塊static初值設定區(qū)塊Java允許將static變數(shù)集合起來進行初始化動作語法:因為x和isOK都是class變數(shù),無法在建構(gòu)元中設定初值,且利用static初設設定區(qū)塊可以處理exceptions。classTestClass{staticintx;staticbooleanisOK;static{x=100;//staticintx;isOK=false;//staticisOK;}}static初值設定區(qū)塊static初值設定區(qū)塊clas21建構(gòu)元(Constructors)修飾建構(gòu)元的關鍵字private如果一個類別裡所有的建構(gòu)元都是宣告成private的話,那這個類別應該會有public的類別方法(classmethod),讓其他類別建立此類別之物件protected只有該類別的subclass,或是屬同一個package裡的類別,才可以使用此建構(gòu)元public所有類別都可以使用此建構(gòu)元預設只有同一個package裡的類別,才能使用此建構(gòu)元建構(gòu)元(Constructors)修飾建構(gòu)元的關鍵字22YourTurn整理上次寫的Rectangle類別此類別必須完成下列要求此類別不提供

constructor供外部存?。閜rivate)要提供三個classmethods來建立Rectangle物件第一個是使用預設長寬:長8,寬4(createRect)第二個是可以讓使用者自行指定(createRect)第三個複製矩形(cloneRect)顯示目前的長、寬之值(showLW)取得目前矩形之面積(getArea)畫矩形,由*構(gòu)成邊長(drawRect)YourTurn整理上次寫的Rectangle類別23YourTurnHint//建構(gòu)元privateRectangle(){…} //另一個建構(gòu)元privateRectangle(intlength,intwidth){…}//此建構(gòu)元提供給cloneObj用,用以複製privateRectangle(Rectangleobj){…}//提供一個可以製造長方形的classmethodstaticRectanglecreateRect(){…}//提供一個可以製造且自行設定長方形的classmethodstaticRectanglecreateRect(intlen,intwidth){…}//複製此長方形staticRectanglecloneRect(Rectangleobj){…}//顯示現(xiàn)在的長、寬voidshowLW(){…}//取得現(xiàn)在的面積doublegetArea(){…}//畫出此長方形voiddrawRect(){…}YourTurnHint//建構(gòu)元24物件導向三大特性封裝(Encapsulation)設計Class,決定要將哪些屬性,方法,事件封入類別中的動作叫做封裝。讓程式碼可以以Class為單位分類,並讓文件撰寫可以用物件導向模式撰寫(e.g.,classdiagram)。繼承(Inheritance)設計Class時,先利用現(xiàn)存Class作為“祖先”,再加以增加或修改功能的動作叫繼承。讓程式碼可以輕易地重複使用,並形成樹狀結(jié)構(gòu)之classdiagram。同名異型(Polymorphism)呼叫相同的函式,卻會出現(xiàn)不同的行為的現(xiàn)象,稱為同名異型。分為“overriding”及“overloading”。擴充既有程式碼之功能。物件導向三大特性封裝(Encapsulation)25物件導向三大特性封裝(Encapsulation)設計一個Class的屬性,方法,事件,稱為“封裝”一個類別。人類屬性:身高體重年齡方法:走路跑步事件:被打驚嚇開心物件導向三大特性封裝(Encapsulation)人類屬性26物件導向三大特性繼承(Inheritance)設計Class時,先利用現(xiàn)存Class作為“祖先”,再加以增加或修改功能的動作叫繼承。讓程式碼可以輕易地重複使用,並形成樹狀結(jié)構(gòu)之classdiagram貝多芬人類屬性:身高體重年齡方法:走路跑步事件:被打驚嚇開心=165=80=45音樂家作曲發(fā)表物件導向三大特性繼承(Inheritance)貝多芬人類屬27物件導向三大特性同名異型(Polymorphism)Overriding若繼承下來後,不滿意祖先定義的方法,子孫可以在繼承以後重新改寫,稱為Overriding。人類屬性:身高體重年齡方法:走路跑步事件:被打驚嚇開心音樂家作曲發(fā)表人類.走路(){約一分鐘三十步}音樂家.走路(){約一分鐘十步}同樣是呼叫“走路”,宣告成人類與音樂家就是不一樣。物件導向三大特性同名異型(Polymorphism)人類屬28物件導向三大特性同名異型(Polymorphism)Overloading同一份函式,準備多種定義,以供各種場合呼叫,稱為Overloading。人類屬性:身高體重年齡方法:走路跑步事件:被打驚嚇開心音樂家作曲作曲(委託人)音樂家.作曲(“王先生”)自動判斷物件導向三大特性同名異型(Polymorphism)人類屬29封裝(Encapsulation)將資料(屬性)與方法(行為)封裝在一個物件裡頭,物件裡頭的資料與方法被緊緊的綁在一起,並擁有資訊隱藏(Informationhiding)的特性。Example:TimeDemo.javaclassTime{

privateinthour;

privateintminute;

privateintsecond;

publicTime(){…}

publicvoidsetTime(inthh,intmm,intss){…}

publicStringtoString(){…}

}封裝(Encapsulation)將資料(屬性)與方法(行30繼承(Inheritance)繼承概念圖繼承(Inheritance)繼承概念圖31繼承(Inheritance)語法:

classClassNameextendsBaseClass例如:classLineextendsGraphicsObjectBaseClass(SuperClass):基底類別、父類別DerivedClass(Subclass):衍生類別、子類別Java理論上不支援多重繼承,也就是說,一個子類別只能有一個父類別。子類別將會繼承到父類別中所有可以存取的成員,包括:變數(shù)以及方法注意:建構(gòu)元(constructor)無法被繼承Java中每個物件的總祖先:Object類別(java.lang.Object)繼承(Inheritance)語法:classClass32繼承(Inheritance)可繼承成員Superclass中宣告為public

或protected

的成員。如果Subclass與Superclass在同一個package中,會繼承未做任何存取控制宣告的成員。不可繼承成員如果Subclass與Superclass在不同package,所有未宣告有效範圍的成員全部不繼承。(因為預設式packageaccess)Superclass中宣告成private的成員繼承(Inheritance)可繼承成員33繼承(Inheritance)Example:Dog.javapublicclassDog{ //屬性(Variables) privateStringname; privateStringcolor; privateintage; //建構(gòu)元(Constructor) publicDog(Stringname,Stringcolor,intage){ =name; this.color=color; this.age=age; }

//方法(Methods) publicvoidbark(){…} publicvoidhandshake(){…} publicvoidrollover(inttheTimes){…} …}繼承(Inheritance)Example:Dog.ja34繼承(Inheritance)Example:Pomer.javapublicclassPomerextendsDog{ //建構(gòu)元

publicPomer(Stringname,Stringcolor,intage){

super(name,color,age); } //新的方法

publicvoidproud(){ System.out.println("哼..."); }}繼承(Inheritance)Example:Pomer.35同名異型(Polymorphism)覆蓋Overriding若繼承下來後,不滿意祖先定義的方法,子孫可以在繼承以後重新改寫,稱為Overriding??筛采w成員任何與Superclass同名的成員必覆蓋成員Subclass一定要覆蓋superclass中宣告為abstract的methods,除非subclass本身也是abstract類別不可覆蓋成員Subclass不可覆蓋superclass的finalmethods同名異型(Polymorphism)覆蓋Overrid36同名異型(Polymorphism)覆蓋Overriding將父類別Dog的Handshake方法Override掉classPomerextendsDog{

//建構(gòu)元 publicPomer(Stringname,Stringcolor,Stringage){ super(name,color,age); } //將父類別Dog中原有的handshake()方法Override掉

publicvoidhandshake(){ System.out.println("你的手洗了嗎?"); }

publicvoidproud() { System.out.println(“哼..."); }}同名異型(Polymorphism)覆蓋Overrid37同名異型(Polymorphism)過載Overloading同一份函式,準備多種定義,以供各種場合呼叫,稱為Overloading。建構(gòu)元也可以利用參數(shù)的不同,來達成overloading同名異型(Polymorphism)過載Overloa38同名異型(Polymorphism)建構(gòu)元的OverloadingclassPomerextendsDog{ //具有overloading的建構(gòu)元

publicPomer(){ super(“GoodDog”,“Red”,12); } publicPomer(Stringname,Stringcolor,Stringage){ super(name,color,age); } //override父類別Dog中的handshake()方法

publicvoidhandshake(){ System.out.println("你的手洗了嗎?"); }

publicvoidproud() {System.out.println(“哼...");}}同名異型(Polymorphism)建構(gòu)元的Overl39同名異型(Polymorphism)方法的OverloadingclassPomerextendsDog{ //建構(gòu)元 publicPomer(Stringname,Stringcolor,Stringage){ super(name,color,age); }

//具有overloading的rollover()

publicvoidrollover(){for(inti=1;i<=5;i++) System.out.println("我滾"+i+"次"); }

publicvoidrollover(intthetimes){

for(inti=1;i<=thetimes;i++)…同名異型(Polymorphism)方法的Overlo40super關鍵字this&super關鍵字this:指的是目前的classsuper:指的是父類別使用super來呼叫父類別中的方法語法:super.methodName(argList);super.Bark();super.Rollover(5);若子類別中沒有建構(gòu)元(constructor),可單用super來呼叫父類別中的建構(gòu)元語法:super(argList);super關鍵字this&super關鍵字41Java物件祖先:Object類別Java中的所有物件,全部繼承自java.lang.Object只要程式設計師沒有以extends指定繼承之物件,Java會自動用Object作為所有物件的父物件。Java物件祖先:Object類別Java中的所有物件42Java物件祖先:Object類別以下是Object中的方法,可能是您想Overriding的:clone()equals()toString()finalize()以下是Object中,宣告為final的方法,不可以Overriding:getClass()hashCode()notify()notifyAll()wait()Java物件祖先:Object類別以下是Object43Java物件祖先:Object類別clone()原始宣告:

protectedObjectclone()throwsCloneNotSupportedException作用:複製一份物件本身,並傳回去。要求:要讓類別成為可複製類別的最簡單方法:在類別宣告最後加上implementsCloneableObject提供的clone()功能很適合,但有些類別必須要覆蓋clone(),才能提供正確的複製功能Java物件祖先:Object類別clone()44Java物件祖先:Object類別equals()原始宣告:

publicbooleanequals(Objectobj);作用:比較兩個物件的內(nèi)含值是否相等。要求:無hashCode()回傳的int數(shù)值,代表物件在hashtable裡對應位置。傳回物件在“雜湊表”(HashTable)中的索引值。通常配合java.util.Hashtable使用Java物件祖先:Object類別equals()45Java物件祖先:Object類別finalize()原始宣告:

protectedvoidfinalize()throwsThrowable作用:物件離開其有效範圍時,一定會被叫用的函式。用來清除本物件以new霸佔的記憶體。系統(tǒng)會自動呼叫finalize(),因此大部分的類別都不需要覆蓋finalize()所以在Java中,要拋棄一個記憶體,只要:ObjA=null;ObjB=null;Java物件祖先:Object類別finalize()46Java物件祖先:Object類別toString()原始宣告:

publicStringtoString();作用:傳回一個此物件的描述字串toString()對除錯(debug)很有幫助System.out.println(newDouble(Math.PI).toString());Java物件祖先:Object類別toString()S47Java物件祖先:Object類別Example:TimeDemo.javaclassTime{ …

publicStringtoString()

{ return(hour+":"+(minute<10?"0":"")+minute+":"+(second<10?"0":"")+second);}}Java物件祖先:Object類別Example:Ti48Java物件祖先:Object類別getClass()原始宣告:

publicfinalClassgetClass();作用:可取得一個類別的所有資訊。包括類別名稱,父類別名稱,實作介面名稱,所有成員變數(shù)及成員函式,甚至於可以由取回的class資料個體化一個物件。要求:不準覆寫(Overriding)傳回值:傳回java.lang.Class。傳回後,您就可以使用所有java.lang.Class的屬性與方法。Java物件祖先:Object類別getClass()49FinalClassesandMethodsFinalClasses定義一個不準被別人繼承的類別稱為finalclass宣告語法:AccessLevelfinalclassClassName如:finalclassColorPoint使用時機安全性駭客最常用來破壞系統(tǒng)的方式,建立某個類別的subclass,然後將原來類別的主體置換成自己的主體。當一個類別已經(jīng)十分完美時FinalClassesandMethodsFinal50FinalClassesandMethodsFinalClassesfinalclassA

{

//…

}

//Thefollowingclassisillegal.

classBextendsA//錯誤!無法形成A的子類別

{

//…

}FinalClassesandMethodsFinal51FinalClassesandMethodsFinalMethods定義一個不準被subclass覆寫(Overriding)的函式稱為finalmethod宣告語法:final傳回值型態(tài)函式名稱(參數(shù),…);使用時機當覆寫(Overriding)會出現(xiàn)問題時。FinalClassesandMethodsFinal52FinalClassesandMethodsFinalMethodsclassA

{

finalvoidmeth()

{

System.out.println("Thisisafinalmethod.");

}

}

classBextendsA

{

voidmeth()//這裡開始會出現(xiàn)錯誤!不能覆蓋。

{

System.out.println("Illegal!");

}

}FinalClassesandMethodsFinal53實例講解程式:InheritanceDemo.java類別成員(ClassMethod)繼承(Inheritance)OverridingOverloadingsuper實例講解程式:InheritanceDemo.java54InheritanceDemo.javaclassAA{protectedintx;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論