呼叫相同類別底下的另一個(gè)建構(gòu)元課件_第1頁(yè)
呼叫相同類別底下的另一個(gè)建構(gòu)元課件_第2頁(yè)
呼叫相同類別底下的另一個(gè)建構(gòu)元課件_第3頁(yè)
呼叫相同類別底下的另一個(gè)建構(gòu)元課件_第4頁(yè)
呼叫相同類別底下的另一個(gè)建構(gòu)元課件_第5頁(yè)
已閱讀5頁(yè),還剩111頁(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)介

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

//預(yù)設(shè)的建構(gòu)元

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

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

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

myBox1.showVolume(); //獲得第二個(gè)盒子的體積 myBox2.showVolume(); }}this關(guān)鍵字Example:BoxDemo.javac6YourTurn建立一個(gè)Rectangle類別此類別必須完成下列要求建構(gòu)元初始化預(yù)設(shè)長(zhǎng)、寬各為8、4可自行設(shè)定矩形之長(zhǎng)與寬可以複製相同物件的建構(gòu)元(傳進(jìn)去的參數(shù)為要copy的物件)顯示目前的長(zhǎng)、寬之值取得目前矩形之面積畫矩形,由*構(gòu)成邊長(zhǎng)sdfsadsadsa在RectangleDemo類別下,寫個(gè)main()來(lái)測(cè)試所有功能YourTurn建立一個(gè)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)控制存取的關(guān)鍵字public、protected、private置於類別或成員宣告之前若沒(méi)有指定任何存取權(quán)限,表示此類別或成員僅供相同類別庫(kù)的其他類別使用,稱為packageaccess

層級(jí)將類別或成員設(shè)定為packageaccess層級(jí)的好處是可使同在一個(gè)類別庫(kù)下的每個(gè)類別互相使用成員存取控制(AccessControl)控制存取的關(guān)鍵字9存取控制(AccessControl)public任何類別皆可存取defaultpacketageaccessprotected允許宣告的類別、子類別與同一個(gè)套件中的類別使用private只有在類別內(nèi)部可以存取對(duì)於成員變數(shù),通常設(shè)定為private權(quán)限,再透過(guò)methods,如get/set來(lái)存取資料存取控制(AccessControl)public10存取控制(AccessControl)ClassAccess類別不可設(shè)定為private或protected若為了避免他人任意使用constructors建立物件可將constructors設(shè)定為private另外提供static的methods建立物件、複製物件main()必須由程式外部的程式碼來(lái)呼叫(Java執(zhí)行時(shí)期系統(tǒng)),所以main()必須為public設(shè)計(jì)存取秘訣:設(shè)定適合但最嚴(yán)苛的存取等級(jí)。因此,盡量使用private。如此在修改成員變數(shù)內(nèi)容時(shí),只能透過(guò)method。除非,在評(píng)估設(shè)為public後會(huì)對(duì)於程式效能有顯著提升的情況。存取控制(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();//tectedMethod();//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關(guān)鍵字實(shí)體成員與類別成員變數(shù)或methods若宣告為static,則此變數(shù)或methods即為類別變數(shù)(classvariables)或類別方法(classmethods)宣告為static的變數(shù)或methods不屬於任何此類別的物件,屬於此類別所有物件共同擁有宣告staticDataTypeVarName;staticReturnType

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

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

privateinthour;

privateintminute;

privateintsecond;

publicTime(){…}

publicvoidsetTime(inthh,intmm,intss){…}

publicStringtoString(){…}

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

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

或protected

的成員。如果Subclass與Superclass在同一個(gè)package中,會(huì)繼承未做任何存取控制宣告的成員。不可繼承成員如果Subclass與Superclass在不同package,所有未宣告有效範(fàn)圍的成員全部不繼承。(因?yàn)轭A(yù)設(shè)式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若繼承下來(lái)後,不滿意祖先定義的方法,子孫可以在繼承以後重新改寫,稱為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)過(guò)載Overloading同一份函式,準(zhǔn)備多種定義,以供各種場(chǎng)合呼叫,稱為Overloading。建構(gòu)元也可以利用參數(shù)的不同,來(lái)達(dá)成overloading同名異型(Polymorphism)過(guò)載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關(guān)鍵字this&super關(guān)鍵字this:指的是目前的classsuper:指的是父類別使用super來(lái)呼叫父類別中的方法語(yǔ)法:super.methodName(argList);super.Bark();super.Rollover(5);若子類別中沒(méi)有建構(gòu)元(constructor),可單用super來(lái)呼叫父類別中的建構(gòu)元語(yǔ)法:super(argList);super關(guān)鍵字this&super關(guān)鍵字41Java物件祖先:Object類別Java中的所有物件,全部繼承自java.lang.Object只要程式設(shè)計(jì)師沒(méi)有以extends指定繼承之物件,Java會(huì)自動(dòng)用Object作為所有物件的父物件。Java物件祖先:Object類別Java中的所有物件42Java物件祖先:Object類別以下是Object中的方法,可能是您想Overriding的:clone()equals()toString()finalize()以下是Object中,宣告為final的方法,不可以O(shè)verriding:getClass()hashCode()notify()notifyAll()wait()Java物件祖先:Object類別以下是Object43Java物件祖先:Object類別clone()原始宣告:

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

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

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

