




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出行游玩安全協(xié)議書范本
- 物品托人寄賣協(xié)議書范本
- 會(huì)展場(chǎng)館招標(biāo)方案模板
- 家政雇傭協(xié)議書范本
- 鮮花訂購(gòu)協(xié)議書范本
- 化肥生產(chǎn)廢氣治理方案
- 護(hù)工方案整體設(shè)計(jì)方案
- 改良物流裝卸方案
- 職稱培訓(xùn)激勵(lì)方案
- 擔(dān)保公司獎(jiǎng)金方案(3篇)
- 第八章《運(yùn)動(dòng)和力》達(dá)標(biāo)測(cè)試卷(含答案)2024-2025學(xué)年度人教版物理八年級(jí)下冊(cè)
- 【課件】當(dāng)代圖書館的功能定位與 信息資源建設(shè)的發(fā)展趨勢(shì)
- 2025屆小升初語(yǔ)文總復(fù)習(xí):《文言文閱讀》(附答案解析)
- 2024-2025學(xué)年年八年級(jí)數(shù)學(xué)人教版下冊(cè)專題整合復(fù)習(xí)卷第16章 分式單元測(cè)試卷(一)及答案
- 建筑消防設(shè)施維護(hù)保養(yǎng)技術(shù)規(guī)程
- 大型食堂油煙管道清洗解決方案
- 施工現(xiàn)場(chǎng)實(shí)施信息化監(jiān)控和數(shù)據(jù)處理方案
- 思維導(dǎo)圖畫出好作文宣講公開課獲獎(jiǎng)?wù)n件省賽課一等獎(jiǎng)?wù)n件
- 新辦公樓會(huì)議室音視頻系統(tǒng)施工方案
- 第10課《我們不亂扔》(教學(xué)設(shè)計(jì))-部編版道德與法治二年級(jí)上冊(cè)
- 專題01 三角形【11個(gè)考點(diǎn)知識(shí)梳理、題型解題方法、專題過(guò)關(guān)】(原卷版)
評(píng)論
0/150
提交評(píng)論