版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第4章類的封裝性、繼承性、多態(tài)性及接口1.封裝字段什么是封裝封裝:封裝又稱為信息隱藏。是指利用抽象數(shù)據(jù)類型將數(shù)據(jù)的操作結(jié)合在一起,使其構(gòu)成一個(gè)不可分割的獨(dú)立實(shí)體,盡可能隱藏內(nèi)部的細(xì)節(jié),只保留一些對外接口(可以理解為公開的方法和屬性),使其與外部發(fā)生聯(lián)系。比如手機(jī),手機(jī)的鍵盤,屏幕,聽筒等,就是其對外接口。你只需要知道如何按鍵就可以使用手機(jī),而不需要了解手機(jī)內(nèi)部的電路是如何工作的。封裝機(jī)制就像手機(jī)一樣只將對外接口暴露,而不需要用戶去了解其內(nèi)部實(shí)現(xiàn)。什么是封裝字段封裝字段:之前的操作中可發(fā)現(xiàn)所有類中的成員屬性都是直接通過實(shí)例化對象在類的外部調(diào)用。這樣是不安全的。最穩(wěn)妥的就是利用private實(shí)現(xiàn)成員屬性的封裝處理。而一旦使用了private封裝之后,是不允許外部對象進(jìn)行調(diào)用的,如果屬性需要被外部所使用,那么按照要求,定義屬性相應(yīng)的setter和getter方法。實(shí)現(xiàn)封裝字段以Person類中的intage為例:setter方法是設(shè)置屬性內(nèi)容;getter方法是取得屬性內(nèi)容;publicclassPerson{...... privateintage; //私有化年齡字段......}publicvoidsetAge(intage){this.age=age; //設(shè)置字段值,注意:無返回值,有參數(shù)(參數(shù)的數(shù)據(jù)類型)}publicintgetAge(){returnthis.age; //獲得字段值,注意:有返回值(返回值的數(shù)據(jù)類型),無參數(shù)。}封裝字段練習(xí)設(shè)計(jì)一個(gè)名為Person的類表示人來,這個(gè)類包括:一個(gè)名為name的String型的private成員變量;一個(gè)名為age的int型的private成員變量;一個(gè)名為info()的public方法實(shí)現(xiàn)在控制臺(tái)打印信息(格式為:我叫{name},我的年齡是{age}),返回值為void型。創(chuàng)建人類的無參構(gòu)造函數(shù)。創(chuàng)建name和age為指定值的有參構(gòu)造函數(shù)。封裝name和age,增加屬性的getter和setter方法。編寫一個(gè)測試程序,創(chuàng)建兩個(gè)Person對象:一個(gè)人類的name=小A,age=30,另一個(gè)人類的name=小紅,age=18。分別調(diào)用這兩個(gè)對象的info方法執(zhí)行打印信息功能。封裝字段練習(xí)publicclassPerson{ //無參的構(gòu)造函數(shù) publicPerson(){} //有參的構(gòu)造函數(shù) publicPerson(Stringname,intage){ =name; this.age=age; } privateStringname; //姓名 publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;} privateintage; //年齡 publicintgetAge(){returnage;} publicvoidsetAge(intage){this.age=age;} //個(gè)人介紹方法 publicvoidinfo(){ System.out.println("我叫"+name+",我的年齡是"+age); }}編寫Person類:封裝字段練習(xí)publicstaticvoidmain(String[]args){//聲明并示例對象Personp1=newPerson();p1.setName(“小A”);p1.setAge(30);Personp2=newPerson("小紅",18);//調(diào)用方法();();}編寫mian主程序:第4章類的封裝性、繼承性、多態(tài)性及接口2.繼承實(shí)現(xiàn)什么是繼承繼承:繼承是面向?qū)ο笞铒@著的一個(gè)特性。繼承是從已有的類中派生出新的類,新的類能吸收已有類的數(shù)據(jù)屬性和行為,并能擴(kuò)展新的能力。繼承允許我們根據(jù)一個(gè)類來定義另一個(gè)類,這使得創(chuàng)建和維護(hù)應(yīng)用程序變得更容易。同時(shí)也有利于重用代碼和節(jié)省開發(fā)時(shí)間。什么是繼承舉個(gè)例子:人類(Person)有姓名和年齡屬性,學(xué)生類(Student)有姓名、年齡、學(xué)號(hào)和班級(jí)屬性。那么當(dāng)我們創(chuàng)建學(xué)生類時(shí),不需要完全重新編寫新的數(shù)據(jù)成員和成員函數(shù),只需要設(shè)計(jì)一個(gè)新的類,繼承了已有的類的成員即可。這個(gè)已有的類被稱為的基類/父類,這個(gè)新的類被稱為派生類/子類?;?父類:也可以理解成生活中的父親,自身所擁有的一些屬性方法會(huì)被繼承;派生類/子類:也就是生活中的兒子,自己去繼承了基類/父類的屬性和方法,當(dāng)然自身也會(huì)擁有自己的屬性和方法。實(shí)現(xiàn)繼承在Java之中,可以使用
extends關(guān)鍵字
要實(shí)現(xiàn)繼承的關(guān)系,實(shí)現(xiàn)語法:子類又被稱為派生類;父類又被稱為超類(SuperClass)class子類extends父類{}繼承練習(xí)在人類(Person)基礎(chǔ)上,再定義一個(gè)學(xué)生類,學(xué)生類存在以下成員:一個(gè)名為name的String型的private成員變量,并封裝getter和setter方法;一個(gè)名為age的int型的private成員變量,并封裝getter和setter方法;一個(gè)名為id的String型的private成員變量,并封裝getter和setter方法;一個(gè)名為className的String型的private成員變量,并封裝getter和setter方法;編寫一個(gè)測試程序,創(chuàng)建兩個(gè)Student對象:一個(gè)人類的name=小A,age=30,id=202301,className=Java1班,另一個(gè)人類的name=小紅,age=18,id=202302,className=Java2班。封裝字段練習(xí)publicclassPerson{ //無參的構(gòu)造函數(shù) publicPerson(){} //有參的構(gòu)造函數(shù) publicPerson(Stringname,intage){ =name; this.age=age; } privateStringname; //姓名 publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;} privateintage; //年齡 publicintgetAge(){returnage;} publicvoidsetAge(intage){this.age=age;} //個(gè)人介紹方法 publicvoidinfo(){ System.out.println("我叫"+name+",我的年齡是"+age); }}編寫Person類:封裝字段練習(xí)//學(xué)生類publicclassStudentextendsPerson{ publicStudent(Stringname,intage,Stringid,StringclassName){ super(name,age); this.id=id; this.className=className; }
privateStringid; //學(xué)號(hào) publicStringgetId(){returnid;} publicvoidsetId(Stringid){this.id=id;} privateStringclassName; //班級(jí)名稱 publicStringgetClassName(){returnclassName;} publicvoidsetClassName(StringclassName){this.className=className;}}編寫Student類:封裝字段練習(xí)publicstaticvoidmain(String[]args){//聲明并示例對象Students1=newStudent("小A",30,"202301","Java1班");Students2=newStudent("小紅",18,"202302","Java2班");//調(diào)用方法();();}編寫mian主程序:第4章類的封裝性、繼承性、多態(tài)性及接口3.繼承限制繼承限制繼承:面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)主要特征,是使用已經(jīng)定義的類作為基礎(chǔ)定義新類的技術(shù)。廣義地說,繼承是指能夠直接獲得已有類的性質(zhì)和特征,而不要重復(fù)定義它們,因此繼承是指類之間共享屬性和操作的機(jī)制。在Java程序中,一個(gè)類可以通過繼承另一個(gè)類,直接獲取該類的屬性和方法。支持多重繼承結(jié)構(gòu),父類還可以繼承另外一個(gè)類,Java中最大的父類是Object,如果一個(gè)類沒有顯式地標(biāo)明繼承自哪個(gè)父類,默認(rèn)都是Object的子類。雖然繼承可以進(jìn)行類功能的擴(kuò)充,但是其在定義的時(shí)候也是會(huì)存在若干種限制的。繼承限制限制一:一個(gè)子類只能夠繼承一個(gè)父類,存在單繼承局限。錯(cuò)誤的寫法:以上操作稱為多重繼承,實(shí)際上以上的做法就是希望一個(gè)子類,可以同時(shí)繼承多個(gè)類的功能,但是以上的語法不支持而已,可以換種方式完成同樣的操作。classA{}classB{}classCextendsA,B{}//一個(gè)子類繼承了兩個(gè)父類繼承限制限制一:一個(gè)子類只能夠繼承一個(gè)父類,存在單繼承局限。正確的寫法:C實(shí)際上是屬于(孫)子類,這樣一來就相當(dāng)于B類繼承了A類的全部方法,而C類又繼承了A和B類的方法,這種操作稱為多層繼承。繼承具有傳遞性:子類可以繼承直接父類和間接父類的所有功能。Java之中只允許多層繼承,不允許多重繼承,Java存在單繼承局限。classA{}classBextendsA{}classCextendsB{}繼承限制限制二:在一個(gè)子類繼承的時(shí)候,實(shí)際上會(huì)繼承父類之中的所有操作(屬性、方法),但是需要注意的是,對于所有的非私有(noprivate)操作屬于顯式繼承(可以直接利用對象操作),而所有的私有操作屬于隱式繼承(間接完成)。繼承限制該示例無法運(yùn)行,因?yàn)樵贐類print方法中對于A類的msg這個(gè)私有屬性發(fā)現(xiàn)無法直接進(jìn)行訪問,但是卻發(fā)現(xiàn)可以通過setter、getter方法間接的進(jìn)行操作??偨Y(jié):繼承限制限制三:在繼承關(guān)系之中,如果要實(shí)例化子類對象,會(huì)默認(rèn)先調(diào)用父類構(gòu)造,為父類之中的屬性初始化,之后再調(diào)用子類構(gòu)造,為子類之中的屬性初始化。默認(rèn)情況下,子類會(huì)找到父類之中的無參構(gòu)造方法;如果父類沒有無參構(gòu)造,則子類必須通過super()調(diào)用指定參數(shù)的構(gòu)造方法;super(參數(shù)列表)繼承限制運(yùn)行結(jié)果:實(shí)例化子類對象,會(huì)默認(rèn)先執(zhí)行父類構(gòu)造,調(diào)用父類構(gòu)造的方法體執(zhí)行,而后再實(shí)例化子類對象,調(diào)用子類的構(gòu)造方法。對于子類的構(gòu)造而言,就相當(dāng)于隱含了一個(gè)super()的形式。*************************#################繼承限制棧屬性方法
this78000Hsuper63000H子類對象78000HTC178000H屬性方法
this63000HsuperObject父類對象63000H堆實(shí)例化子類對象時(shí),要先實(shí)例化父類對象。在實(shí)例化過程中,Java會(huì)調(diào)用子類的構(gòu)造方法,此時(shí)會(huì)先調(diào)用父類的構(gòu)造方法創(chuàng)建父類對象,接著創(chuàng)建子類對象。每個(gè)對象會(huì)自動(dòng)增加兩個(gè)屬性this和super,其中this屬性指向自身首地址、super指向父類對象的首地址(其中方法指向方法區(qū)對應(yīng)方法的首地址)。在調(diào)用父類構(gòu)造方法時(shí),會(huì)自動(dòng)調(diào)用參數(shù)類型、個(gè)數(shù)一樣的父類的構(gòu)造方法,如沒有帶參數(shù)自動(dòng)調(diào)用沒有帶參數(shù)的父類的構(gòu)造方法等等;如果需要明確指定調(diào)用父類某個(gè)構(gòu)造方法,或者子類需要調(diào)用父類的構(gòu)造方法時(shí),用關(guān)鍵字super進(jìn)行訪問,但要求必須是子類構(gòu)造方法中的第一語句(和this一樣);訪問子類繼承父類的成員屬性和方法,與訪問子類自身定義的屬性和方法一樣。繼承限制限制四:類的向下向上轉(zhuǎn)型子類對象可以賦值給父類類型,反之不行;在示例中,Person為父類、Student為子類,我們可以:但不能定義Teacher對象、用Person實(shí)例化,下面定義時(shí)錯(cuò)誤的:總結(jié):可以定義一個(gè)父類對象、用子類實(shí)例化;不能定義一個(gè)子類對象、用父類實(shí)例化。StudentTC1=newStudent();PersonTC2=newStudent(); //定義一個(gè)父類對象,用子類實(shí)例化PersonTC21=(Student)TC2; //由于TC2本身就是一個(gè)子類對象PersonTC4=newPerson(); StudentTC1=(Student)TC4; //TC4無法通過強(qiáng)制類型轉(zhuǎn)換賦給Student對象StudentTC3=newPerson();第4章類的封裝性、繼承性、多態(tài)性及接口4.方法重寫主講人:_________
什么是方法重寫重寫:在類繼承中,子類可以修改從父類繼承來的方法,也就是說子類能創(chuàng)建一個(gè)與父類方法有不同功能的方法,但具有相同的名稱、返回值類型、參數(shù)列表。如果在新類中定義一個(gè)方法,其名稱、返回值類型和參數(shù)列表正好與父類中的相同,那么,新方法被稱做覆蓋舊方法。參數(shù)列表又叫參數(shù)簽名,包括參數(shù)的類型、參數(shù)的個(gè)數(shù)和參數(shù)的順序,只要有一個(gè)不同就叫做參數(shù)列表不同。被覆蓋的方法在子類中只能通過super調(diào)用。注意:覆蓋不會(huì)刪除父類中的方法,而是對子類的實(shí)例隱藏,暫時(shí)不使用。方法重寫練習(xí)在人類(Person)基礎(chǔ)上,再定義一個(gè)學(xué)生類,學(xué)生類存在以下成員::一個(gè)名為name的String型的private成員變量,并封裝getter和setter方法;一個(gè)名為age的int型的private成員變量,并封裝getter和setter方法;一個(gè)名為id的String型的private成員變量,并封裝getter和setter方法;一個(gè)名為className的String型的private成員變量,并封裝getter和setter方法;一個(gè)名為info()的public方法實(shí)現(xiàn)在控制臺(tái)打印信息(格式為:我叫{name},我的年齡是{age},我來在{className},我的學(xué)號(hào)是{id}),返回值為void型;編寫一個(gè)測試程序,創(chuàng)建兩個(gè)Student對象:一個(gè)人類的name=小A,age=30,id=202301,className=Java1班,另一個(gè)人類的name=小紅,age=18,id=202302,className=Java2班。方法重寫練習(xí)publicclassPerson{ //無參的構(gòu)造函數(shù) publicPerson(){} //有參的構(gòu)造函數(shù) publicPerson(Stringname,intage){ =name; this.age=age; } privateStringname; //姓名 publicStringgetName(){returnname;} publicvoidsetName(Stringname){=name;} privateintage; //年齡 publicintgetAge(){returnage;} publicvoidsetAge(intage){this.age=age;} //個(gè)人介紹方法 publicvoidinfo(){ System.out.println("我叫"+name+",我的年齡是"+age); }}編寫Person類:方法重寫練習(xí)//學(xué)生類publicclassStudentextendsPerson{ publicStudent(Stringname,intage,Stringid,StringclassName){ super(name,age); this.id=id; this.className=className; }
privateStringid; //學(xué)號(hào) publicStringgetId(){returnid;} publicvoidsetId(Stringid){this.id=id;} privateStringclassName; //班級(jí)名稱 publicStringgetClassName(){returnclassName;} publicvoidsetClassName(StringclassName){this.className=className;} //重寫父類的方法——個(gè)人介紹方法 publicvoidinfo(){ Stringmsg="我叫"+getName()+",我的年齡是"+getAge()+",我來在"+className+",我的學(xué)號(hào)是"+id; System.out.println(msg); }}編寫Student類:方法重寫練習(xí)publicstaticvoidmain(String[]args){//聲明并示例對象Students1=newStudent("小A",30,"202301","Java1班");Students2=newStudent("小紅",18,"202302","Java2班");//調(diào)用方法();();}編寫mian主程序:重寫和重載的不同方法重寫要求參數(shù)列表必須一致,而方法重載要求參數(shù)列表必須不一致。方法重寫要求返回類型必須一致,方法重載對此沒有要求。方法重寫只能用于子類覆蓋父類的方法,方法重載用于同一個(gè)類中的所有方法(包括從父類中繼承而來的方法)。方法重寫對方法的訪問權(quán)限和拋出的異常有特殊的要求,而方法重載在這方面沒有任何限制。父類的一個(gè)方法只能被子類重寫一次,而一個(gè)方法可以在所有的類中可以被重載多次。第4章類的封裝性、繼承性、多態(tài)性及接口5.final關(guān)鍵字主講人:_________
什么是finalfinal關(guān)鍵字:final是Java中的一個(gè)關(guān)鍵字,可以用于修飾類、方法和變量。當(dāng)一個(gè)類被聲明為final時(shí),它意味著該類不能被繼承。當(dāng)一個(gè)方法被聲明為final時(shí),它意味著該方法不能被重寫。當(dāng)一個(gè)變量被聲明為final時(shí),它意味著該變量的值不能被修改。final修飾類當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承。final類中的成員變量可以根據(jù)需要設(shè)為final,但是要注意final類中的所有成員方法都會(huì)被隱式地指定為final方法。在使用final修飾類的時(shí)候,要注意謹(jǐn)慎選擇,除非這個(gè)類真的在以后不會(huì)用來繼承擴(kuò)展或者出于安全的考慮,盡量不要將類設(shè)計(jì)為final類。final修飾方法final修飾的方法無法被覆蓋。使用final方法的原因有兩個(gè):第一個(gè)原因是把方法鎖定,以防任何繼承類修改它的含義;第二個(gè)原因是效率。在早期的Java實(shí)現(xiàn)版本中,會(huì)將final方法轉(zhuǎn)為內(nèi)嵌調(diào)用。但是如果方法過于龐大,可能看不到內(nèi)嵌調(diào)用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進(jìn)行這些優(yōu)化了;類的private方法會(huì)隱式地被指定為final方法。final修飾變量通過示例可以了解到:如果修飾的是基本數(shù)據(jù)類型,則該引用為常量,該值無法修改;如果修飾的是引用數(shù)據(jù)類型,比如對象、數(shù)組,則該對象、數(shù)組本身可以修改,但指向該對象或數(shù)組的地址的引用不能修改。如果修飾的是類的成員變量,則必須當(dāng)場賦值,否則編譯會(huì)報(bào)錯(cuò)。classPerson{Stringname="zs";//3.此處不賦值會(huì)報(bào)錯(cuò)//finalintage;finalintage=10;}publicclassDemo01{publicstaticvoidmain(String[]args){//1.基本數(shù)據(jù)類型為常量,無法修改finalinti=9;//i=10;
//2.地址不能修改,但是對象本身的屬性可以修改finalPersonp=newPerson();="lisi";finalint[]arr={1,2,3,45};arr[3]=999;//arr=newint[]{1,4,56,78};}}第4章類的封裝性、繼承性、多態(tài)性及接口6.多態(tài)實(shí)現(xiàn)主講人:_________
什么是多態(tài)多態(tài):多態(tài)性就是同一操作作用于不同的對象,可以有不同的解釋,產(chǎn)生不同的執(zhí)行結(jié)果。換句話說,實(shí)際上就是同一個(gè)類型的實(shí)例調(diào)用"相同"的方法,產(chǎn)生的結(jié)果是不同的。這里的"相同"打上雙引號(hào)是因?yàn)檫@里的相同的方法僅僅是看上去相同的方法,實(shí)際上它們調(diào)用的方法是不同的。多態(tài)可使代碼變得簡潔,使父類可以引用子類,使應(yīng)用程序不必為每一個(gè)派生類編寫功能調(diào)用,只需要對抽象基類進(jìn)行處理即可。大大提高程序的可復(fù)用性。多態(tài)實(shí)現(xiàn)舉個(gè)例子:一只雞可以做成白切雞、豉油雞、吊燒雞、茶油雞、鹽焗雞、蔥油雞、手撕雞、清蒸雞、叫花雞、啤酒雞、口水雞、香菇滑雞、鹽水雞、啫啫滑雞、雞公煲等等。首先,我們先給出一只雞:publicclassChicken{publicvoideat(){System.out.println("這是一只雞");}}多態(tài)實(shí)現(xiàn)實(shí)現(xiàn)條件一:子類必須繼承父類要實(shí)現(xiàn)多態(tài),那么必定有一個(gè)作為"抽象"類(父類)來定義“行為”,以及若干個(gè)作為"具體"類(子類)來呈現(xiàn)不同的行為形式或形態(tài)。所以我們給出的一個(gè)具體類——白切雞類、口水雞://白切雞publicclassBaiqieChickenextendsChicken{
}//口水雞publicclassKoushuiChickenextendsChicken{
}多態(tài)實(shí)現(xiàn)實(shí)現(xiàn)條件二:必須有重寫簡單地理解就是重新定義的父類方法,使得父類和子類對同一行為的表現(xiàn)形式各不相同。我們用白切雞類來舉個(gè)栗子——白切雞類、口水雞://白切雞publicclassBaiqieChickenextendsChicken{publicvoideat(){System.out.println("這是白切雞");}}//口水雞publicclassKoushuiChickenextendsChicken{publicvoideat(){System.out.println("這是口水雞");}}這樣就實(shí)現(xiàn)了重寫,雞類跟白切雞類與口水雞在eat()方法中定義的行為不同。多態(tài)實(shí)現(xiàn)實(shí)現(xiàn)條件三:父類引用指向子類對象因?yàn)楦割悓τ谧宇悂碚f,是屬于“抽象”的層面,子類是“具體”的層面?!俺橄蟆笨梢蕴峁┙涌诮o“具體”實(shí)現(xiàn),但是“具體”憑什么來引用“抽象”呢?而且“子類引用指向父類對象”是不符合“依賴倒置原則”的。Chickenc=newChicken();c.eat();c=newBaiqieChicken();c.eat();c=newKoushuiChicken();c.eat();運(yùn)行結(jié)果:這是一只雞這是白切雞這是口水雞為什么需要多態(tài)?優(yōu)點(diǎn):多態(tài)的出現(xiàn)大大的提高程序的擴(kuò)展性。消除類型之間的耦合關(guān)系,也就是實(shí)現(xiàn)低耦合。弊端:多態(tài)不能調(diào)用子類的特有方法,需要使用到強(qiáng)制類型轉(zhuǎn)換。第4章類的封裝性、繼承性、多態(tài)性及接口7.抽象類的定義和實(shí)現(xiàn)主講人:_________
回答:在了解抽象類之前,先來了解一下抽象方法。抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實(shí)現(xiàn)。抽象方法的聲明格式為:注意:抽象方法必須用abstract關(guān)鍵字進(jìn)行修飾。什么是抽象類提問:什么是抽象類?abstract返回值類型方法名稱(形參列表);例如:abstractvoidfun();//無參數(shù)無返回值的抽象方法回答:在當(dāng)父類的一個(gè)方法對于多個(gè)子類都要重寫時(shí),那父類的這個(gè)方法就沒有寫的必要了,所以提高編碼效率,直接一個(gè)abstract方法名();。抽象方法沒有具體實(shí)現(xiàn),本體不能調(diào)用,普通類都可以實(shí)例化(利用new,等等),如果創(chuàng)建這個(gè)類的對象,并調(diào)用了這個(gè)方法,那就不會(huì)有一個(gè)合理結(jié)果。因此,需要有一個(gè)特殊的類,來定義抽象方法——抽象類什么是抽象類提問:為什么需要抽象方法?抽象類實(shí)現(xiàn)抽象類定義:抽象類是抽象方法與非抽象方法的集合,抽象類要使用abstract關(guān)鍵字聲明。語法格式:例如:創(chuàng)建一個(gè)用戶抽象類【修飾符】abstractclass類名{ //成員(構(gòu)造方法、普通方法、static方法、抽象方法、常量和變量等)}publicabstractclassUser{publicabstractvoidlogin();}抽象類實(shí)現(xiàn)抽象類使用:抽象類無法實(shí)例化,抽象類是專門給子類繼承的。final與abstract無法聯(lián)合使用。抽象類雖然無法被實(shí)例化,但是抽象類有構(gòu)造方法,因?yàn)槌橄箢愑凶约旱囊恍傩浴_@個(gè)構(gòu)造方法是給子類使用的。子類必須實(shí)現(xiàn)抽象類全部的抽象方法,而如果子類無法實(shí)現(xiàn)父類全部的抽象方法,則該子類只能定義為一個(gè)抽象父類的抽象子類。例如:創(chuàng)建一個(gè)學(xué)生類子類publicclassStudentextendsUser{publicabstractvoidlogin(){System.out.println("學(xué)生登錄");}}抽象類和普通類的區(qū)別抽象方法必須為public或者protected(因?yàn)槿绻麨閜rivate,則不能被子類繼承,子類便無法實(shí)現(xiàn)該方法),缺省情況下默認(rèn)為public。抽象類不能用來創(chuàng)建對象,即不能new。如果一個(gè)類繼承于一個(gè)抽象類,則子類必須實(shí)現(xiàn)父類的抽象方法。如果子類沒有實(shí)現(xiàn)父類的抽象方法,則必須將子類也定義為為abstract類。在其他方面,抽象類和普通的類并沒有區(qū)別。第4章類的封裝性、繼承性、多態(tài)性及接口8.接口的定義和實(shí)現(xiàn)主講人:_________
什么是接口接口:接口(interface)是抽象方法和常量值的定義的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變量和方法的實(shí)現(xiàn)。接口實(shí)現(xiàn)定義接口:[public]interfaceinterface_name[extendsinterface1_name[,interface2_name,…]]{//接口體,其中可以包含定義常量和聲明方法[public][static][final]typeconstant_name=value; //定義常量[public][abstract]returnTypemethod_name(parameter_list); //聲明方法}interface_name表示接口的名稱。接口名應(yīng)與類名采用相同的命名規(guī)則,即如果僅從語法角度來看,接口名只要是合法的標(biāo)識(shí)符即可。如果要遵守Java可讀性規(guī)范,則接口名應(yīng)由多個(gè)有意義的單詞連綴而成,每個(gè)單詞首字母大寫,單詞與單詞之間無需任何分隔符。extends表示接口的繼承關(guān)系;注意:一個(gè)接口可以有多個(gè)直接父接口,但接口只能繼承接口,不能繼承類。接口實(shí)現(xiàn)示例:定義接口publicinterfaceMylnterface{//Stringname; //不合法,變量name必須初始化intage=20; //合法,等同于publicstaticfinalintage=20;voidgetInfo(); //方法聲明,等同于publicabstractvoidgetInfo();}具有public訪問控制符的接口,允許任何類使用;沒有指定public的接口,其訪問將局限于所屬的包。方法的聲明不需要其他修飾符,在接口中聲明的方法,將隱式地聲明為公有的(public)和抽象的(abstract)。在Java接口中聲明的變量其實(shí)都是常量,接口中的變量聲明,將隱式地聲明為public、static和final,即常量,所以接口中定義的變量必須初始化。接口沒有構(gòu)造方法,不能被實(shí)例化。接口實(shí)現(xiàn)使用接口:<public>class<class_name>[extendssuperclass_name][implementsinterface[,interface…]]{//主體}接口的主要用途就是被實(shí)現(xiàn)類實(shí)現(xiàn),一個(gè)類可以實(shí)現(xiàn)一個(gè)或多個(gè)接口,繼承使用extends關(guān)鍵字,實(shí)現(xiàn)則使用implements關(guān)鍵字。因?yàn)橐粋€(gè)類可以實(shí)現(xiàn)多個(gè)接口,這也是Java為單繼承靈活性不足所作的補(bǔ)充。類實(shí)現(xiàn)接口的語法格式如下:接口實(shí)現(xiàn)示例:實(shí)現(xiàn)接口publicclassMyClassimplementsMylnterface{publicvoidgetInfo(){System.out.println("實(shí)現(xiàn)方法");}}類使用implements關(guān)鍵字實(shí)現(xiàn)接口。在類聲明中,Implements關(guān)鍵字放在class聲明后面。一個(gè)類只能繼承一個(gè)類,但是能實(shí)現(xiàn)多個(gè)接口。類在實(shí)現(xiàn)接口的方法時(shí),不能拋出強(qiáng)制性異常,只能在接口中,或者繼承接口的抽象類中拋出該強(qiáng)制性異常。類在重寫方法時(shí)要保持一致的方法名,并且應(yīng)該保持相同或者相兼容的返回值類型。如果實(shí)現(xiàn)接口的類是抽象類,那么就沒必要實(shí)現(xiàn)該接口的方法。第4章類的封裝性、繼承性、多態(tài)性及接口9.接口的作用主講人:_________
接口作用接口泛指實(shí)體把自己提供給外界的一種抽象化物(可以為另一實(shí)體),用以由內(nèi)部操作分離出外部溝通方法,使其能被內(nèi)部修改而不影響外界其他實(shí)體與其交互的方式。接口的作用就是把使用接口的人和實(shí)現(xiàn)接口的人分開,實(shí)現(xiàn)接口的人不必要關(guān)心誰去使用,而使用接口的人也不用關(guān)心誰實(shí)現(xiàn)的接口,由接口將他們聯(lián)系在一起。接口是一個(gè)標(biāo)準(zhǔn),是一個(gè)約定,而不是一種實(shí)現(xiàn),接口的目的是為了規(guī)范實(shí)現(xiàn)類。接口優(yōu)勢優(yōu)勢1接口實(shí)現(xiàn)類的解耦:publicinterfaceMyInterface{publicvoiddoSomething();}publicclassMyClass1implementsMyInterface{//實(shí)現(xiàn)doSomething()方法}publicclassMyClass2implementsMyInterface{//實(shí)現(xiàn)doSomething()方法}publicclassTest{publicstaticvoidmain(String[]args){//可以通過接口類型的變量指向不同的實(shí)現(xiàn)類對象MyInterfacemyObj=newMyClass1();myObj.doSomething();myObj=newMyClass2();myObj.doSomething();}}接口是一種約定,它界定了實(shí)現(xiàn)類需要遵循的規(guī)范。通過接口,實(shí)現(xiàn)類與實(shí)現(xiàn)類之間可以完全解耦,可以方便地替換和修改實(shí)現(xiàn)類,而不會(huì)影響其他類的調(diào)用。接口優(yōu)勢優(yōu)勢2接口拓展的靈活性:publicinterfaceMyInterface{publicvoiddoSomething();}publicinterfaceMyInterfaceExextendsMyInterface{//繼承現(xiàn)有接口,增加新的方法publicvoiddoSomethingElse();}publicclassMyClassimplementsMyInterfaceEx{//實(shí)現(xiàn)新增方法publicvoiddoSomething(){}publicvoiddoSomethingElse(){}}當(dāng)業(yè)務(wù)邏輯發(fā)生變化時(shí),添加新的業(yè)務(wù)類,并繼承原有業(yè)務(wù)類,由于繼承是靜態(tài)的一種實(shí)現(xiàn),不太靈活化的實(shí)現(xiàn)結(jié)構(gòu),采用接口實(shí)現(xiàn)的方式,接口的拓展可以輕易添加新的實(shí)現(xiàn)方法而保持原有的接口不被影響。接口優(yōu)勢優(yōu)勢3接口的多繼承:publicinterfaceInterfaceA{publicvoidmethodA();}publicinterfaceInterfaceB{publicvoidmethodB();}publicclassMyClassimplementsInterfaceA,InterfaceB{publicvoidmethodA(){}publicvoidmethodB(){}}Java中,一個(gè)類可以繼承一個(gè)類,但卻可以實(shí)現(xiàn)多個(gè)接口,所以接口可以實(shí)現(xiàn)多繼承的效果。通過實(shí)現(xiàn)多個(gè)接口,可以讓實(shí)現(xiàn)類具備多種不同的行為和功能。接口與類相似點(diǎn)一個(gè)接口可以有多個(gè)方法。接口文件保存在.java結(jié)尾的文件中,文件名使用接口名。接口的字節(jié)碼文件保存在.class結(jié)尾的文件中。接口相應(yīng)的字節(jié)碼文件必須在與包名稱相匹配的目錄結(jié)構(gòu)中。接口與類的區(qū)別接口不能用于實(shí)例化對象。接口沒有構(gòu)造方法。接口中所有的方法必須是抽象方法,Java8之后接口中可以使用default關(guān)鍵字修飾的非抽象方法。接口不能包含成員變量,除了static和final變量。接口不是被類繼承了,而是要被類實(shí)現(xiàn)。接口支持多繼承。抽象類和接口的區(qū)別抽象類中的方法可以有方法體,就是能實(shí)現(xiàn)方法的具體功能,但是接口中的方法不行。抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是publicstaticfinal類型的。接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法(用static修飾的方法),而抽象類是可以有靜態(tài)代碼塊和靜態(tài)方法。一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。publicabstractclassUser{publicvoidmsg(){System.out.println(“有方法體”);}publicabstractvoidlogin();Stringname=“成員變量”;static{System.out.println(“靜態(tài)代碼塊”);}}publicinterfaceUser{voidlogin();publicstaticfinalStringname=“成員變量”;}抽象類接口VS什么時(shí)候使用抽象類和接口如果你擁有一些方法并且想讓它們中的一些有默認(rèn)實(shí)現(xiàn),那么使用抽象類吧。如果你想實(shí)現(xiàn)多重繼承,那么你必須使用接口。由于Java不支持多繼承,子類不能夠繼承多個(gè)類,但可以實(shí)現(xiàn)多個(gè)接口。因此你就可以使用接口來解決它。如果基本功能在不斷改變,那么就需要使用抽象類。如果不斷改變基本功能并且使用接口,那么就需要改變所有實(shí)現(xiàn)了該接口的類。接口的應(yīng)用適合框架開發(fā)在Java的框架開發(fā)中,接口占據(jù)著非常重要的地位。比如Servlet、JDBC接口等,這些接口為框架提供了標(biāo)準(zhǔn)的約定和規(guī)則,并在其基礎(chǔ)上進(jìn)行實(shí)現(xiàn)和拓展。開發(fā)者可以通過實(shí)現(xiàn)這些接口,來創(chuàng)建自己的實(shí)現(xiàn)類,再與框架進(jìn)行對接。適合多線程開發(fā)在多線程開發(fā)中,Java的接口可以被當(dāng)做是線程間通訊的一種手段,通過實(shí)現(xiàn)不同的接口,線程之間可以進(jìn)行數(shù)據(jù)和狀態(tài)的交換和傳遞。適合單元測試接口有助于單元測試的編寫。單元測試時(shí),通過實(shí)現(xiàn)接口的方式,可以為被測試的類注入不同的實(shí)現(xiàn)類,來測試不同的業(yè)務(wù)邏輯,實(shí)現(xiàn)Mock測試。總結(jié)綜上所述,Java接口作為一種重要的面向接口編程機(jī)制,可以用來實(shí)現(xiàn)代碼的復(fù)用、拓展和解耦,可以提高程序的靈活性和可維護(hù)性。因此,Java接口在Java開發(fā)中不可缺少,不同之處直接映射出Java語言的特性和魅力。第4章類的封裝性、繼承性、多態(tài)性及接口10.內(nèi)部類介紹主講人:_________
什么是內(nèi)部類內(nèi)部類:可以將一個(gè)類的定義放在另一個(gè)類的定義內(nèi)部,這就是內(nèi)部類。示例:publicclassA{//外部類的成員
publicclassB{//內(nèi)部類的成員}}在類A中定義類B,那么類B就是內(nèi)部類,也稱為嵌套類,相對而言,類A
就是外部類。如果有多層嵌套,例如類A中有內(nèi)部類B,而類B中還有內(nèi)部類C,那么通常將最外層的類稱為頂層類(或者頂級(jí)類)。什么是內(nèi)部類示例:publicclassA{//外部類的成員
publicclassB{//內(nèi)部類的成員}}內(nèi)部類在編譯完成后也會(huì)產(chǎn)生.class文件,但文件名稱是:外部類名稱$內(nèi)部類名稱.class,例如:A$B.class。內(nèi)部類是一個(gè)非常有用的特性但又比較難理解使用的特性。內(nèi)部類分類分類:成員內(nèi)部類、靜態(tài)內(nèi)部類、局部(方法)內(nèi)部類、匿名內(nèi)部類。成員內(nèi)部類介紹:成員內(nèi)部類也叫實(shí)例內(nèi)部類。應(yīng)用場景:每一個(gè)外部類對象都需要一個(gè)內(nèi)部類的實(shí)例,內(nèi)部類離不開外部類存在(相當(dāng)于心臟對人體)。特征:作為外部類的一個(gè)成員存在,與外部類的屬性、方法并列。成員內(nèi)部類持有外部類的引用。成員內(nèi)部類中不能定義static變量和方法。成員內(nèi)部類定義格式:[訪問修飾符]class類名{[訪問修飾符]class內(nèi)部類名{ 屬性成員 方法成員}屬性成員方法成員}注意:內(nèi)用外,隨便訪問;外用內(nèi),需要內(nèi)部類對象(即實(shí)例化new)。成員內(nèi)部類使用格式:間接方法在外部類的方法中使用內(nèi)部類;其他類只是調(diào)用外部類方法。成員內(nèi)部類使用格式:直接方法即直接實(shí)例化內(nèi)部類。實(shí)現(xiàn)外部類使用:內(nèi)部類名稱對象名=new內(nèi)部類名稱();其他類使用:外部類名稱.內(nèi)部類名稱對象名=new外部類名稱().new內(nèi)部類名稱();成員內(nèi)部類重名的變量的使用方法:如果出現(xiàn)了重名現(xiàn)象,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生態(tài)旅游度假區(qū)招投標(biāo)申請表
- 社會(huì)保險(xiǎn)管理與城市規(guī)劃
- 石油化工設(shè)備使用與管理
- 水上樂園水電布線施工合同
- 農(nóng)村燃?xì)鈧€(gè)人承包施工合同
- 2024年跨國醫(yī)療設(shè)備采購與技術(shù)支持合同
- 2024年河南漯河事業(yè)單位選拔100位人才3篇
- 2024年鏟車安全巡查記錄表3篇
- 2025年度跨境電商擔(dān)保抵押合同范本2篇
- 2025版物流園區(qū)土地及建筑物租賃承包協(xié)議3篇
- 采購合同范例壁布
- 公司員工出差車輛免責(zé)協(xié)議書
- 2024年陜西榆林市神木市公共服務(wù)輔助人員招聘775人歷年管理單位遴選500模擬題附帶答案詳解
- 2024年度抖音短視頻拍攝制作服務(wù)合同范本3篇
- 2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試卷(提高篇)(含答案)
- 安全生產(chǎn)事故案例分析
- 2024年07月22208政治學(xué)原理期末試題答案
- 期末檢測卷(一)(試卷)-2024-2025學(xué)年外研版(三起)英語六年級(jí)上冊(含答案含聽力原文無音頻)
- 《客戶開發(fā)技巧》課件
- 《防范于心反詐于行》中小學(xué)防范電信網(wǎng)絡(luò)詐騙知識(shí)宣傳課件
- 口腔執(zhí)業(yè)醫(yī)師定期考核試題(資料)帶答案
評(píng)論
0/150
提交評(píng)論