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