




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
構(gòu)造函數(shù)的執(zhí)行機制第一頁,共三十一頁,2022年,8月28日目標構(gòu)造函數(shù)的執(zhí)行機制屏蔽、覆蓋和重載對象間的類型轉(zhuǎn)換對象之間的比較
第二頁,共三十一頁,2022年,8月28日6.1構(gòu)造函數(shù)的執(zhí)行機制構(gòu)造函數(shù)的作用:對創(chuàng)建的對象進行初始化類的繼承機制:子類可以使用父類的功能(即代碼),那么子類對象的初始化要使用到父類的構(gòu)造函數(shù)。第三頁,共三十一頁,2022年,8月28日classSuperClass{SuperClass(){System.out.println("SuperClassconstructor");}}publicclassSubClassextendsSuperClass{SubClass(){System.out.println("SubClassconstructor");}publicstaticvoidmain(String[]args){SubClasssub=newSubClass();}}例子6-1類在繼承關(guān)系上的初始化的順序第四頁,共三十一頁,2022年,8月28日例子6-1在子類中只實例化了一個子類對象。從輸出結(jié)果上看:程序并不是一開始就運行自己的構(gòu)造方法,而是先運行其父類的默認構(gòu)造方法。注意:程序自動調(diào)用其父類的默認構(gòu)造方法。
子類對象初始化父類構(gòu)造函數(shù)第五頁,共三十一頁,2022年,8月28日classSuperClass{ SuperClass(Stringstr) { System.out.println("Superwithastring."); }}publicclassSubClassextendsSuperClass{ SubClass(Stringstr){ System.out.println("Subwithastring.");} publicstaticvoidmain(String[]args) { SubClasssub=newSubClass("sub"); }}SubClass未找到其父類的默認構(gòu)造方法SuperClass(),編譯通不過SuperClass(){};方法1:在父類中增加一個默認構(gòu)造方法。SuperClass(){};
//SuperClass(){};super(str);
方法2:在子類的構(gòu)造方法中第一句增加“super(str)”例6-2:第六頁,共三十一頁,2022年,8月28日publicclassTest{publicstaticvoidmain(String[]args){System.out.println("Testmain()");Carcar=newCar("car");}}輸出結(jié)果為:Testmain()wheel-1wheel-2wheel-3car
例6-3:對象的初始化順序問題
在main()方法中初始化Car類的對象時,先初始化Car類的成員變量,(成員變量是wh對象則調(diào)用該對象相應(yīng)的構(gòu)造方法)。而后再初始化Car類的對象,即調(diào)用Car類的構(gòu)造方法classWheel{Wheel(Stringstr){System.out.println(str);}}classCar{Wheelwheel_1=newWheel("wheel-1");Wheelwheel_2=newWheel("wheel-2");Wheelwheel_3=newWheel("wheel-3");Car(Stringstr){System.out.println(str);}}第七頁,共三十一頁,2022年,8月28日例6-3:對象的初始化順序在創(chuàng)建對象時,對象所在類的所有數(shù)據(jù)成員會首先進行初始化如果其中的成員變量有對象,那么它們也會按照順序執(zhí)行初始化工作。在所有類成員初始化完成后,才調(diào)用對象所在類的構(gòu)造方法創(chuàng)建對象。構(gòu)造方法作用就是初始化。在test類中創(chuàng)建car對象時,先初始化“car”類的成員變量成員變量wheel_1,wheel_1,
wheel_1等按順序初始化最后調(diào)用car類的構(gòu)造函數(shù)第八頁,共三十一頁,2022年,8月28日publicclassTest{publicstaticvoidmain(String[]args){System.out.println("Testmain()");Carcar_1=newcar("car-1");System.out.println("------------");Carcar_2=newcar("car-2");}}如一個類有靜態(tài)對象,那么它會在非靜態(tài)對象前初始化,但只初始化一次classCar{Wheelwheel_1=newWheel(“wheel-1”);
Wheelwheel_2=newWheel("wheel-2");staticWheelwheel_3=newWheel("wheel-3");Car(Stringstr){System.out.println(str);}}classWheel{Wheel(Stringstr){System.out.println(str);}}例6-4:輸出結(jié)果:Testmain()wheel-3wheel-1wheel-2car-1----------wheel-1wheel-2car-2第九頁,共三十一頁,2022年,8月28日classcar{Wheelwheel_1=newWheel("wheel-1");Wheelwheel_2=newWheel("wheel-2");staticWheelwheel_3=newWheel("wheel-3");Car(Stringstr){System.out.println(str);}}例6-5publicclassTest{staticCarcar_3=newCar("car-3");
publicstaticvoidmain(String[]args){System.out.println("Testmain()");Carcar_1=newCar("car-1");System.out.println("------------");Carcar_2=newCar("car-2");}}
輸出:wheel-3wheel-1wheel-2car-3Testmain()wheel-1wheel-2car-1----------wheel-1wheel-2car-2程序中主類的靜態(tài)變量會在main()方法執(zhí)行前初始化。classWheel{Wheel(Stringstr){System.out.println(str);}}第十頁,共三十一頁,2022年,8月28日classcar{staticinti=0;Wheelwheel_1=newWheel("wheel-1");
staticWheelwheel_2=newWheel("wheel-2");
staticWheelwheel_3=newWheel("wheel-3");car(Stringstr){System.out.println(str);}}publicclassTest{publicstaticvoidmain(String[]args){System.out.println("main()");System.out.println("car.i="+car.i);}}輸出:main()wheel-2wheel-3car.i=0第1次創(chuàng)建對象時,類中所有的靜態(tài)變量要初始化第1次訪問類中的靜態(tài)變量(沒有創(chuàng)建對象)時,該類中所有的靜態(tài)變量也要按照它們在類中排列的順序初始化。classWheel{Wheel(Stringstr){System.out.println(str);}}例6-6第十一頁,共三十一頁,2022年,8月28日6.1構(gòu)造函數(shù)的執(zhí)行機制:總結(jié)例6-3:在創(chuàng)建對象時,對象所在類的所有數(shù)據(jù)成員(包括對象)首先按順序進行初始化,所有類成員初始化完成后,才調(diào)用對象所在類的構(gòu)造方法創(chuàng)建對象。構(gòu)造方法作用就是初始化。例6-4,6-5:靜態(tài)對象(變量)在非靜態(tài)對象前初始化。靜態(tài)對象(變量)只初始化一次,再次調(diào)用就不初始化了,但非靜態(tài)對象在每次調(diào)用時都要初始化。第十二頁,共三十一頁,2022年,8月28日6.1構(gòu)造函數(shù)的執(zhí)行機制:總結(jié)例6-5:程序中的主類的靜態(tài)變量會在main()方法執(zhí)行前進行初始化工作。例6-6:不僅第1次創(chuàng)建對象(如)時,類中所有的靜態(tài)變量要初始化,第1次訪問類中的靜態(tài)變量(沒有創(chuàng)建對象)時,該類中所有的靜態(tài)變量也要按照它們在類中排列的順序初始化。第十三頁,共三十一頁,2022年,8月28日初始化的順序包括構(gòu)造方法調(diào)用順序主類的靜態(tài)成員首先初始化。主類的超類的構(gòu)造方法按照從最高到最低的順序被調(diào)用。主類的非靜態(tài)對象(變量)初始化。調(diào)用主類的構(gòu)造方法。classCarextendsWheel{ (2)Wheelwheel_1=newWheel("wheel-1");(3)Wheelwheel_2=newWheel("wheel-2");staticWheelwheel_3=newWheel("wheel-3");(1) Car(Stringstr){ (4) System.out.println(str); }}
第十四頁,共三十一頁,2022年,8月28日6.2屏蔽、覆蓋和重載6.2.1屏蔽子類可以直接從父類繼承下來的屬性和方法,就象是自己的一樣。如果在子類中又聲明了相同名稱的屬性,則稱作子類的該屬性屏蔽(shadow)了父類中對應(yīng)的屬性。第十五頁,共三十一頁,2022年,8月28日publicclassShadowTest1{ publicstaticvoidmain(Stringargv[]){ Aa=newA(); Bb=newB(); System.out.println("a.i="+a.i); System.out.println("b.i="+b.i);}}運行結(jié)果101010a.i=10b.i=10例6-7
:B類只是單純地繼承了A類,所以顯示出來的i值均為10。提問:為什么上面輸出有3個10?classBextendsA{publicB() {System.out.println(i);}}classA{inti=10;publicA(){System.out.println(i);}}第十六頁,共三十一頁,2022年,8月28日publicclassShadowTest2{publicstaticvoidmain(Stringargv[]){ Aa=newA(); Bb=newB(); System.out.println("a.i="+a.i); System.out.println("b.i="+b.i);}}結(jié)果10105a.i=10b.i=5例6-8:類B中的屬性i覆蓋了類A中的i,顯示出來的是自身的值5。如果要在B類中顯示A類的i值,可用super.i。classBextendsA{
inti=5;//新增
publicB(){System.out.println(i);}}classA{inti=10;publicA(){ System.out.println(i);}}第十七頁,共三十一頁,2022年,8月28日6.2.2覆蓋(override)與多態(tài)
覆蓋,這里是針對方法而言的。如果子類中定義方法所用的名字、返回類型和參數(shù)表和父類中方法使用的完全一樣,稱子類方法覆蓋了父類中的方法,即子類中的成員方法將隱藏父類中的同名方法。注意:覆蓋的同名方法中,子類方法不能比父類方法的訪問權(quán)限更嚴格。在子類中,若要使用父類中被隱藏的方法,可以使用super關(guān)鍵字。正是利用方法的覆蓋可以實現(xiàn)多態(tài)性。第十八頁,共三十一頁,2022年,8月28日classAnimal{publicintweight;publicStringcolour;publicvoideat(){ System.out.println("Eating");}publicvoidmove(){ System.out.println("IamMoving");}}
classDogextendsAnimal{publicvoidmove(){System.out.println("IamRunning");}}classBirdextendsAnimal{publicvoidmove(){ System.out.println("IamFlying"); }}例6-9第十九頁,共三十一頁,2022年,8月28日例6-9publicclassInheritTest1{publicstaticvoidmain(Stringargv[]){Animala,a1=newAnimal();Dogd1=newDog();Birdb1=newBird();a=a1;a.move();a=d1;a.move();a=b1;a.move();}}運行結(jié)果為:IamMovingIamRunningIamFlying
第二十頁,共三十一頁,2022年,8月28日
重載方法名如果需要在同一類中寫多個方法,讓它們對不同的變量進行同樣的操作,就需要重載方法名?,F(xiàn)在假定需要打印int,float和String類型的值。每種類型的打印方式不同,不同的數(shù)據(jù)類型需要不同的格式,可能要進行不同的處理。此時可以建立三個方法,printint(),printfloat()和printString()。在Java和其他幾種面向?qū)ο蟮某绦蛟O(shè)計語言中,允許對多個方法使用同一個方法名,這就是方法名的重載。前提條件:能區(qū)分實際調(diào)用的是哪個方法,才可用這種方式。第二十一頁,共三十一頁,2022年,8月28日
重載方法名實際上,Java根據(jù)參數(shù)的類型和參數(shù)自變量個數(shù)的不同來調(diào)用適當?shù)姆椒?。publicvoidprint(inti){……}publicvoidprint(floatf){……}publicvoidprint(Strings){……}當調(diào)用print方法時,可根據(jù)自變量的類型選中相應(yīng)的一個方法。在這個例子中,根據(jù)參數(shù)自變量的類型來區(qū)分這些方法。當然,我們也可以根據(jù)參數(shù)自變量個數(shù)的不同來區(qū)分他們注意:不能根據(jù)返回值類型的不同來實現(xiàn)重載。第二十二頁,共三十一頁,2022年,8月28日6.2屏蔽、覆蓋和重載屏蔽:對于父類和子類的屬性而言覆蓋:對于父類和子類的方法而言(子類中定義方法所用的名字、返回類型和參數(shù)表和父類中方法使用的完全一樣)重載:對于同一個類的多個方法而言(它們使用同一個方法名,對不同變量進行相同的處理)第二十三頁,共三十一頁,2022年,8月28日
6.3類型轉(zhuǎn)換類和類之間的類型轉(zhuǎn)換只能用在父類和子類間,不能用在兄弟類,更不能用在根本不相關(guān)的兩個類之間。這樣當我們在類之間轉(zhuǎn)來轉(zhuǎn)去時,才不會迷失了方向。類型轉(zhuǎn)換的規(guī)則:子類向父類轉(zhuǎn)換時,屬于自動類型轉(zhuǎn)換;而父類要轉(zhuǎn)換成子類時,就必須要使用強制類型轉(zhuǎn)換了。強制類型轉(zhuǎn)換的語法就跟一般基本數(shù)據(jù)類型轉(zhuǎn)換的語法一樣,用小括號運算符配合要轉(zhuǎn)換成的類來做轉(zhuǎn)換的操作。第二十四頁,共三十一頁,2022年,8月28日
6.3類型轉(zhuǎn)換例6-10有A、B、C三個類,B和C類都繼承了A類。publicclassTtoT1{publicstaticvoidmain(Stringargv[]){Aa1=newA(); Bb1=newB(); Cc1=newC(); a1=b1; a1=c1;//自動類型轉(zhuǎn)換
b1=(B)a1;//強制類型轉(zhuǎn)換父類->子類
b1=(B)c1;//類型轉(zhuǎn)換兄弟類之間
}}結(jié)果:編譯出錯!“InvalidcastfromCtoB”,第二十五頁,共三十一頁,2022年,8月28日
例6-11
publicclassTtoT2{publicstaticvoidmain(Stringargv[]){Aa1=newA();Bb1=newB();Cc1=newC();a1=c1;b1=(B)a1;}}編譯時不會有問題,但是程序在執(zhí)行時就會產(chǎn)生“ClassCastException”。這種錯誤在編寫程序時比較不容易被發(fā)現(xiàn),所以要非常的小心。不論類怎樣轉(zhuǎn)換,一個對象當初是什么樣的類,它永遠會是那個類的對象。所以在屬性的訪問和方法的調(diào)用上,要注意在什么樣的情況下,只能做什么樣的處理。
第二十六頁,共三十一頁,2022年,8月28日6.4對象之間的比較運算
數(shù)字和數(shù)字之間可以比較大小,進行比較運算,對象和對象之間也有比較運算。不過通常兩個對象之間不會比較大小,而是比較兩個對象是否相等。數(shù)字之間的比較運算很簡單也很明確,相等就是相等,不相等就是不相等。而兩個對象相等可以用兩種不同的觀點來看待,一種觀點是兩個對象指的是不是同一個,另一種觀點是兩個對象的內(nèi)容是否相等。第二十七頁,共三十一頁,2022年,8月28日對象比較:例6-12publicclassStringEquals1{publicstaticvoidmain(Stringargv[]){ Stringstr1=newString("Hello"); St
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融科技的財務(wù)分析新趨勢
- 云南現(xiàn)代職業(yè)技術(shù)學院《數(shù)字化空間設(shè)計》2023-2024學年第二學期期末試卷
- 金融市場的財務(wù)管理策略
- 2025屆云南省文山壯族苗族自治州馬關(guān)縣四下數(shù)學期末學業(yè)水平測試模擬試題含解析
- 云服務(wù)平臺災(zāi)難恢復(fù)預(yù)案
- 陜西旅游烹飪職業(yè)學院《寶石加工工藝學》2023-2024學年第二學期期末試卷
- 成都理工大學《科學社會主義理論與實踐》2023-2024學年第二學期期末試卷
- 新疆石河子職業(yè)技術(shù)學院《結(jié)構(gòu)力學(Ⅰ)》2023-2024學年第二學期期末試卷
- 衢州市衢江區(qū)2025屆數(shù)學五下期末預(yù)測試題含答案
- 玉溪職業(yè)技術(shù)學院《輔項技能與實踐1》2023-2024學年第二學期期末試卷
- 2025年黑龍江農(nóng)業(yè)職業(yè)技術(shù)學院單招職業(yè)技能測試題庫及答案1套
- 華潤電力六合馬鞍120兆瓦漁(農(nóng))光互補光伏發(fā)電項目110千伏送出工程報告表
- 2025年電工特種作業(yè)人員上崗操作證考試全真模擬試題庫及答案(共七套)
- 有創(chuàng)動脈血壓監(jiān)測
- 全國導游基礎(chǔ)知識-全國導游基礎(chǔ)知識章節(jié)練習
- 【安排表】2024-2025學年下學期學校升旗儀式安排表 主題班會安排表
- 2025年度老舊小區(qū)改造施工委托合同范本
- 2024黑龍江公務(wù)員考試【A類、B類、省直、筆試】四套真題及答案
- 2025年安徽中醫(yī)藥高等??茖W校高職單招職業(yè)適應(yīng)性測試近5年??及鎱⒖碱}庫含答案解析
- 第七章 力 達標測試卷(含答案)2024-2025學年度人教版物理八年級下冊
- 2024年濟南護理職業(yè)學院高職單招語文歷年參考題庫含答案解析
評論
0/150
提交評論