




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章面向?qū)ο?1開篇引導(dǎo)在一個(gè)神奇的數(shù)字王國(guó)中,生活著各種各樣的角色。這個(gè)王國(guó)是用Java語(yǔ)言構(gòu)建起來(lái)的,充滿了面向?qū)ο蟮钠婷钅Х?。有一天,王?guó)里來(lái)了一位勇敢的冒險(xiǎn)家。冒險(xiǎn)家是一個(gè)類的實(shí)例,這個(gè)類定義了他的各種屬性和方法。冒險(xiǎn)家有強(qiáng)壯的力量屬性(strength)、敏捷的速度屬性(speed)和勇敢的心屬性(courage)。他還有戰(zhàn)斗方法(fight)、探索方法(explore)和幫助他人方法(helpOthers)。在數(shù)字王國(guó)內(nèi),還有一個(gè)神秘的魔法師公會(huì)。魔法師公會(huì)也是一個(gè)類,里面有眾多魔法師的實(shí)例。魔法師們有強(qiáng)大的魔法力量屬性(magicPower)和智慧屬性(wisdom)。他們可以施展各種魔法方法,如火焰魔法(castFireSpell)、治愈魔法(castHealingSpell)等。冒險(xiǎn)家在冒險(xiǎn)的過(guò)程中,遇到了各種困難和挑戰(zhàn)。有一次,他來(lái)到了一個(gè)被惡龍占據(jù)的城堡。惡龍是一個(gè)強(qiáng)大的類的實(shí)例,它有巨大的攻擊力屬性(attackPower)和防御力屬性(defensePower)。冒險(xiǎn)家知道自己無(wú)法單獨(dú)戰(zhàn)勝惡龍,于是他決定去魔法師公會(huì)尋求幫助。冒險(xiǎn)家來(lái)到魔法師公會(huì),向魔法師們說(shuō)明了情況。魔法師們決定和冒險(xiǎn)家一起組成一個(gè)團(tuán)隊(duì),共同對(duì)抗惡龍。他們利用面向?qū)ο蟮奶匦裕瑢⒏髯缘哪芰M合起來(lái)。魔法師們使用他們的魔法方法為冒險(xiǎn)家增加力量和防御,冒險(xiǎn)家則利用自己的戰(zhàn)斗方法和探索方法,尋找惡龍的弱點(diǎn)。在激烈的戰(zhàn)斗中,冒險(xiǎn)家和魔法師們充分發(fā)揮了面向?qū)ο缶幊痰膬?yōu)勢(shì)。他們相互協(xié)作,共同應(yīng)對(duì)惡龍的攻擊。最終,在團(tuán)隊(duì)的努力下,他們成功地?fù)魯×藧糊?,拯救了?shù)字王國(guó)。01開篇引導(dǎo)知識(shí)要點(diǎn)掌握程度相關(guān)知識(shí)面向?qū)ο蟮乃枷肓私饷嫦蜻^(guò)程的概念面向?qū)ο蟮母拍蠲嫦驅(qū)ο笈c面向過(guò)程的關(guān)系類與對(duì)象的關(guān)系重點(diǎn)掌握類的定義對(duì)象的定義類
與對(duì)象的關(guān)系成員調(diào)用重點(diǎn)掌握成員變量與成員方法的定義成員變量與成員方法的調(diào)用成員變量與局部變量的區(qū)別掌握成員變量與局部變量的區(qū)別01開篇引導(dǎo)知識(shí)要點(diǎn)掌握程度相關(guān)知識(shí)this和static關(guān)鍵字掌握this關(guān)鍵字static關(guān)鍵字構(gòu)造方法掌握構(gòu)造方法的定義構(gòu)造方法的語(yǔ)法結(jié)構(gòu)構(gòu)造方法的訪問(wèn)封裝重點(diǎn)掌握封裝的定義包package訪問(wèn)修飾符的權(quán)限封裝的實(shí)現(xiàn)5.封裝的好處繼承掌握繼承的定義2.繼承的作用3.繼承的語(yǔ)法和實(shí)現(xiàn)4.成員的訪問(wèn)5.構(gòu)造方法的調(diào)用順序6.方法重寫7.super關(guān)鍵字8.final關(guān)鍵字01開篇引導(dǎo)知識(shí)要點(diǎn)掌握程度相關(guān)知識(shí)多態(tài)重點(diǎn)掌握多態(tài)的定義多態(tài)的優(yōu)點(diǎn)和作用多態(tài)的實(shí)現(xiàn)方式抽象類和抽象方法重點(diǎn)掌握抽象類的定義與概述抽象類的實(shí)現(xiàn)特點(diǎn)抽象類的實(shí)現(xiàn)方式抽象類的作用抽象方法的定義與概述抽象方法的實(shí)現(xiàn)方式接口重點(diǎn)掌握接口的定義與概述接口的特點(diǎn)接口的作用接口的實(shí)現(xiàn)方式抽象類與接口的區(qū)別01開篇引導(dǎo)技能要點(diǎn)掌握程度應(yīng)用方向創(chuàng)建類和對(duì)象重點(diǎn)掌握應(yīng)用開發(fā)移動(dòng)端開發(fā)this和static關(guān)鍵字的應(yīng)用重點(diǎn)掌握應(yīng)用開發(fā)Web開發(fā)構(gòu)造方法掌握應(yīng)用開發(fā)Web開發(fā)封裝重點(diǎn)掌握應(yīng)用開發(fā)Web開發(fā)桌面開發(fā)
大數(shù)據(jù)開發(fā)
游戲開發(fā)01開篇引導(dǎo)技能要點(diǎn)掌握程度應(yīng)用方向繼承重點(diǎn)掌握應(yīng)用開發(fā)Web開發(fā)多態(tài)重點(diǎn)掌握應(yīng)用開發(fā)Web開發(fā)桌面開發(fā)大數(shù)據(jù)開發(fā)抽象類重點(diǎn)掌握游戲開發(fā)桌面開發(fā)接口重點(diǎn)掌握Web開發(fā)
大數(shù)據(jù)開發(fā)
面向?qū)ο蟮乃枷?面向過(guò)程的概念02是以過(guò)程為中心的編程思想。它把解決問(wèn)題的過(guò)程分解為一系列的步驟,通過(guò)依次執(zhí)行這些步驟來(lái)完成任務(wù)。在面向過(guò)程編程中,重點(diǎn)關(guān)注的是方法和數(shù)據(jù)的操作,而不是對(duì)象和它們之間的交互。面向?qū)ο蟮乃枷?面向?qū)ο蟮母拍?2它以對(duì)象為中心來(lái)組織程序結(jié)構(gòu),面向?qū)ο缶幊淌且环N程序設(shè)計(jì)思想,通過(guò)對(duì)象之間的交互來(lái)實(shí)現(xiàn)程序的功能,強(qiáng)調(diào)的是具備“面向過(guò)程”的“動(dòng)作行為”的事物,隨著時(shí)間的推移和社會(huì)文化的進(jìn)步,思想也在進(jìn)步。從面向過(guò)程的執(zhí)行者,變成了面向?qū)ο蟮闹笓]者。是復(fù)雜問(wèn)題簡(jiǎn)單化。面向?qū)ο蟮乃枷?面向?qū)ο笈c面向過(guò)程關(guān)系02面向?qū)ο蠛兔嫦蜻^(guò)程是兩種不同的編程思想,面向?qū)ο笈c面向過(guò)程既有聯(lián)系,又有區(qū)別1.面向?qū)ο笈c面向過(guò)程聯(lián)系(1)相互補(bǔ)充在Java中,雖然面向?qū)ο笫侵饕木幊趟枷?,但在某些情況下,面向過(guò)程的編程方式也可以發(fā)揮作用。(2)代碼實(shí)現(xiàn)在Java中,面向?qū)ο蟮拇a可以通過(guò)調(diào)用面向過(guò)程的代碼來(lái)實(shí)現(xiàn)某些功能。(3)發(fā)展歷程面向?qū)ο缶幊淌窃诿嫦蜻^(guò)程編程的基礎(chǔ)上發(fā)展起來(lái)的。面向?qū)ο缶幊涛樟嗣嫦蜻^(guò)程編程的一些優(yōu)點(diǎn)。面向?qū)ο蟮乃枷?面向?qū)ο笈c面向過(guò)程區(qū)別02(1)編程思想面向?qū)ο缶幊蹋∣bject-OrientedProgramming,OOP):以對(duì)象為中心,將數(shù)據(jù)和操作封裝在對(duì)象中,通過(guò)對(duì)象之間的交互來(lái)實(shí)現(xiàn)程序的功能。面向過(guò)程編程(ProceduralProgramming):以過(guò)程為中心,將程序分解為一系列的步驟,通過(guò)依次執(zhí)行這些步驟來(lái)完成任務(wù)。(2)數(shù)據(jù)和操作的關(guān)系面向?qū)ο螅簲?shù)據(jù)和操作被封裝在對(duì)象中,對(duì)象具有自己的狀態(tài)和行為。通過(guò)對(duì)象的方法來(lái)操作對(duì)象的數(shù)據(jù),實(shí)現(xiàn)了數(shù)據(jù)和操作的緊密結(jié)合。面向過(guò)程:數(shù)據(jù)和操作是分離的,數(shù)據(jù)通常作為參數(shù)傳遞給函數(shù),函數(shù)對(duì)數(shù)據(jù)進(jìn)行操作并返回結(jié)果。(3)代碼組織方式面向?qū)ο螅阂灶惡蛯?duì)象為基本單位,通過(guò)類的繼承、多態(tài)等特性來(lái)組織代碼。代碼結(jié)構(gòu)更加清晰、易于維護(hù)和擴(kuò)展。面向過(guò)程:以函數(shù)為基本單位,通過(guò)函數(shù)的調(diào)用和順序執(zhí)行來(lái)組織代碼。代碼結(jié)構(gòu)相對(duì)簡(jiǎn)單,但在復(fù)雜程序中可能會(huì)變得混亂。類與對(duì)象的關(guān)系-類的定義03類是對(duì)現(xiàn)實(shí)世界中一類具有共同特征的事物的抽象描述。它定義了對(duì)象的屬性(成員變量)和行為(方法)。通過(guò)類可以創(chuàng)建多個(gè)具有相同結(jié)構(gòu)和行為的對(duì)象,每個(gè)對(duì)象都有自己獨(dú)立的狀態(tài)。語(yǔ)法結(jié)構(gòu)如下:訪問(wèn)修飾符class類的名稱{//成員變量//成員方法}小貼士:在類中訪問(wèn)修飾符只能是public和默認(rèn)的,在后續(xù)的課程會(huì)學(xué)到內(nèi)部類,可以使用protected、private、public和默認(rèn)的類與對(duì)象的關(guān)系-類的定義03【例7-1】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類ClassDemo,實(shí)現(xiàn)類的定義,代碼如下:publicclassClassDemo{intage;Stringname;publicvoidtestDemo(){System.out.println("HelloWorld");}}在上述代碼中,訪問(wèn)修飾是public,class是類的關(guān)鍵字,ClassDemo代表的類的名稱,age和name是成員屬性,testDemo是成員方法。類與對(duì)象的關(guān)系-對(duì)象的定義03對(duì)象是類的實(shí)例化結(jié)果,它代表著現(xiàn)實(shí)世界中的具體事物或者概念的抽象表示,對(duì)象是由類創(chuàng)建出來(lái)的具體實(shí)體,每個(gè)對(duì)象都有自己獨(dú)立的狀態(tài)和行為,狀態(tài)由對(duì)象的屬性(成員變量)來(lái)表示,行為由對(duì)象的方法來(lái)定義。語(yǔ)法結(jié)構(gòu)如下:類的名稱
對(duì)象名稱=new類的名稱();小貼士:對(duì)象是由類創(chuàng)建出來(lái)的具體實(shí)體,創(chuàng)建對(duì)象使用new關(guān)鍵字,對(duì)象名稱必須符合命名規(guī)則,必須是合法的。類與對(duì)象的關(guān)系-對(duì)象的定義03【例7-2】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類ClassDemo,實(shí)現(xiàn)對(duì)象的定義,代碼如下:publicclassClassDemo{intage;Stringname;publicvoidtestDemo(){System.out.println("HelloWorld");}publicstaticvoidmain(String[]args){ClassDemocd=newClassDemo();}}在上述代碼中,ClassDemo是類的名稱,cd是對(duì)象的變量,使用new關(guān)鍵字,這種創(chuàng)建對(duì)象方式也是最常用的。類與對(duì)象的關(guān)系03類與對(duì)象的關(guān)系緊密,類定義了對(duì)象的結(jié)構(gòu)和行為。它就像一個(gè)藍(lán)圖或模板,描述了一類對(duì)象所具有的共同屬性(成員變量)和行為(方法),類中定義的方法決定了對(duì)象能夠執(zhí)行哪些操作對(duì)象是根據(jù)類的定義創(chuàng)建出來(lái)的具體實(shí)體。通過(guò)使用new關(guān)鍵字和類的構(gòu)造方法,可以創(chuàng)建一個(gè)類的對(duì)象。對(duì)象只能調(diào)用類中定義的方法來(lái)實(shí)現(xiàn)特定的行為.成員的調(diào)用-成員變量和成員方法的定義041.成員變量的定義成員變量定義在類的內(nèi)部,通常在類的開頭部分,在任何方法、構(gòu)造函數(shù)或代碼塊之外。成員變量在整個(gè)類的范圍內(nèi)都是可見的?!纠?-3】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo,實(shí)現(xiàn)成員變量的創(chuàng)建,代碼如下:publicclassVariableDemo{intage;//定義ageStringname;//定義名稱}在上述代碼中,成員變量定義在類中,age和name就是成員變量。成員的調(diào)用-成員變量和成員方法的定義042.成員方法的定義成員方法定義在類的內(nèi)部,可以在類的任何位置,但通常在成員變量之后。成員方法由方法簽名和方法體組成。【例7-4】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo02,實(shí)現(xiàn)成員方法的創(chuàng)建,代碼如下:publicclassVariableDemo02{publicvoidtestDemo(){System.out.println("成員方法");}}在上述代碼中,成員方法在定義在類中,testDemo方法就是成員方法。成員的調(diào)用-成員變量和成員方法的調(diào)用04成員變量和成員方法可以通過(guò)對(duì)象來(lái)進(jìn)行調(diào)用?!纠?-5】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo03,實(shí)現(xiàn)成員變量和成員方法的調(diào)用
,代碼如下:publicclassVariableDemo03{intage;Stringname;publicvoidtestDemo(){System.out.println("成員方法");}publicstaticvoidmain(String[]args){//調(diào)用成員變量VariableDemo03variableDemo03=newVariableDemo03();variableDemo03.age=30;variableD="小明";//調(diào)用成員方法variableDemo03.testDemo();}}在上述代碼中,我們不難看出,如果需要調(diào)用成員變量和方法需要?jiǎng)?chuàng)建對(duì)象,variableDemo03是我們自己創(chuàng)建的對(duì)象,調(diào)用成員變量:對(duì)象名稱.屬性名稱=值;調(diào)用成員方法:對(duì)象名稱.方法。成員的變量與局部變量的區(qū)別051.定義位置(1)成員變量:定義在類中,方法體之外。可以分為實(shí)例變量和類變量。實(shí)例變量隨著對(duì)象的創(chuàng)建而存在于對(duì)象所屬的堆內(nèi)存中;類變量在類被加載時(shí)分配在方法區(qū)中,被所有該類的實(shí)例所共享。(2)局部變量:定義在方法體、構(gòu)造方法或者代碼塊中。2.生命周期(1)成員變量:與對(duì)象的生命周期相同,對(duì)象創(chuàng)建時(shí)成員變量被初始化,對(duì)象被垃圾回收時(shí)成員變量也隨之消失。類變量的生命周期則與類的生命周期一致,從類被加載到類被卸載。(2)局部變量:局部變量在方法、構(gòu)造方法或者代碼塊被執(zhí)行時(shí)創(chuàng)建,當(dāng)方法、構(gòu)造方法或者代碼塊執(zhí)行完畢后,局部變量立即被銷毀。3.初始化(1)成員變量:類變量在類加載時(shí)會(huì)被賦予初始值,如果沒有顯式初始化,會(huì)被賦予默認(rèn)值(如整數(shù)類型為0,布爾類型為false,引用類型為null等)。實(shí)例變量在對(duì)象創(chuàng)建時(shí)會(huì)被賦予初始值,如果沒有顯式初始化,也會(huì)被賦予默認(rèn)值。成員的變量與局部變量的區(qū)別05(2)局部變量:局部變量在使用前必須顯式初始化,否則會(huì)出現(xiàn)編譯錯(cuò)誤。4.存儲(chǔ)位置(1)成員變量:實(shí)例變量存儲(chǔ)在堆內(nèi)存中,與對(duì)象一起分配空間。類變量存儲(chǔ)在方法區(qū)中。(2)局部變量:存儲(chǔ)在棧內(nèi)存中,隨著方法的調(diào)用而創(chuàng)建,方法調(diào)用結(jié)束后立即釋放。5.作用域(1)成員變量:在整個(gè)類中都可見,只要有對(duì)象存在,實(shí)例變量就可以被訪問(wèn);類變量可以通過(guò)類名直接訪問(wèn),也可以通過(guò)對(duì)象訪問(wèn)。(2)局部變量:局部變量的作用域僅限于定義它的方法、構(gòu)造方法或者代碼塊內(nèi)部。在這個(gè)范圍內(nèi),局部變量可以被訪問(wèn);一旦超出這個(gè)范圍,局部變量就不可見了。this和static關(guān)鍵字-this關(guān)鍵字06this關(guān)鍵字和static關(guān)鍵字是Java中非常重要的兩個(gè)關(guān)鍵字,this關(guān)鍵字是對(duì)象級(jí)的,static關(guān)鍵字是類級(jí)的。(1)指當(dāng)前對(duì)象“this”在Java中是一個(gè)引用,它指向調(diào)用當(dāng)前方法的對(duì)象實(shí)例。當(dāng)你在一個(gè)類的方法內(nèi)部使用“this”時(shí),它代表當(dāng)前的那個(gè)對(duì)象。在成員方法中,“this”可以用來(lái)區(qū)分成員變量和局部變量,當(dāng)局部變量與成員變量同名時(shí),使用“this.成員變量名”來(lái)訪問(wèn)成員變量。(2)用于構(gòu)造方法的調(diào)用可以在一個(gè)構(gòu)造方法中使用“this”來(lái)調(diào)用同一類中的其他構(gòu)造方法,這樣可以減少代碼重復(fù)。(3)作為方法參數(shù)傳遞需要將當(dāng)前對(duì)象作為參數(shù)傳遞給另一個(gè)方法。這時(shí)可以使用“this”來(lái)表示當(dāng)前對(duì)象this和static關(guān)鍵字-this關(guān)鍵字06【例7-6】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo04,實(shí)現(xiàn)this關(guān)鍵字的使用
,代碼如下:publicclassVariableDemo04{intage;Stringname;publicvoidtestDemo(){this.age=20;="John";System.out.println("age="+age+"name="+name);}publicvoidtestDemo2(){this.testDemo();}//作為方法的參數(shù)傳遞publicvoidtestDemo3(VariableDemo04variableDemo04){testDemo3(this);}publicstaticvoidmain(String[]args){VariableDemo04variableDemo04=newVariableDemo04();variableDemo04.testDemo();variableDemo04.testDemo2();}}在上述代碼中,可以看出在全局方法中使用this關(guān)鍵調(diào)用全局方法:“this.成員方法名稱”,代表的是當(dāng)前對(duì)象調(diào)用成員方法,在全局方法中使用this關(guān)鍵調(diào)用全局屬性:“this.成員屬性名”,在構(gòu)造方法中使用this關(guān)鍵字,后續(xù)課程會(huì)詳細(xì)講解。this關(guān)鍵字可以作為方法的參數(shù)傳遞,從代碼中可以看出,this關(guān)鍵字作為參數(shù)可以直接傳遞給另一個(gè)方法。this和static關(guān)鍵字-static關(guān)鍵字061.靜態(tài)變量用“static”修飾的成員變量稱為靜態(tài)變量,也叫類變量。它不屬于任何一個(gè)具體的對(duì)象,而是屬于整個(gè)類。所有該類的對(duì)象共享同一個(gè)靜態(tài)變量?!纠?-7】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo05,實(shí)現(xiàn)創(chuàng)建靜態(tài)變量
,代碼如下:publicclassVariableDemo05{//靜態(tài)變量staticintnum;staticintnum;}在上述代碼中,可以看出static修飾的成員變量就是靜態(tài)變量。每個(gè)類可以有多個(gè)靜態(tài)變量。它們是類級(jí)變量而非對(duì)象級(jí)變量。訪問(wèn)靜態(tài)變量時(shí),由于靜態(tài)變量不依附于某個(gè)對(duì)象,所以只需要通過(guò)“類名.靜態(tài)變量”的方式訪問(wèn)。this和static關(guān)鍵字-static關(guān)鍵字06【例7-8】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo05,實(shí)現(xiàn)訪問(wèn)靜態(tài)變量
,代碼如下:publicclassVariableDemo05{//靜態(tài)變量staticintnum;staticintnum2;publicstaticvoidmain(String[]args){VariableDemo05.num=10;VariableDemo05.num2=20;System.out.println("Thenumberis:"+VariableDemo05.num);System.out.println("Thenumber2is:"+VariableDemo05.num2);}}在上述代碼中,我們可以看出訪問(wèn)靜態(tài)變量,不用創(chuàng)建對(duì)象,直接可以使用”類名.屬性名稱”,屬于類級(jí)別,而不是對(duì)象級(jí)別的,靜態(tài)變量使用簡(jiǎn)單便捷,但是不能全部都使用靜態(tài)變量,需要按照需求來(lái)完成。this和static關(guān)鍵字-static關(guān)鍵字062.靜態(tài)常量與靜態(tài)變量本質(zhì)一樣,靜態(tài)常量(staticfinal)也是屬于類級(jí)別的。靜態(tài)常量值會(huì)在類加載期間被確定,并將在整個(gè)程序執(zhí)行期間保持不變。靜態(tài)常數(shù)通常被用來(lái)表示不可變的值?!纠?-9】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo06,實(shí)現(xiàn)創(chuàng)建靜態(tài)常量
,代碼如下:publicclassVariableDemo06{finalstaticintNUM=10;finalstaticintNUM2=20;}在上述代碼中,我們可以看出定義靜態(tài)常量時(shí)需要final關(guān)鍵字,final關(guān)鍵字在后續(xù)的課程會(huì)詳細(xì)的講解,常量的名稱是大寫,雖然沒有明確的規(guī)定,即使按照變量規(guī)定去寫也不會(huì)出現(xiàn)編譯錯(cuò)誤,但是這么做能夠讓你在代碼閱讀上清晰識(shí)別出哪些是靜態(tài)常量。this和static關(guān)鍵字-static關(guān)鍵字063.靜態(tài)方法靜態(tài)方法也是如此,它可以直接通過(guò)類名調(diào)用,而不需要?jiǎng)?chuàng)建對(duì)象。靜態(tài)方法中不能直接訪問(wèn)非靜態(tài)成員(成員變量和成員方法),因?yàn)殪o態(tài)方法在類加載時(shí)就存在了,而此時(shí)非靜態(tài)成員可能還沒有被創(chuàng)建。【例7-10】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo07,實(shí)現(xiàn)創(chuàng)建靜態(tài)方法
,代碼如下:publicclassVariableDemo07{//創(chuàng)建靜態(tài)方法publicstaticvoidtestDemo(){System.out.println("靜態(tài)方法");}}在上述代碼中,可以看出static修飾的方法是靜態(tài)方法。在6.2章節(jié)方法中就已經(jīng)創(chuàng)建過(guò)靜態(tài)方法。this和static關(guān)鍵字-static關(guān)鍵字06【例7-11】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo06,實(shí)現(xiàn)調(diào)用靜態(tài)方法
,代碼如下:publicclassVariableDemo06{//創(chuàng)建靜態(tài)方法publicstaticvoidtestDemo(){System.out.println("靜態(tài)方法");}publicstaticvoidmain(String[]args){//調(diào)用靜態(tài)方法VariableDemo06.testDemo();VariableDemo06variableDemo06=newVariableDemo06();variableDemo06.testDemo();}}在上述代碼中,我們可以看出調(diào)用靜態(tài)方法直接使用”類名.方法名稱”,也可以”對(duì)象名.方法名稱”,這么做本身不會(huì)出現(xiàn)編譯錯(cuò)誤,但是不建議這么做。小貼士:使用靜態(tài)方法時(shí)需要注意靜態(tài)方法可以訪問(wèn)靜態(tài)方法,非靜態(tài)方法可以訪問(wèn)靜態(tài)方法,靜態(tài)方法不可以訪問(wèn)非靜態(tài)方法,因?yàn)榉庆o態(tài)方法或非靜態(tài)變量的調(diào)用要先創(chuàng)建對(duì)象,而在調(diào)用靜態(tài)方法時(shí)可能對(duì)象并沒有被初始化!靜態(tài)方法中不可以使用this關(guān)鍵字,因?yàn)橐驗(yàn)殪o態(tài)方法本身與對(duì)象無(wú)關(guān),而是類的級(jí)別。this和static關(guān)鍵字-static關(guān)鍵字063.靜態(tài)初始化塊靜態(tài)初始化塊(StaticInitializationBlock)是一個(gè)被static關(guān)鍵字聲明的代碼塊,并且沒有任何參數(shù)或返回值。Java中可以使用靜態(tài)初始化塊來(lái)初始化靜態(tài)變量。靜態(tài)初始化塊在類被加載時(shí)執(zhí)行,且只執(zhí)行一次?!纠?-12】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo08,實(shí)現(xiàn)調(diào)用靜態(tài)方法
,代碼如下:publicclassVariableDemo08{staticintnum;staticStringname;//靜態(tài)初始化代碼塊給靜態(tài)變量賦值
static{num=10;name="靜態(tài)初始化代碼塊";}publicstaticvoidmain(String[]args){System.out.println(VariableDemo08.num);System.out.println(VariableD);}}在上述代碼中,當(dāng)類在第一次加載時(shí),若有靜態(tài)初始?jí)K,則會(huì)執(zhí)行靜態(tài)初始?jí)K代碼,靜態(tài)初始?jí)K代碼優(yōu)先于構(gòu)造方法執(zhí)行,且不管你創(chuàng)不創(chuàng)建對(duì)象,它都會(huì)有且僅執(zhí)行一次(與實(shí)例對(duì)象無(wú)關(guān))。所有的靜態(tài)變量初始化和靜態(tài)初始化塊以它們?cè)陬愔新暶鞯捻樞騺?lái)執(zhí)行。構(gòu)造方法-構(gòu)造方法的定義07構(gòu)造函數(shù)是面向?qū)ο笾械囊粏T,也叫做構(gòu)造器,用于創(chuàng)建對(duì)象以及給對(duì)象進(jìn)行初始化,創(chuàng)建對(duì)象都必須要通過(guò)構(gòu)造函數(shù)初始化。構(gòu)造方法-構(gòu)造方法的語(yǔ)法07聲明構(gòu)造函數(shù)與聲明方法類似,但是,構(gòu)造方法名稱必須與類名保持一致,并且不能定義返回類型。注意:不同于void類型返回值,void是沒有具體返回值類型;構(gòu)造方法是連類型都沒有。訪問(wèn)修飾符
類的名稱(參數(shù)列表){//初始化變量}或者訪問(wèn)修飾符
類的名稱(){//初始化變量}構(gòu)造方法-構(gòu)造方法的語(yǔ)法07【例7-13】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo09,實(shí)現(xiàn)創(chuàng)建構(gòu)造方法
,代碼如下:publicclassVariableDemo09{intnum;Stringname;publicVariableDemo09(){System.out.println("默認(rèn)的無(wú)參構(gòu)造方法");}publicVariableDemo09(intnum,Stringname){this.num=num;=name;}}在上述代碼中,可以看出我們的構(gòu)造方法不需要返回值類型,只需要訪問(wèn)修飾符和類名即可,第一個(gè)構(gòu)造方法是默認(rèn)無(wú)參的構(gòu)造方法,第二個(gè)構(gòu)造方法是有參的構(gòu)造方法。構(gòu)造方法-構(gòu)造方法的訪問(wèn)07【例7-13】在一個(gè)項(xiàng)目中創(chuàng)建一個(gè)類VariableDemo09,實(shí)現(xiàn)創(chuàng)建構(gòu)造方法
,代碼如下:publicclassVariableDemo09{intnum;Stringname;publicVariableDemo09(){System.out.println("默認(rèn)的無(wú)參構(gòu)造方法");}publicVariableDemo09(intnum,Stringname){this.num=num;=name;}}publicstaticvoidmain(String[]args){//創(chuàng)建無(wú)參的對(duì)象,調(diào)用無(wú)參的構(gòu)造方法VariableDemo09variableDemo09=newVariableDemo09();//創(chuàng)建1個(gè)參數(shù)的對(duì)象,調(diào)用的是1個(gè)參數(shù)的構(gòu)造方法VariableDemo09variableDemo09_one=newVariableDemo09(10);//創(chuàng)建2個(gè)參數(shù)的對(duì)象,調(diào)用的是2個(gè)參數(shù)的構(gòu)造方法VariableDemo09variableDemo09_two=newVariableDemo09(10,"小明");}}在上述代碼中,可以看出,創(chuàng)建不同參數(shù)個(gè)數(shù)的對(duì)象調(diào)用不同的構(gòu)造方法。小貼士:若一個(gè)類未定義任何構(gòu)造方法,則會(huì)自動(dòng)提供一個(gè)無(wú)參數(shù)的默認(rèn)構(gòu)造方法(不體現(xiàn)在代碼上)。若一個(gè)類中定義了特定的構(gòu)造方法,該類原有的默認(rèn)構(gòu)造方法將不再可用,如果需要默認(rèn)的構(gòu)造方法,就顯式聲明出無(wú)參的構(gòu)造方法。封裝-封裝的定義08Java是一門面向?qū)ο缶幊陶Z(yǔ)言,主要具有以下三個(gè)主要特性:封裝、繼承和多態(tài)。理解并遵守它們能夠幫助你構(gòu)建更為健壯、靈活的代碼。封裝的定義:封裝就是將類的狀態(tài)信息(屬性)和行為(方法)包裝在一個(gè)類中,并對(duì)類的屬性設(shè)置訪問(wèn)權(quán)限,隱藏類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),只通過(guò)特定的方法來(lái)訪問(wèn)和修改這些屬性。通過(guò)封裝,可以提高代碼的安全性、可維護(hù)性和可擴(kuò)展性。封裝-包package08包(package)是一種用于組織和管理類、接口以及其他程序元素的機(jī)制。1.包package的作用(1)避免命名沖突在龐大的項(xiàng)目架構(gòu)中,同名的類可能會(huì)大量出現(xiàn)。通過(guò)將這些類分散至不同的包(package)中,我們能夠有效規(guī)避命名上的沖突。(2)提升組織性和管理效率包(package)的使用有助于將相關(guān)的類、接口以及其他程序組件整合在一起,從而增強(qiáng)代碼的可讀性和可維護(hù)性。(3)精細(xì)化訪問(wèn)控制包(package)機(jī)制允許我們對(duì)類、接口及其他程序組件的訪問(wèn)權(quán)限進(jìn)行精細(xì)控制。將特定的類置于特定的包內(nèi),可以限制它們的訪問(wèn)范圍,確保只有授權(quán)的類能夠訪問(wèn)它們。封裝-包package082.包package聲明和導(dǎo)入(1)包聲明在Java源文件的起始部分,我們可以通過(guò)使用package關(guān)鍵字來(lái)聲明該源文件內(nèi)類的歸屬包。例如,語(yǔ)句“packageject;”表明了源文件中的類是屬于ject包的。(2)包導(dǎo)入當(dāng)需要在一個(gè)類中引用另一個(gè)包的類時(shí),可以借助import關(guān)鍵字來(lái)導(dǎo)入所需的類。例如,語(yǔ)句“importject.ClassTest;”實(shí)現(xiàn)了對(duì)ject包中ClassTest類的導(dǎo)入。此外,我們還可以使用通配符導(dǎo)入一個(gè)包內(nèi)的所有類,如“importject*;”所示。3.自定義包package(1)構(gòu)建自定義包在文件系統(tǒng)中構(gòu)建一個(gè)與包名相對(duì)應(yīng)的目錄結(jié)構(gòu)。例如,若要?jiǎng)?chuàng)建一個(gè)名為pany.myproject的包,應(yīng)在項(xiàng)目的根目錄下創(chuàng)建一個(gè)com目錄,接著在com目錄下創(chuàng)建company目錄,最后在company目錄下創(chuàng)建myproject目錄。將Java源文件放置于相應(yīng)的包目錄內(nèi),并在源文件的起始處聲明包名。(2)應(yīng)用自定義包在其他Java源文件中,可以通過(guò)導(dǎo)入自定義包內(nèi)的類來(lái)使用它們。只要自定義包位于項(xiàng)目的類路徑中,Java編譯器和運(yùn)行時(shí)環(huán)境便能定位并使用這些包中的類。封裝-訪問(wèn)修飾符的權(quán)限08在不影響正常功能執(zhí)行的前提,盡可能地使每個(gè)類或類中成員可訪問(wèn)性最小化。在Java編程中,控制成員(屬性、方法、嵌套類)訪問(wèn)性的關(guān)鍵字有:私有的(private)、包級(jí)私有的(package-private)、受保護(hù)的(protected)以及公有的(public)。按照可訪問(wèn)性范圍遞減做說(shuō)明,如表所示。訪問(wèn)修飾符當(dāng)前類同一包內(nèi)子孫類(同一包)子孫類(不同包)其他包public√√√√√protected√√√√/××defalut√√√××private√××××(1)public:對(duì)所有類可見。使用對(duì)象:類、接口、變量、方法(2)protected:對(duì)同一包內(nèi)的類和所有子類可見。使用對(duì)象:變量、方法。
注意:不能修飾類(外部類)。(3)default(即默認(rèn),什么也不寫):在同一包內(nèi)可見,不使用任何修飾符。使用對(duì)象:類、接口、變量、方法。(4)private:在同一類內(nèi)可見。使用對(duì)象:變量、方法。
注意:不能修飾類(外部類)封裝-封裝的實(shí)現(xiàn)08最小化(private)成員屬性后會(huì)使得當(dāng)前類無(wú)法被其它類友好使用,公有化(public)成員屬性就失去了封裝的意義。如何保證類成員不暴露數(shù)據(jù)域又能被其它類友好訪問(wèn)?我們通常將類設(shè)計(jì)為包含私有域?qū)傩裕╬rivate)和公有訪問(wèn)方法(getter),如果需要對(duì)私有的屬性進(jìn)行初始化,就可以提供公有的方法(setter)。封裝-封裝的實(shí)現(xiàn)08【例7-14】創(chuàng)建一個(gè)Person類,屬性分別是age和name,將屬性進(jìn)行封裝,并且進(jìn)行初始化,在控制臺(tái)打印出結(jié)果。代碼如下:publicclassPerson{//定義全局屬性,將屬性進(jìn)行封裝privateintage;privateStringname;//將屬性初始化,提供setter方法publicvoidsetAge(intage){this.age=age;if(age>20){System.out.println("大于20歲");}else{this.age=30;}}publicvoidsetName(Stringname){=name;}封裝-封裝的實(shí)現(xiàn)08//獲取到屬性的值,提供getter方法publicintgetAge(){returnage;}publicStringgetName(){returnname;}publicstaticvoidmain(String[]args){Personperson=newPerson();person.setAge(20);person.setName("小明");System.out.println("name:"+person.getName());System.out.println("age:"+person.getAge());}}
在上述代碼中,我們可以看出屬性進(jìn)行封裝,外部代碼無(wú)法直接訪問(wèn)這些屬性。通過(guò)提供getter和setter方法,外部代碼可以獲取和設(shè)置這些屬性的值,同時(shí)在setter方法中可以添加驗(yàn)證邏輯,確保屬性的值符合要求。小貼士:私有化private可以訪問(wèn)訪問(wèn),但是只能在本類中調(diào)用,在其他類中無(wú)法調(diào)用私有化private修飾的方法。封裝-封裝的好處08(1)提高代碼的安全性通過(guò)限制對(duì)屬性的直接訪問(wèn),可以防止外部代碼意外地修改或破壞類的內(nèi)部狀態(tài)。(2)提高代碼的可維護(hù)性封裝隱藏了類的內(nèi)部實(shí)現(xiàn)細(xì)節(jié),使得外部代碼只需要關(guān)注類提供的公共接口,而不需要了解(3)內(nèi)部的實(shí)現(xiàn)方式。如果需要修改類的內(nèi)部實(shí)現(xiàn),只需要修改類的內(nèi)部代碼,而不會(huì)影響到外部代碼的使用。(4)提高代碼的可擴(kuò)展性可以在不影響外部代碼的情況下,向類中添加新的屬性和方法,或者修改現(xiàn)有屬性和方法的實(shí)現(xiàn)。繼承-繼承的定義09繼承(extends)是指子類擁有其父類的非私有屬性和方法,使得子類對(duì)象(實(shí)例)具有其父類的特性和方法。父類被稱為基類或超類;子類也被稱為派生類。繼承是實(shí)現(xiàn)代碼重用的有力手段,能夠有效縮短開發(fā)周期、降低開發(fā)成本,實(shí)現(xiàn)代碼的復(fù)用和層次化的設(shè)計(jì)。繼承-繼承的作用09(1)代碼復(fù)用:子類可以直接使用父類中已經(jīng)實(shí)現(xiàn)的方法和屬性,避免重復(fù)編寫代碼。(2)層次結(jié)構(gòu)構(gòu)建:可以構(gòu)建具有層次關(guān)系的類體系,更好地組織和管理代碼。繼承-繼承的語(yǔ)法09使用“extends”關(guān)鍵字來(lái)實(shí)現(xiàn)繼承,語(yǔ)法結(jié)構(gòu)如下:訪問(wèn)修飾符class子類名稱extends父類名稱{//子類成員}繼承-繼承的語(yǔ)法09【例7-15】創(chuàng)建Animal類和Cat類,Animal類作為父類,Cat作為子類,Animal類的成員屬性name,成員方法是eat方法,Cat類的屬性name,成員方法是eat方法和sleep方法,使用繼承實(shí)現(xiàn),代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;
publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}//定義成員方法:eat方法publicvoideat(){System.out.println("Animal動(dòng)物吃東西");}}繼承-繼承的語(yǔ)法09publicclassCatextendsAnimal{@Overridepublicvoideat(){System.out.println("Cat貓吃貓糧");}//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}在上述代碼中,Cat類繼承了Animal類的name屬性和eat方法,同時(shí)又有自己特有sleep方法。通過(guò)繼承,避免了在Cat類中重復(fù)編寫eat方法的代碼,實(shí)現(xiàn)了代碼的復(fù)用。繼承-成員的訪問(wèn)09(1)子類可以訪問(wèn)父類的非私有的成員。(2)子類不可以直接訪問(wèn)父類的私有的成員,但是可以通過(guò)父類提供的公共或受保護(hù)的方法間接訪問(wèn)。繼承-構(gòu)造方法的調(diào)用順序09(1)當(dāng)創(chuàng)建子類對(duì)象時(shí),首先會(huì)調(diào)用父類的構(gòu)造方法,然后再調(diào)用子類的構(gòu)造方法。(2)如果子類的構(gòu)造方法中沒有顯式地調(diào)用父類的構(gòu)造方法,編譯器會(huì)自動(dòng)插入一條對(duì)父類無(wú)參構(gòu)造方法的調(diào)用。【例7-16】在7-15案例中使用繼承實(shí)現(xiàn),在同一個(gè)案例中實(shí)現(xiàn)構(gòu)造方法的調(diào)用順序,代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;publicAnimal(){}publicAnimal(Stringname){=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}
繼承-構(gòu)造方法的調(diào)用順序09publicclassCatextendsAnimal{publicCat(){}publicCat(Stringname){super(name);}@Overridepublicvoideat(){System.out.println("Cat貓吃貓糧");}//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}publicclassTestCat{publicstaticvoidmain(String[]args){Catcat=newCat();cat.eat();}}在上述代碼中,我們?cè)赥estCat類中可以看出在創(chuàng)建Cat子類的對(duì)象,先調(diào)用的是Animal父類的構(gòu)造方法,然后再次調(diào)用Cat子類的構(gòu)造方法繼承-方法重寫091.方法的定義某些情況下,父類提供的方法并不適用于子類。例如7-15的案例中Animal類提供的屬性和方法并不一定適用于Cat類中,動(dòng)物吃的東西是不同的,所以Cat類中eat方法需要考慮的是什么,Cat吃的是貓糧,所以需要覆蓋此方法,這個(gè)方法就是方法覆蓋。方法重寫是指子類中定義了一個(gè)與父類中同名、同參數(shù)列表和同返回類型的方法,從而覆蓋父類中該方法的實(shí)現(xiàn)。方法覆蓋也叫做方法重寫。2.方法重寫的規(guī)則與要求(1)方法名稱、參數(shù)列表和返回類型必須與父類中被重寫的方法完全一致。①方法名稱相同:確保在子類中重寫的方法與父類中的方法具有相同的名稱,這樣才能實(shí)現(xiàn)方法的覆蓋。②參數(shù)列表相同:參數(shù)的數(shù)量、類型和順序必須與父類中的方法完全一致。如果參數(shù)列表不同,那么這將是一個(gè)重載的方法,而不是重寫。③返回類型相同或子類型:在Java5及以上版本中,重寫的方法可以返回父類方法返回類型的子類型,但這不是嚴(yán)格意義上的相同返回類型。然而,返回類型為基本數(shù)據(jù)類型時(shí)必須完全相同。(2)訪問(wèn)權(quán)限不能比父類中被重寫的方法更嚴(yán)格,可以相同或更寬松。①例如,如果父類中的方法是公共的(public),那么子類中重寫的方法可以是公共的、受保護(hù)的(protected)或包訪問(wèn)權(quán)限(默認(rèn)訪問(wèn)權(quán)限,沒有特定關(guān)鍵字修飾),但不能是私有的(private)。②如果父類中的方法是受保護(hù)的,子類中重寫的方法可以是受保護(hù)的或公共的,但不能是私有的或包訪問(wèn)權(quán)限更嚴(yán)格的情況。繼承-方法重寫093.方法重寫的實(shí)現(xiàn)通過(guò)子類對(duì)象調(diào)用被重寫的方法時(shí),實(shí)際執(zhí)行的是子類中重寫后的方法,而不是父類中的原始方法。這是Java運(yùn)行時(shí)多態(tài)性的體現(xiàn)。多態(tài)在后續(xù)課程中詳細(xì)講解?!纠?-17】在7-16的案例中實(shí)現(xiàn)了繼承,在使用繼承的前提下,我們繼續(xù)實(shí)現(xiàn)方法重寫,代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;publicAnimal(){System.out.println("AnimalConstructor");}publicAnimal(Stringname){=name;}publicStringgetName(){returnname;}
繼承-方法重寫09publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}//定義成員方法:eat方法publicvoideat(){System.out.println("Animal動(dòng)物吃東西");}}publicclassCatextendsAnimal{publicCat(){System.out.println("CatConstructor");}
繼承-方法重寫09publicCat(Stringname){super(name);}/***子類重寫了父類的方法*/@Overridepublicvoideat(){System.out.println("Cat貓吃貓糧");}//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}在上述代碼中,Cat類中eat方法重寫了Animal類中的eat方法,以實(shí)現(xiàn)各自特定的聲音輸出,會(huì)執(zhí)行相應(yīng)的子類中重寫后的方法。@Override注解用于標(biāo)注此方法是重寫方法,僅做標(biāo)注作用,并無(wú)實(shí)際意義。小貼士:(1)子類的覆蓋方法不能使用比父類中被覆蓋方法更嚴(yán)格的訪問(wèn)權(quán)限,子類方法的可見性應(yīng)與父類保持一致或大于父類。(2)對(duì)于構(gòu)造函數(shù),在創(chuàng)建子類對(duì)象時(shí),程序執(zhí)行順序一定會(huì)先調(diào)用父類構(gòu)造函數(shù)后,才調(diào)用子類的構(gòu)造函數(shù)。如果子類沒有在代碼中明確調(diào)用父類構(gòu)造函數(shù),則父類必須提供無(wú)參構(gòu)造給子類隱式調(diào)用(若你不提供構(gòu)造函數(shù),程序自會(huì)提供并完成調(diào)用)。繼承-super關(guān)鍵字091.訪問(wèn)父類的構(gòu)造方法(1)在子類的構(gòu)造方法中,可以使用super()來(lái)調(diào)用父類的無(wú)參構(gòu)造方法;使用super(參數(shù)列表)來(lái)調(diào)用父類的有參構(gòu)造方法。(2)這確保在創(chuàng)建子類對(duì)象時(shí),先初始化父類的部分【例7-18】在7-17的案例中實(shí)現(xiàn)了方法重寫,在這個(gè)案例中我們繼續(xù)實(shí)現(xiàn)super關(guān)鍵字訪問(wèn)父類的構(gòu)造方法,代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;publicAnimal(){System.out.println("AnimalConstructor");}publicAnimal(Stringname){=name;}publicStringgetName(){returnname;}
繼承-super關(guān)鍵字09publicvoidsetName(Stringname){=name;}//定義成員方法:eat方法publicvoideat(){System.out.println("Animal動(dòng)物吃東西");}}publicclassCatextendsAnimal{publicCat(){super();System.out.println("CatConstructor");}publicCat(Stringname){super(name);}繼承-super關(guān)鍵字09/***子類重寫了父類的方法*/@Overridepublicvoideat(){System.out.println("Cat貓吃貓糧");}//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}在上述代碼中,我們可以看出Cat類中構(gòu)造方法中使用super關(guān)鍵字調(diào)用父類的構(gòu)造方法。super()調(diào)用的無(wú)參構(gòu)造方法,super(name)調(diào)用的是帶有一個(gè)參數(shù)的構(gòu)造方法。小貼士:super()調(diào)用的無(wú)參構(gòu)造方法,super(參數(shù)列表)調(diào)用的是相對(duì)應(yīng)參數(shù)的構(gòu)造方法,繼承-super關(guān)鍵字09(1)當(dāng)子類和父類有同名的成員變量時(shí),可以使用super.成員變量名
來(lái)訪問(wèn)父類的成員變量(2)當(dāng)子類重寫了父類的方法,而在子類的方法中又想調(diào)用父類被重寫的方法時(shí),可以使用super.方法名(參數(shù)列表)【例7-19】在7-18的案例中實(shí)現(xiàn)了方法重寫,實(shí)現(xiàn)super關(guān)鍵字訪問(wèn)方法和屬性,代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;publicAnimal(){System.out.println("AnimalConstructor");}publicAnimal(Stringname){=name;}publicStringgetName(){returnname;}繼承-super關(guān)鍵字09publicvoidsetName(Stringname){=name;}//定義成員方法:eat方法publicvoideat(){System.out.println("Animal動(dòng)物吃東西");}}publicclassCatextendsAnimal{publicCat(){super();System.out.println("CatConstructor");}publicCat(Stringname){super(name);}繼承-super關(guān)鍵字09/***子類重寫了父類的方法*/@Overridepublicvoideat(){super.setName("小動(dòng)物");super.eat();}//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}在上述代碼中,我們可以看出,在Cat類中eat方法中可以使用super關(guān)鍵字訪問(wèn)父類的屬性和父類的方法。繼承-final關(guān)鍵字091.修飾變量當(dāng)一個(gè)變量被final修飾時(shí),它成為一個(gè)常量。一旦被初始化,其值就不能再被改變?!纠?-19】創(chuàng)建一個(gè)類FinalDemo,實(shí)現(xiàn)final關(guān)鍵字修飾變量,代碼如下:publicclassFinalDemo{finalstaticintAGE=5;publicvoidtestFinal(){//一旦初始化,不能被修改//AGE=10;}}在上述代碼中,AGE被final修飾,并且進(jìn)行了初始化,成為常量,不能被修改,一旦修改就會(huì)編譯錯(cuò)誤。小貼士:final一般與static關(guān)鍵字一起使用,
成為靜態(tài)常量,一般靜態(tài)常量的名稱使用大寫,便于區(qū)分。繼承-final關(guān)鍵字092.修飾方法當(dāng)一個(gè)方法被final修飾時(shí),該方法不能被重寫。這通常用于確保某些關(guān)鍵方法的行為不被改變,或者在安全關(guān)鍵的代碼中使用?!纠?-20】創(chuàng)建一個(gè)類FinalDemo,實(shí)現(xiàn)final關(guān)鍵字修飾方法,代碼如下:publicclassFinalDemo{finalstaticintAGE=5;publicvoidtestFinal(){//一旦初始化,不能被修改//AGE=10;}publicfinalvoidtestFinal02(){System.out.println("final修飾的方法");}}publicclassFinalSonDemoextendsFinalDemo{//子類直接報(bào)錯(cuò)/*publicfinalvoidtestFinal02(){System.out.println("final修飾的方法");}*/}在上述代碼中,final修改的testDemo02方法,在子類中進(jìn)行重寫,直接編譯錯(cuò)誤。修飾類當(dāng)一個(gè)類被final修飾時(shí),該類不能被繼承。繼承-final關(guān)鍵字09【例7-21】創(chuàng)建一個(gè)類FinalDemo,實(shí)現(xiàn)final關(guān)鍵字修飾類,代碼如下:finalpublicclassFinalDemo{
}//子類繼承直接編譯錯(cuò)誤/*publicclassFinalSonDemoextendsFinalDemo{
}*/小貼士:經(jīng)常使用java.lang.String類就是final類,不能被其他類繼承。這可以確保類的安全性和穩(wěn)定性。在上述代碼中,final關(guān)鍵字修飾FinalDemo類,子類FinalSonDemo直接編譯錯(cuò)誤,F(xiàn)inalDemo類不能被繼承。多態(tài)-多態(tài)的定義和概念10多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦?。多態(tài)指的是同一操作作用于不同的對(duì)象可以有不同的表現(xiàn)形式。它允許父類引用指向子類對(duì)象,在運(yùn)行時(shí)根據(jù)實(shí)際對(duì)象的類型來(lái)決定調(diào)用哪個(gè)具體的方法。多態(tài)主要通過(guò)方法重寫和方法重載來(lái)實(shí)現(xiàn)。方法重寫是子類對(duì)父類中同名方法的重新實(shí)現(xiàn),而方法重載是在同一個(gè)類中定義多個(gè)同名方法但參數(shù)不同。多態(tài)使得程序具有更好的擴(kuò)展性和可維護(hù)性,提高了代碼的靈活性和復(fù)用性。多態(tài)-多態(tài)的優(yōu)點(diǎn)和作用10Java多態(tài)具有諸多優(yōu)點(diǎn)和重要作用。它增強(qiáng)了代碼的可擴(kuò)展性,當(dāng)有新的子類加入時(shí),無(wú)需修改現(xiàn)有的代碼,只需讓新子類遵循多態(tài)規(guī)則即可。提高了代碼的可維護(hù)性,使得代碼結(jié)構(gòu)更加清晰,易于理解和修改。多態(tài)還增加了代碼的靈活性,同一操作可以根據(jù)不同的對(duì)象類型產(chǎn)生不同的行為。同時(shí),促進(jìn)了代碼的復(fù)用,父類的方法可以被子類共享和重寫,減少了重復(fù)代碼的編寫,提高了開發(fā)效率,使程序更加高效和優(yōu)雅。多態(tài)-多態(tài)的實(shí)現(xiàn)方法10類的多態(tài)性是指一個(gè)類型擁有不同的表現(xiàn)形式。需要注意的是,只有擁有子類繼承或?qū)崿F(xiàn)的父類才具有多態(tài)的特征,在程序運(yùn)行時(shí)根據(jù)指定的子類表現(xiàn)出不同的狀態(tài)。1.向上轉(zhuǎn)型【例7-22】在7-15案例中實(shí)現(xiàn)了繼承,在本案例中中實(shí)現(xiàn)多態(tài)向上轉(zhuǎn)型,代碼如下:publicclassAnimal{//定義私有的屬性:nameprivateStringname;publicAnimal(){System.out.println("AnimalConstructor");}publicAnimal(Stringname){=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){=name;}多態(tài)-多態(tài)的實(shí)現(xiàn)方法10//定義成員方法:eat方法publicvoideat(){System.out.println("Animal動(dòng)物吃東西");}}publicclassCatextendsAnimal{publicCat(){super();System.out.println("CatConstructor");}publicCat(Stringname){super(name);}@Overridepublicvoideat(){System.out.println("Cat貓吃貓糧");}
多態(tài)-多態(tài)的實(shí)現(xiàn)方法10//子類中特有的方法publicvoidsleep(){System.out.println("貓?jiān)谒X");}}publicclassTestCat{publicstaticvoidmain(String[]args){//使用多態(tài)的方式創(chuàng)建對(duì)象Animalanimal=newCat();//調(diào)用的子類重寫父類的方法animal.eat();}}在上述代碼中,Cat對(duì)象具體來(lái)說(shuō)是Cat類型,在代碼中可以被聲明為Animal類型(父類類型),這種表現(xiàn)稱為向上轉(zhuǎn)型。向上轉(zhuǎn)型是程序的默認(rèn)行為,你不需要額外做些什么。這樣做可以讓你在不改變?cè)写a結(jié)構(gòu)的情況下,以更通用的方式使用或替換子類對(duì)象。在Java中,Object類是所有類的父類,你可以將任意對(duì)對(duì)象聲明為Object類型,但是不建議這么做。多態(tài)-多態(tài)的實(shí)現(xiàn)方法102.向下轉(zhuǎn)型多態(tài)的向下轉(zhuǎn)型是將父類引用轉(zhuǎn)換為子類引用,這個(gè)過(guò)程是強(qiáng)制的。語(yǔ)法結(jié)構(gòu)如下:子類類型
變量名=(子類類型)父類變量名【例7-23】在7-15案例中實(shí)現(xiàn)了繼承,在本案例中中實(shí)現(xiàn)多態(tài)向下轉(zhuǎn)型,代碼如下:publicclassTestCat{publicstaticvoidmain(String[]args){ //向下轉(zhuǎn)型Animalanimal=newAnimal();Catcat=(Cat)animal;}}在上述代碼中,首先,向下轉(zhuǎn)型必須建立在向上轉(zhuǎn)型的基礎(chǔ)上。只有先將子類對(duì)象向上轉(zhuǎn)型為父類引用后,才能進(jìn)行向下轉(zhuǎn)型操作。其次,在進(jìn)行向下轉(zhuǎn)型前,最好使用instanceof運(yùn)算符進(jìn)行判斷,以確保轉(zhuǎn)型的安全性。如果不進(jìn)行判斷而直接進(jìn)行向下轉(zhuǎn)型,且父類引用實(shí)際指向的對(duì)象并非目標(biāo)子類類型,那么在運(yùn)行時(shí)會(huì)拋出ClassCastException異常。抽象類和抽象方法-抽象類的定義與概述11在Java中,抽象類是使用abstract關(guān)鍵字修飾的類。抽象類中可以包含抽象方法和非抽象方法。語(yǔ)法結(jié)構(gòu)如下:訪問(wèn)修飾符abstractclass抽象類的名稱{//抽象方法//非抽象方法}抽象類和抽象方法-抽象類的特點(diǎn)11(1)不能被實(shí)例化:不能使用new關(guān)鍵字創(chuàng)建抽象類的對(duì)象。抽象類的存在主要是為了被繼承,由子類實(shí)現(xiàn)其抽象方法。(2)可以包含抽象方法和非抽象方法:抽象類可以有具體實(shí)現(xiàn)的方法,這些方法可以被子類繼承和使用。為子類提供通用的行為和屬性:抽象類可以定義一些通用的屬性和方法,供子類繼承和擴(kuò)展。抽象類和抽象方法-抽象類的實(shí)現(xiàn)方式11使用abstract關(guān)鍵字來(lái)定義抽象類。抽象類中可以包含抽象方法和非抽象方法,以及成員變量?!纠?-24】創(chuàng)建一個(gè)抽象類AbstractDemo,實(shí)現(xiàn)抽象類代碼如下://抽象類AbstractDemopublicabstractclassAbstractDemo{//抽象方法//非抽象方法}//子類繼承抽象類publicclassAbstractDemoSonextendsAbstractDemo{}publicclassAbstractDemoTest{publicstaticvoidmain(String[]args){AbstractDemoSonabstractDemoSon=newAbstractDemoSon();}}在上述代碼中,abstract關(guān)鍵字修飾的類叫做下抽象類,由于抽象類不能被實(shí)例化,所以不能直接使用new關(guān)鍵字創(chuàng)建抽象類的對(duì)象,抽象類AbstractDemo作為父類,AbstractDemoSon作為子類,AbstractDemoSon繼承AbstractDemo父類,抽象類AbstractDemo不能直接創(chuàng)建對(duì)象,可以通過(guò)子類AbstractDemoSon創(chuàng)建對(duì)象調(diào)用成員方法和屬性。小貼士:子類繼承抽象類,可以通過(guò)子類創(chuàng)建對(duì)象,也可以通過(guò)多態(tài)的向上轉(zhuǎn)型實(shí)現(xiàn)。抽象類可以繼承抽象類,這個(gè)類還是抽象類。抽象類和抽象方法-抽象類的作用11(1)提供一種通用的模板:抽象類可以為一組相關(guān)的子類提供一個(gè)通用的模板,定義一些共同的行為和屬性。(2)強(qiáng)制子類實(shí)現(xiàn)特定的方法:通過(guò)定義抽象方法,強(qiáng)制子類實(shí)現(xiàn)這些方法,確保子類具有特定的行為。(3)實(shí)現(xiàn)代碼復(fù)用:抽象類中的非抽象方法可以被子類復(fù)用,減少代碼重復(fù)。抽象類和抽象方法-抽象方法的定義與概述11在Java中,抽象方法是用abstract關(guān)鍵字修飾的只有方法簽名而沒有方法體的方法。抽象方法通常定義在抽象類中,也可以定義在接口里。語(yǔ)法接口如下:訪問(wèn)修飾符abstract返回值類型
方法名稱(參數(shù)列表);抽象類和抽象方法-抽象方法的實(shí)現(xiàn)方式11使用abstract關(guān)鍵字修飾的方法是抽象方法,如果這個(gè)類中有抽象方法,這個(gè)類一定是抽象類。【例7-25】創(chuàng)建一個(gè)抽象類AbstractDemo,在這個(gè)類實(shí)現(xiàn)抽象方法,代碼如下://抽象類publicabstractclassAbstractDemo{//抽象方法publicabstractvoidtestDemo();}//子類繼承抽象類publicclassAbstractDemoSonextendsAbstractDemo{@OverridepublicvoidtestDemo(){System.out.println("實(shí)現(xiàn)的抽象方法");}}抽象類和抽象方法-抽象方法的實(shí)現(xiàn)方式11//測(cè)試類publicclassAbstractDemoTest{publicstaticvoidmain(String[]args){AbstractDemoSonabstractDemoSon=newAbstractDemoSon();abstractDemoSon.testDemo();}}在上述代碼中,abstract關(guān)鍵字修飾的方法,叫做抽象方法,所以AbstractDemo類必須是抽象類,AbstractDemoSon子類繼承AbstractDem類,使用方法重寫,重寫了AbstractDemo類中的抽象方法,在AbstractDemoTest類中使用AbstractDemoSon子類創(chuàng)建對(duì)象,調(diào)用重寫之后的方法。小貼士:一個(gè)類中如果有抽象方法這個(gè)類必須是抽象類,抽象方法的存在是為了提供一個(gè)規(guī)范或契約,要求子類必須實(shí)現(xiàn)它。這使得不同的子類可以根據(jù)自身的特點(diǎn)和需求來(lái)具體實(shí)現(xiàn)抽象方法,從而實(shí)現(xiàn)多態(tài)性。抽象方法不能直接被調(diào)用,必須由具體的子類實(shí)現(xiàn)后,通過(guò)子類的對(duì)象來(lái)調(diào)用。它促進(jìn)了代碼的可擴(kuò)展性和可維護(hù)性,為
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 45861-2025重載齒輪箱加速疲勞試驗(yàn)技術(shù)規(guī)范
- 骨性關(guān)節(jié)炎課件
- 市場(chǎng)推廣活動(dòng)總結(jié)5篇
- 吉林省長(zhǎng)春市力旺中學(xué)2024-2025學(xué)年九年級(jí)上學(xué)期期末數(shù)學(xué)考試(含答案)
- 2025年湖北省武漢市七一華源中學(xué)九年級(jí)下學(xué)期中考模擬數(shù)學(xué)試卷(含部分答案)
- 漢字大小課件
- 快遞物流行業(yè)前瞻分析
- 高科技產(chǎn)業(yè)發(fā)展趨勢(shì)預(yù)測(cè)
- 新能源行業(yè)全球市場(chǎng)分析
- “人人愛上H5”-數(shù)字廣告設(shè)計(jì)知到智慧樹答案
- 2025年鄭州銀行招聘考試(行政能力測(cè)驗(yàn))歷年參考題庫(kù)含答案詳解(5套)
- 園藝生物技術(shù)應(yīng)用與發(fā)展
- 子癇患者護(hù)理查房
- 2025上海市八年級(jí)升九年級(jí)數(shù)學(xué)暑假提升講義:相似三角形壓軸題(六大題型)原卷版
- 2025年工業(yè)互聯(lián)網(wǎng)工程技術(shù)人員考核試題題庫(kù)及答案
- 農(nóng)行OCRM系統(tǒng)講解
- 醫(yī)療護(hù)理員職業(yè)技能競(jìng)賽試題及答案
- 2025年高端美食主題餐廳餐飲服務(wù)整體外包合同
- 體育課培訓(xùn)課件
- 網(wǎng)約車停運(yùn)損失賠償協(xié)議書范文
- 藥物化學(xué)(全套課件)
評(píng)論
0/150
提交評(píng)論