版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
java面向?qū)ο筇匦?java的OOP概念類:抽象的集合系統(tǒng)類庫(kù)中已定義的標(biāo)準(zhǔn)類用戶自定義的類對(duì)象(實(shí)例,instance):類的實(shí)際個(gè)體創(chuàng)立某個(gè)類的具體對(duì)象,類似變量聲明類名欲創(chuàng)立的對(duì)象名=new類名(初始化參數(shù)表);例如: Strings=newString(“Hello!〞);Dated=newDate(2021,07,30);3java中的OOP〔續(xù)〕java中類的組織結(jié)構(gòu)基類:所有java類都派生自O(shè)bject類java的類組織在包〔package〕中java提供的標(biāo)準(zhǔn)類庫(kù)分布在一系列的包中,如java.lang,java.util,等編程的過(guò)程,就是繼承基類或標(biāo)準(zhǔn)類而創(chuàng)立、定義特殊子類的過(guò)程4java中類的結(jié)構(gòu)[類修飾符]
class
類名[
extends
父類名][implements
接口名]{成員變量的定義;//用于描述對(duì)象的狀態(tài)構(gòu)造方法的定義;//用于構(gòu)造和初始化新對(duì)象成員方法的定義;//用于實(shí)現(xiàn)對(duì)象的行為}類聲明局部類體局部5類的結(jié)構(gòu):例classEmployee{//類聲明 Stringname; Stringdesignation; Stringdepartment;//3個(gè)成員變量,用于描述Employee對(duì)象的狀態(tài)
publicEmployee(StringeName,StringeDesign,StringeDept){ name=eName; designation=eDesign; department=eDept;//構(gòu)造方法,用于初始化Employee對(duì)象 }
voidshowInfo(){//成員方法,用于實(shí)現(xiàn)Employee對(duì)象的特定行為System.out.println(name+"isa"+designation+"at"+department+".");}}把“雇員〞的共同狀態(tài)〔成員變量〕和行為〔方法〕抽象出來(lái),封裝為Employee類。6類的結(jié)構(gòu):例〔續(xù)〕publicclassClassAndObject{//可執(zhí)行程序的主類publicstaticvoidmain(Stringargs[]){//main方法,程序執(zhí)行的入口〕 Employeee1=newEmployee(“Robert〞,“Manager〞,“Coffeeshop〞);//創(chuàng)立新對(duì)象并初始化Employeee2=newEmployee("Tom","Worker","Coffeeshop");//創(chuàng)立新對(duì)象并初始化e1.showInfo();e2.showInfo();}}RobertisaManageratCoffeeshop.TomisaWorkeratCoffeeshop.程序運(yùn)行結(jié)果:定義主類并在其中創(chuàng)立和使用Employee類的對(duì)象。7類的聲明類修飾符〔Modifier〕:public:允許所有類訪問(wèn)本類,否那么〔缺省時(shí)〕表示該類只能被本包中的其他類訪問(wèn)。1個(gè)源文件最多只能包含1個(gè)public類〔如果有,那么該類一定是主類〕;例abstract:抽象類,不能創(chuàng)立實(shí)例的類(如:Shape類),只能創(chuàng)立其子類的實(shí)例。目的:使類的結(jié)構(gòu)清晰,實(shí)現(xiàn)多態(tài);final:不能再派生子類的類;用于創(chuàng)立固定功能的類,易于平安性的實(shí)現(xiàn);缺?。嚎杀划?dāng)前包中的其他類訪問(wèn)繼承:extends父類名實(shí)現(xiàn)接口(interface):implements接口名8類的聲明:例public
abstractclassShape{……}classTriangleextendsShape{……}
finalclassAcuteTriangleextendsTriangle{……}?final可以與abstract一起使用嗎?9成員變量:聲明聲明成員變量的語(yǔ)法[修飾符]數(shù)據(jù)類型變量名;例:privateintday,month,year;修飾符:成員變量的訪問(wèn)權(quán)限public:可被所有類訪問(wèn)protected:該類自身、子類、同一包中的其他類缺?。嚎杀槐景械念愒L問(wèn)private:僅可被該類自身訪問(wèn)和修改,不能被其他任何類〔包括子類〕訪問(wèn)10類的封裝與數(shù)據(jù)隱藏通常,用private將成員變量隱藏起來(lái),只允許本類自身的方法對(duì)其進(jìn)行操作。通過(guò)對(duì)方法設(shè)置public/protected/default等權(quán)限,將類的方法作為對(duì)外接口裸露出來(lái),使外界只能通過(guò)這些方法來(lái)訪問(wèn)被隱藏的數(shù)據(jù)。例4-2。11成員變量:聲明〔續(xù)〕static:類變量(靜態(tài)變量),為所有的實(shí)例所共享,引用時(shí),類名或?qū)ο竺?類變量final:程序中不能修改其值,即常量,定義的同時(shí)應(yīng)對(duì)其進(jìn)行初始化transient:非永久變量volatile:并發(fā)控制訪問(wèn):對(duì)象名.實(shí)例變量;類名或?qū)ο竺?類變量12成員變量的聲明:例
classCircle{
privatefloatradius;
protectedfloatarea;
staticfloat max_radius=100.0f;
finalfloatPI=3.14f; ……}13成員方法:語(yǔ)法結(jié)構(gòu)方法的作用:定義對(duì)成員變量(數(shù)據(jù))的某種操作14成員方法的結(jié)構(gòu)語(yǔ)法:[修飾符]返回類型方法名〔參數(shù)列表〕[throws異常類名]{方法體;}方法的聲明:方法的訪問(wèn)權(quán)限,返回什么類型的數(shù)據(jù),接受哪些參數(shù)方法聲明方法體15成員方法的聲明修飾符(Modifier〕:訪問(wèn)控制符: public、private、protected、缺省-可被本包中的類訪問(wèn)static:類方法,又稱靜態(tài)方法使用類名或?qū)ο竺鳛榍熬Y來(lái)訪問(wèn),建議使用類名作前綴static方法只能訪問(wèn)static變量和其自定義的局部變量?jī)?yōu)點(diǎn):不必對(duì)類實(shí)例化操作就能使用其該方法,方便快捷??砷_(kāi)發(fā)通用工具,如數(shù)學(xué)計(jì)算:Math.sqrt()abstract:只有方法名,沒(méi)有方法體,要在子類中通過(guò)重寫(xiě)〔override〕來(lái)實(shí)現(xiàn)final:不能被子類所重寫(xiě)〔override〕〔如triangle類的求重心方法〕native:其他語(yǔ)言實(shí)現(xiàn)synchronized:并發(fā)線程控制16成員方法的聲明〔續(xù)〕返回類型:根本數(shù)據(jù),類,void〔無(wú)返回值〕,注意return參數(shù)列表:參數(shù)類型可為類類型throws異常類名:本方法中會(huì)產(chǎn)生的異常類型,提醒調(diào)用者要對(duì)相應(yīng)的可能異常進(jìn)行處理。當(dāng)運(yùn)行時(shí)發(fā)生異常時(shí),程序會(huì)自動(dòng)轉(zhuǎn)入異常處理程序〔通常由程序員事先編制〕去執(zhí)行。17方法體在方法體中定義的變量稱為局部變量。生命周期:程序流進(jìn)入方法體時(shí)創(chuàng)立,程序流退出方法時(shí)撤消。局部變量使用之前必須初始化。例:錯(cuò)在哪里?局部變量名假設(shè)與類的成員變量名相同,那么后者被隱藏〔成員變量需通過(guò)this來(lái)訪問(wèn),例4-3〕。在方法體中可以訪問(wèn)本類所有的類變量,可以調(diào)用本類中定義的其它方法(其中,static方法只能直接調(diào)用本類的static方法和static變量)。18this為對(duì)當(dāng)前對(duì)象的引用〔即表示當(dāng)前對(duì)象〕。publicclassMyDate{privateintday,month,year;publicMyDate(intday,intmonth,intyear){ this.day=day;//如果不加this會(huì)有什么結(jié)果? this.month=month; this.year=year;}publicStringtomorrow(){ this.day=this.day+1;//如果不加this會(huì)有什么結(jié)果? returnthis.day+"/"+this.month+"/"+this.year; }publicstaticvoidmain(String[]args){ MyDated=newMyDate(12,4,2004); System.out.println(d.tommorrow());}}“this〞關(guān)鍵字類變量day被屏蔽沒(méi)有影響19成員方法的定義〔例〕
classCircle{ privateintradius;
staticfloatmax_area=100.0f; publicvoid
set_radius(intmy_radius){ radius=my_radius;}//無(wú)返回值 publicintget_radius(){
returnradius;}//返回值為int型 public
staticvoidsetMA(floatk){ max_area=k;}//注意:在static方法中,只能訪問(wèn)static變量和自定義的局部變量20方法的參數(shù)方法的參數(shù)要“有名有型〞,參數(shù)的作用域在本方法中,在方法體中可以跟方法內(nèi)的局部變量一樣使用。方法調(diào)用中,參數(shù)是值傳遞。方法是傳值的,方法調(diào)用不會(huì)改變實(shí)參的值。
21引用類型值傳送根本類型值傳送地址傳送值傳送與地址傳送3.143.14AB3.14AB0x2F0x2FAB方法定義:如voiddeposit(doublemoney){…
…}形參
方法調(diào)用:如myAccount.deposit(1000)實(shí)參例4-4222324各變量的作用域成員變量的作用空間局部變量的作用空間方法參數(shù)的作用空間異常處理參數(shù)的作用空間25例:銀行業(yè)務(wù)的面向?qū)ο笤O(shè)計(jì)要求:帳戶存/取款、查詢帳戶和開(kāi)戶日期等面向?qū)ο蟮姆治觥睴OA〕對(duì)象模型抽象:銀行帳戶對(duì)象模型分析:余額、開(kāi)戶日期、存、取、查面向?qū)ο蟮脑O(shè)計(jì)〔OOD〕對(duì)象模型的實(shí)現(xiàn):類及其成員定義BankAccount類balance,interest_rate等成員getBalance(),deposit()等方法26例:銀行業(yè)務(wù)銀行帳戶類BankAccount數(shù)據(jù):余額、利率、開(kāi)戶日期操作:查詢余額、存款、取款 查詢利率、設(shè)置利率主類UseAccountmain()方法:創(chuàng)建BankAccount對(duì)象,并對(duì)其進(jìn)行相應(yīng)操作UseAccount.java27classBankAccount{//銀行賬戶類privatefloatbalance;//默認(rèn)初值為0privatefloatinterest_rate;privateintday,month,year;
publicfloatget_balance(){returnbalance;}//查詢余額publicvoiddeposit(floatmoney){balance+=money;}//存錢(qián)}publicclassUseAccount{//主類,其main()作為可執(zhí)行程序的入口publicstaticvoidmain(Stringargs[]){BankAccounthailiang_Account=newBankAccount();//創(chuàng)立BankAccount對(duì)象hailiang_Account.deposit(1000.0f);System.out.println(“本賬戶余額為:$"+hailiang_Account.get_balance());}}例:銀行業(yè)務(wù)本賬戶余額為:$1000.0程序運(yùn)行結(jié)果:28classBankAccount{//銀行賬戶類
privatefloatbalance;privatefloatinterest_rate;privateDate
start_date=newDate();//Date類的成員變量start_datepublicfloatget_balance(){returnbalance;}publicfloatget_interest_rate(){returninterest_rate;}publicDate
get_start_date(){returnstart_date;}//注意返回值類型publicvoidset_start_date(intd,intm,inty){…}}classDate{//日期類
privateintday=25,month=10,year=2002;publicStringshowDate(){returnyear+"-"+month+"-"+day;}}publicclassUseAccount{//主類
publicstaticvoidmain(Stringargs[]){BankAccounthailiang_Account=newBankAccount();System.out.println("本賬戶開(kāi)戶日期為:"+hailiang_Account.get_start_date().showDate());}}本賬戶開(kāi)戶日期為:2002-10-25程序運(yùn)行結(jié)果:29類的定義〔封裝〕小結(jié)類中的數(shù)據(jù)常設(shè)置為private,而多使用public方法來(lái)操作數(shù)據(jù),并作為對(duì)外的訪問(wèn)接口。不要定義太龐大的類,要把無(wú)關(guān)的功能適當(dāng)別離,分解為邏輯清晰的多個(gè)類,把邏輯上相關(guān)聯(lián)的數(shù)據(jù)封裝成新的類來(lái)使用。如:可定義A類的對(duì)象作為B類的成員變量,如上例中的Date類對(duì)象作為BankAccount類的成員。培養(yǎng)良好的編程風(fēng)格〔標(biāo)識(shí)符命名,縮進(jìn)〕,提高可讀性,可維護(hù)性。30類的定義-實(shí)驗(yàn)實(shí)驗(yàn)3:編寫(xiě)一個(gè)復(fù)數(shù)類,具有實(shí)部、虛部2個(gè)成員變量,可以完成加、減、乘、除、讀取實(shí)部和虛部等功能。另編寫(xiě)一個(gè)主類,在主類中創(chuàng)立2個(gè)復(fù)數(shù)對(duì)象,并對(duì)它們進(jìn)行加、減、乘、除運(yùn)算。(第7周上機(jī)實(shí)驗(yàn))31復(fù)數(shù)的四那么運(yùn)算法那么在數(shù)學(xué)里,將平方是負(fù)數(shù)的數(shù)定義為純虛數(shù)。所有的虛數(shù)都是復(fù)數(shù)。這種數(shù)有一個(gè)專門(mén)的符號(hào)“i〞(imaginary),它稱為虛數(shù)單位。定義為i^2=-1復(fù)數(shù)的四那么運(yùn)算規(guī)定為:
〔a+bi〕+〔c+di〕=〔a+c〕+〔b+d〕i,
〔a+bi〕-〔c+di〕=〔a-c〕+〔b-d〕i,
〔a+bi〕?〔c+di〕=〔ac-bd〕+〔bc+ad〕i,
〔c與d不同時(shí)為零〕
〔a+bi〕÷〔c+di〕=〔ac+bd/c^2+d^2〕+〔bc-ad/c^2+d^2〕
〔c+di〕不等于0
復(fù)數(shù)有多種表示形式,常用形式z=a+bi叫做代數(shù)式。
32類、文件和可執(zhí)行程序每個(gè)語(yǔ)法正確的源文件(.java)都可編譯為.class文件?
對(duì)!每個(gè).class文件都可執(zhí)行?
錯(cuò)!除非其主類有main()方法每個(gè).java文件都有一個(gè)主類,并且它是public的?
前半句對(duì),后半句錯(cuò)。不可執(zhí)行的.class文件有用嗎?怎么用?ObjectAndClass.javaObjectAndClass.classEmployee.javaEmployee.class編譯編譯訪問(wèn)例:ObjectAndClass類〔可執(zhí)行類〕Employee類〔非可執(zhí)行類〕,判斷以下命題是否正確:33方法重載〔overloading〕用同一個(gè)名字來(lái)表示假設(shè)干個(gè)不同方法。這些方法同名的原因,是因?yàn)樗鼈冏罱K的功能和目的都相同,但由于在完成同一功能時(shí),可能遇到不同的具體情況,所以需要定義含不同內(nèi)容的方法。是多態(tài)的一種表達(dá)?!捕鄳B(tài)包括方法的重載和重寫(xiě)〕34方法重載的類型如何區(qū)分重載不同類中的同名方法:冠以對(duì)象名(或類名)以示區(qū)別如:Chinese.speak();American.speak()同類中的同名方法:用不同的參數(shù)列表來(lái)加以區(qū)別35同類中的方法重載:例要打印不同類型的數(shù)據(jù),如int,float,String等,實(shí)現(xiàn)手段有2種:分別定義不同名的多個(gè)方法,如:printInt(int);printFloat(float);printString(String)等但這樣給程序開(kāi)發(fā)、使用和維護(hù)都帶來(lái)很多麻煩。使用同一個(gè)方法名print(),通過(guò)區(qū)別不同的參數(shù),來(lái)分別定義和調(diào)用不同方法,即“方法重載〞: 如:print(inti); print(floatf); print(Strings);36方法重載的條件方法名必須相同方法的參數(shù)必須不同〔形參的個(gè)數(shù)、類型、順序的不同〕。staticvoidprint(Strings,inti){…}staticvoidprint(inti,Strings){…}//以上二者的參數(shù)順序不同,也構(gòu)成重載37方法重載的特點(diǎn)返回類型、修飾符可相同或不相同。〔即,返回類型和修飾符都不是重載的標(biāo)志?!承Ч豪谩爸孛暚F(xiàn)象提高程序的抽象度和簡(jiǎn)潔性。編譯時(shí)多態(tài)?!灿删幾g器在編譯時(shí)根據(jù)參數(shù)的區(qū)別,來(lái)綁定對(duì)應(yīng)的方法體〕38構(gòu)造方法〔constructor)為什么要有構(gòu)造方法在每個(gè)對(duì)象一誕生時(shí),就應(yīng)給它指定一個(gè)初始狀態(tài)〔即成員變量的初值〕。雖然系統(tǒng)會(huì)賦給默認(rèn)初值,但往往并不適宜;所以在創(chuàng)立一個(gè)新對(duì)象時(shí),需用構(gòu)造方法完成合法的初始化,使成員變量的初始化工作不依賴于系統(tǒng)自動(dòng)完成。構(gòu)造方法是一種特殊的成員方法,構(gòu)造方法與類同名。在創(chuàng)立每個(gè)新對(duì)象時(shí)被調(diào)用執(zhí)行,以保證新對(duì)象的各成員都有合法、確定的初值。39構(gòu)造方法〔例〕classDog{ privateintweight; publicDog(){//Dog類的構(gòu)造方法 weight=42;//實(shí)現(xiàn)對(duì)象狀態(tài)〔成員變量〕初始化。所有對(duì)象初值均為42 } publicDog(inti){//Dog類的構(gòu)造方法,重載 weight=i;//由用戶指定對(duì)象初值 }publicintgetWeight(){returnweight;} publicvoidsetWeight(intmyWeight){weight=myWeight;}}publicclassUseDog{ publicstaticvoidmain(String[]args){ Dogd=newDog();//用構(gòu)造方法創(chuàng)立新對(duì)象,并賦給引用變量d System.out.println("Thedog'sweightis"+d.getWeight()); }}Thedog'sweightis42運(yùn)算結(jié)果:40構(gòu)造方法的特點(diǎn)構(gòu)造方法與成員方法不同,不能被直接調(diào)用,必須通過(guò)new調(diào)用;創(chuàng)立對(duì)象時(shí),利用運(yùn)算符new在內(nèi)存中開(kāi)辟專用空間,存放指定的實(shí)例〔對(duì)象〕,這時(shí)會(huì)執(zhí)行類的構(gòu)造方法,初始化新對(duì)象的成員變量.【對(duì)象是通過(guò)構(gòu)造方法創(chuàng)立的,是動(dòng)態(tài)的】例:Dated=newDate(22,5,2003);41構(gòu)造方法的特點(diǎn)〔續(xù)〕訪問(wèn)權(quán)限:public〔即,所有類都可以創(chuàng)立該類的實(shí)例〕,private,protected,缺省。構(gòu)造方法無(wú)返回類型,但聲明時(shí)也不加void。構(gòu)造方法可以完成更多的操作,而不僅僅局限于變量的初始化.〔如,可在構(gòu)造方法中調(diào)用其他方法等?!骋粋€(gè)類可創(chuàng)立多個(gè)構(gòu)造方法:構(gòu)造方法的重載。42構(gòu)造方法的缺省每個(gè)類至少有一個(gè)構(gòu)造方法。當(dāng)程序中未定義任何構(gòu)造方法時(shí),系統(tǒng)在編譯時(shí),會(huì)提供一個(gè)缺省構(gòu)造方法:無(wú)參數(shù),方法體中無(wú)內(nèi)容缺省構(gòu)造方法的初始化數(shù)據(jù)初值:數(shù)值型:0;布爾型:false;
引用型:null;字符串型:null;一旦程序員定義了構(gòu)造方法,就不再有缺省構(gòu)造方法43構(gòu)造方法的缺?。豪齝lassDog{//類中未定義構(gòu)造方法 privateintweight; publicintgetWeight(){returnweight;} publicvoidsetWeight(intmyWeight){weight=myWeight;} }publicclassUseDog{ publicstaticvoidmain(String[]args){ Dogd=newDog();//用缺省的構(gòu)造方法創(chuàng)立對(duì)象//Dogd=newDog(40);是否可行? System.out.println("Thedog'sweightis"+d.getWeight()); }}Thedog'sweightis0運(yùn)算結(jié)果:44以“this〞調(diào)用構(gòu)造方法this(參數(shù)列表)表示調(diào)用本類的構(gòu)造方法在一個(gè)構(gòu)造方法中,當(dāng)使用this(參數(shù)列表)時(shí),將調(diào)用參數(shù)匹配的另一個(gè)構(gòu)造方法。例4-8使用this調(diào)用本類的其他構(gòu)造方法時(shí),this應(yīng)是第一個(gè)可執(zhí)行語(yǔ)句45以“this〞調(diào)用構(gòu)造方法Name:UnknownSalary:046java中對(duì)象的生命周期對(duì)象是某一個(gè)類的實(shí)例,是運(yùn)行時(shí)動(dòng)態(tài)生成的。生命周期:對(duì)象的創(chuàng)立、使用、回收47java中對(duì)象的創(chuàng)立對(duì)象的聲明
Pointp1,p2;對(duì)象的實(shí)例化
p1=newPoint();p2=newPoint();
new返回對(duì)象的引用
Pointp3=p2;對(duì)象的聲明和實(shí)例化可寫(xiě)在同一條命令中
Pointp4=newPoint();p10xabcdxy0.00.00xabcd48對(duì)象初始化三步曲為對(duì)象分配內(nèi)存空間,首先將其成員變量默認(rèn)初始化:0〔數(shù)值型,字符型〕false(邏輯型〕null(引用型〕對(duì)象建立后,有明確的狀態(tài),屬性都有值。執(zhí)行顯式初始化〔執(zhí)行類成員的賦值表達(dá)式〕publicclassPoint{intx=2;inty=2;//顯式初始化publicPoint(inta,intb){//構(gòu)造方法 x=a;y=b;};}執(zhí)行構(gòu)造方法,完成對(duì)象初始化p1xy22p1xy00p1xy2145p1=newPoint(21,45)49對(duì)象的使用訪問(wèn)對(duì)象的成員變量date1.day調(diào)用對(duì)象的方法date1.setDate()注意對(duì)象中成員變量和方法的訪問(wèn)權(quán)限。50對(duì)象的回收垃圾回收機(jī)制〔garbagecollection〕:java運(yùn)行環(huán)境當(dāng)確定某個(gè)對(duì)象不再被使用時(shí),將其刪除。一個(gè)對(duì)象在沒(méi)有引用指向它時(shí),可作為垃圾被回收。垃圾收集器:java運(yùn)行環(huán)境中的垃圾收集器周期性地釋放不用對(duì)象所占用的空間,自動(dòng)實(shí)現(xiàn)內(nèi)存回收。51C++:A*a=newA(); A*b=a; A*c=a;java:Aa=newA(); Ab=a; Ac=a;abc
bc(指針懸空)abc
bca使用完,顯式刪除其對(duì)象:
deletea;a使用完,顯式刪除其引用:
a=null;對(duì)象的去除只有所有引用都刪除后,才能回收此對(duì)象。
52子類表示類之間一種“屬于〞(isa)關(guān)系。例:publicclassEmployee{ Stringname; DatehireDate; DatedateofBirth; StringjobTitle; intgrade; … }publicclassManager{ Stringname; DatehireDate; DatedateofBirth; StringjobTitle; intgrade; String
department;
… }類的繼承:子類53java中用extends
關(guān)鍵字聲明繼承關(guān)系。publicclassEmployee{ Stringname; DatehireDate; DatedateofBirth; StringjobTitle; intgrade; … }子類是從已有的類創(chuàng)立新類的一種方法。publicclassManager
extendsEmployee{Stringdepartment;}類的繼承:Extends關(guān)鍵字54類的繼承創(chuàng)立類時(shí)指明它為某類的子類extends父類〔超類〕名父類來(lái)自系統(tǒng)類庫(kù)用戶自定義的類子類繼承除private外的所有父類成員〔帶private修飾符的屬性、方法是不能被繼承的〕java是單繼承的,不支持多重繼承。即,extends后的類名只能有一個(gè)。55類的繼承:擴(kuò)展子類對(duì)父類可做擴(kuò)展和特殊化。子類繼承父類的屬性、功能〔方法〕,子類中只需聲明特有的成員即可。創(chuàng)立新的成員:變量和方法,如Stringdepartment;重新定義父類中已有的變量:父類變量被隱藏重新定義父類中已有的方法:重寫(xiě)or覆蓋(overriding)
56子類可以改變從父類繼承的方法——重寫(xiě);被重寫(xiě)方法的方法名、返回值、參數(shù)列表要與父類方法完全一樣;重寫(xiě)方法的訪問(wèn)權(quán)限不能縮小;不能拋出新的異常。例:4-11類的繼承:方法重寫(xiě)〔Overriding)57上溯造型子類實(shí)例可當(dāng)成父類實(shí)例來(lái)使用,系統(tǒng)默許。即,父類變量可以指向子類實(shí)例,稱上溯造型〔upcast〕。例:Father父類 Son子類fatherMethod() fatherMethod(){//重寫(xiě)},sonMethod()Fatherf1=newFather();Sons=newSon();Fatherf2=newSon();s.fatherMethod();f2.fatherMethod();//對(duì)!父類變量可以指向子類實(shí)例,上溯造型//對(duì)!子類變量訪問(wèn)父類中聲明的方法(繼承或重寫(xiě))//對(duì)!這時(shí)訪問(wèn)的是父類方法,還是子類〔重寫(xiě)〕的方法?f1.sonMethod();//錯(cuò)!父類實(shí)例中沒(méi)有子類方法f2.sonMethod();
//錯(cuò)!將父類變量當(dāng)成子類變量來(lái)使用,還必須滿足一定的條件。取決于實(shí)例類型58由于上溯造型的存在,允許父類變量指向子類實(shí)例。父類變量既可以指向父類實(shí)例,也可以指向子類實(shí)例。Employeee=newManager();但是,通過(guò)該父類變量(如e)只能訪問(wèn)父類中聲明的成員變量和成員方法〔至于是父類的方法還是子類重寫(xiě)的方法,那么要看e當(dāng)時(shí)的實(shí)例類型〕,而子類所擴(kuò)展的方法被隱藏,不能被父類變量e訪問(wèn)。思考:假設(shè)想訪問(wèn),那么應(yīng)該如何操作?運(yùn)行時(shí),根據(jù)e所引用對(duì)象的類型來(lái)確定使用的是父類還是子類〔重寫(xiě)的〕方法,如下例:Employeee=newEmployee();Managerm=newManager();e.getDetails();//調(diào)用父類方法e=m;//上溯造型,e指向子類實(shí)例e.getDetails();//調(diào)用子類〔重寫(xiě)〕的方法運(yùn)行時(shí)多態(tài)59下溯造型將父類變量強(qiáng)制轉(zhuǎn)換為子類變量,可訪問(wèn)子類所擴(kuò)展的成員,如:((Son)f).SonMethod();
前提條件:只有當(dāng)父類變量正指向子類實(shí)例時(shí),才能訪問(wèn)子類所特有的成員。如例1:Fatherf=newSon();((Son)f).SonMethod();
f.SonMethod();例2:Fatherf=newFather();((Son)f).sonMethod();例:SonTest.java//對(duì)!f正指向子類實(shí)例//編譯能通過(guò),但運(yùn)行時(shí)報(bào)錯(cuò)//編譯出錯(cuò)!f需轉(zhuǎn)換為子類變量類型60測(cè)試對(duì)象的類型,返回布爾值
Empolyeee=newManager(); 那么einstanceofManager為true;為保證下溯造型成功,通常先用instanceof進(jìn)行判斷,如:if(finstanceofSon){((Son)f).SonMethod();…;}//下溯造型
instanceof運(yùn)算符61上溯造型小結(jié)上溯造型:父類的變量可以指向子類對(duì)象,系統(tǒng)默許。上溯造型中,父類變量即使指向子類實(shí)例,也只能訪問(wèn)父類中定義的變量和方法。例:Fatherf2=newSon();//上溯造型f2.sonMethod();//編譯時(shí)報(bào)錯(cuò)!f2是父類變量,只能訪問(wèn)父類定義的成員運(yùn)行時(shí)多態(tài):在運(yùn)行時(shí)根據(jù)對(duì)象的具體情況來(lái)決定調(diào)用的方法是父類的還是子類的。
如f2.fatherMethod();訪問(wèn)的方法是父類方法還是子類方法,取決于f2當(dāng)時(shí)所指向的對(duì)象。下溯造型:1〕父類變量強(qiáng)制轉(zhuǎn)換為子類變量。2〕轉(zhuǎn)換后,父類變量能否訪問(wèn)子類方法,還取決于該變量當(dāng)時(shí)是否指向子類實(shí)例。62晚聯(lián)編A的變量aXA的方法aM()類A類BB的變量aXB的方法aM()繼承自類A類AA的變量aX實(shí)例a實(shí)例b繼承的aXB的變量aX類BAa=newA();Bb=newB();Aa1=b;a.aX a.aM()b.aX b.aM()a1.aX a1.aM()a1.aM():動(dòng)態(tài)/滯后聯(lián)編,子類B的實(shí)例和方法其他〔如a1.aX〕:靜態(tài)聯(lián)編.在編譯時(shí)指定63基于上溯造型,java中允許構(gòu)造如下類型的數(shù)組:
Employee[]staff=newEmployee[3]; staff[0]=newManager(); staff[1]=newWorker(); staff[2]=newEmployee(); …staff是由多種類型的對(duì)象組成的。父類的引用變量指向子類實(shí)例,系統(tǒng)默許構(gòu)造不同類型數(shù)據(jù)的集合64類的繼承:this,super引用類的成員變量或方法時(shí)的前綴this:指向當(dāng)前類的成員〔方法\變量〕super:指向父類的成員〔只能上溯一層〕例:Employee父類Manager子類 managerMethod(){ this.getDetails();//調(diào)用子類的方法, //也可以省略this super.getDetails();//調(diào)用父類的方法… }例:ThisAndSuper.java65super指向該關(guān)鍵字所在類的父類。publicclassEmployee{ privateStringname; privateintsalary; publicStringgetDetails(){ return“Name:〞+name+“\nSalary:〞+salary; } }publicclassManagerextendsEmployee{ privateStringdepartment; publicStringgetDetails(){//子類重寫(xiě)方法 returnsuper.getDetails()+‘\nDepartment:“+ department; } }super關(guān)鍵字66缺?。鹤詣?dòng)調(diào)用不帶參數(shù)的父類構(gòu)造方法。如需調(diào)用含參數(shù)的父類構(gòu)造方法,那么需在子類構(gòu)造方法的第一行通過(guò)super(…)調(diào)用。class
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 地板行業(yè)智能制造-深度研究
- 2025年廣州城市職業(yè)學(xué)院高職單招職業(yè)適應(yīng)性測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 女性健康產(chǎn)品創(chuàng)新研究-深度研究
- 2025年廣東輕工職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- 2025年廣東茂名農(nóng)林科技職業(yè)學(xué)院高職單招高職單招英語(yǔ)2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年山西藥科職業(yè)學(xué)院高職單招高職單招英語(yǔ)2016-2024歷年頻考點(diǎn)試題含答案解析
- 2025年山東海事職業(yè)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 天然產(chǎn)物Codonopiloneolignanin A、Ganocins A-C的合成研究及生物活性評(píng)估
- 實(shí)時(shí)精密鐘軌誤差包絡(luò)方法研究
- 道路修復(fù)施工方案
- 無(wú)人化農(nóng)場(chǎng)項(xiàng)目可行性研究報(bào)告
- 《如何存款最合算》課件
- 社區(qū)團(tuán)支部工作計(jì)劃
- 拖欠工程款上訪信范文
- 2024屆上海市金山區(qū)高三下學(xué)期二模英語(yǔ)試題(原卷版)
- 《wifi協(xié)議文庫(kù)》課件
- 《好東西》:女作者電影的話語(yǔ)建構(gòu)與烏托邦想象
- 一年級(jí)下冊(cè)數(shù)學(xué)口算題卡打印
- 2024年中科院心理咨詢師新教材各單元考試題庫(kù)大全-下(多選題部分)
- 真人cs基于信號(hào)發(fā)射的激光武器設(shè)計(jì)
- 2024年國(guó)信證券招聘筆試參考題庫(kù)附帶答案詳解
評(píng)論
0/150
提交評(píng)論