publicStringtoString();作用:傳回一個(gè)此物件的描述字串toString()對(duì)除錯(cuò)(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();作用:可取得一個(gè)類別的所有資訊。包括類別名稱,父類別名稱,實(shí)作介面名稱,所有成員變數(shù)及成員函式,甚至於可以由取回的class資料個(gè)體化一個(gè)物件。要求:不準(zhǔn)覆寫(Overriding)傳回值:傳回java.lang.Class。傳回後,您就可以使用所有java.lang.Class的屬性與方法。Java物件祖先:Object類別getClass()49FinalClassesandMethodsFinalClasses定義一個(gè)不準(zhǔn)被別人繼承的類別稱為finalclass宣告語(yǔ)法:AccessLevelfinalclassClassName如:finalclassColorPoint使用時(shí)機(jī)安全性駭客最常用來(lái)破壞系統(tǒng)的方式,建立某個(gè)類別的subclass,然後將原來(lái)類別的主體置換成自己的主體。當(dāng)一個(gè)類別已經(jīng)十分完美時(shí)FinalClassesandMethodsFinal50FinalClassesandMethodsFinalClassesfinalclassA

{

//…

}

//Thefollowingclassisillegal.

classBextendsA//錯(cuò)誤!無(wú)法形成A的子類別

{

//…

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

{

finalvoidmeth()

{

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

}

}

classBextendsA

{

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

{

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

}

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

AA(Strings){System.out.println("AAiscreated.");System.out.println("yourmsg:"+s);}

publicvoidsampleA(){System.out.println("ThisissampleAA.");}

//ClassMethodstaticvoidprintMsg(AAobj){System.out.println(obj.x);}}InheritanceDemo.javaclassAA{55InheritanceDemo.javaclassBBextendsAA{BB(){super("HiHi~~");//使用父類別AA的建構(gòu)元

System.out.println("BBiscreated.");}//overridingpublicvoidsampleA(){super.sampleA();//使用父類別AA的sampleA()方法

System.out.println("ThisissampleBB.");}//overloadingpublicvoidsampleA(Strings){System.out.println(s);}//ClassMethodstaticvoidprintMsg(BBobj){System.out.println(obj.x);}}InheritanceDemo.javaclassBBe56InheritanceDemo.javapublicclassInheritanceDemo{publicstaticvoidmain(String[]args){AAaObj=newAA("Hi..");aObj.x=100;System.out.println(aObj.x);aObj.sampleA();AA.printMsg(aObj);

System.out.print("===============\n");BBbObj=newBB();bObj.x=200;System.out.println(bObj.x);bObj.sampleA();bObj.sampleA("Hello!!");AA.printMsg(bObj); BB.printMsg(bObj);}}InheritanceDemo.javapubliccla57YourTurn試用Dog類別產(chǎn)生一個(gè)如GoldenRetriever(黃金獵犬)類別具有兩個(gè)建構(gòu)元(Overloading)GoldRetriever()預(yù)設(shè):如流浪狗、金色、5歲GoldRetriever(StringtheName,StringtheColor,inttheAge)多一個(gè)方法Smile(),如印出“^_^”O(jiān)verride原本Dog類別中的Bark()方法,如印出“嘻嘻~”O(jiān)verrideObject中的toString(),如印出“我是一隻可愛(ài)的黃金獵犬!”YourTurn試用Dog類別產(chǎn)生一個(gè)如Golden58ManagingInheritanceLecturer:曾學(xué)文ManagingInheritanceLecturer:曾59Outlinethis存取控制(AccessControl)static關(guān)鍵字實(shí)體成員與類別成員static初值設(shè)定區(qū)塊YourTurn物件導(dǎo)向語(yǔ)言三大特性封裝(Encapsulation)繼承(Inheritance)同名異型(Polymorphism)OverridingOverloadingsuper關(guān)鍵字Java物件祖先:Object類別FinalClassesandMethodsYourTurnOutlinethis60this關(guān)鍵字this關(guān)鍵字:用來(lái)存取目前的物件通常在instancemethod或建構(gòu)元(constructor)內(nèi)使用this,可以呼叫目前物件的任何成員。原因:成員變數(shù)被method或是建構(gòu)元內(nèi)的同名參數(shù)給『遮蔽』了常使用在constructor裡,當(dāng)參數(shù)與成員變數(shù)名稱相同時(shí)在method裡使用this的目的,是為了要避免成員變數(shù)與參數(shù)之間的混用(ambiguity),尤其當(dāng)參數(shù)名稱與成員變數(shù)名稱相同時(shí)this也可用來(lái)呼叫此物件的methodsthis也可以用來(lái)呼叫此物件的constructorthis關(guān)鍵字this關(guān)鍵字:用來(lái)存取目前的物件61this關(guān)鍵字可以透過(guò)this,呼叫相同類別底下的另一個(gè)建構(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關(guān)鍵字可以透過(guò)this,呼叫相同類別底下的另一個(gè)62this關(guān)鍵字具有二個(gè)建構(gòu)元的Box類別classBox{ doublewidth,height,depth;

//預(yù)設(shè)的建構(gòu)元

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

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

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

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

Rectangle(){…}

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

voidshowLW(){…}

doublegetArea(){…}

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

層級(jí)將類別或成員設(shè)定為packageaccess層級(jí)的好處是可使同在一個(gè)類別庫(kù)下的每個(gè)類別互相使用成員存取控制(AccessControl)控制存取的關(guān)鍵字67存取控制(AccessControl)public任何類別皆可存取defaultpacketageaccessprotected允許宣告的類別、子類別與同一個(gè)套件中的類別使用private只有在類別內(nèi)部可以存取對(duì)於成員變數(shù),通常設(shè)定為private權(quán)限,再透過(guò)methods,如get/set來(lái)存取資料存取控制(AccessControl)public68存取控制(AccessControl)ClassAccess類別不可設(shè)定為private或protected若為了避免他人任意使用constructors建立物件可將constructors設(shè)定為private另外提供static的methods建立物件、複製物件main()必須由程式外部的程式碼來(lái)呼叫(Java執(zhí)行時(shí)期系統(tǒng)),所以main()必須為public設(shè)計(jì)存取秘訣:設(shè)定適合但最嚴(yán)苛的存取等級(jí)。因此,盡量使用private。如此在修改成員變數(shù)內(nèi)容時(shí),只能透過(guò)method。除非,在評(píng)估設(shè)為public後會(huì)對(duì)於程式效能有顯著提升的情況。存取控制(AccessControl)ClassAcce69存取控制(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:A70存取控制(AccessControl)Example:DeltaOne.javapackageOne;publicclassDeltaOne{publicstaticvoidmain(String[]args){Alphaa=newAlpha();//a.privateMethod();//illegala.packageMethod();//tectedMethod();//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:D71存取控制(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:D72static關(guān)鍵字實(shí)體成員與類別成員變數(shù)或methods若宣告為static,則此變數(shù)或methods即為類別變數(shù)(classvariables)或類別方法(classmethods)宣告為static的變數(shù)或methods不屬於任何此類別的物件,屬於此類別所有物件共同擁有宣告staticDataTypeVarName;staticReturnType

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

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

溫馨提示

  • 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)論