![第04章+面向?qū)ο蟮木幊?高級語法)_第1頁](http://file4.renrendoc.com/view/ac4a1aef0ad680eb66a694c4d948c351/ac4a1aef0ad680eb66a694c4d948c3511.gif)
![第04章+面向?qū)ο蟮木幊?高級語法)_第2頁](http://file4.renrendoc.com/view/ac4a1aef0ad680eb66a694c4d948c351/ac4a1aef0ad680eb66a694c4d948c3512.gif)
![第04章+面向?qū)ο蟮木幊?高級語法)_第3頁](http://file4.renrendoc.com/view/ac4a1aef0ad680eb66a694c4d948c351/ac4a1aef0ad680eb66a694c4d948c3513.gif)
![第04章+面向?qū)ο蟮木幊?高級語法)_第4頁](http://file4.renrendoc.com/view/ac4a1aef0ad680eb66a694c4d948c351/ac4a1aef0ad680eb66a694c4d948c3514.gif)
![第04章+面向?qū)ο蟮木幊?高級語法)_第5頁](http://file4.renrendoc.com/view/ac4a1aef0ad680eb66a694c4d948c351/ac4a1aef0ad680eb66a694c4d948c3515.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第4章面向?qū)ο蟮木幊蹋ǜ呒壵Z法)第4章面向?qū)ο蟮木幊蹋ǜ呒壵Z法)4.1繼承和多態(tài)性的概念4.2繼承機制4.3多態(tài)性與重載4.4抽象類4.5接口4.6包與內(nèi)部類、匿名類4.1.1繼承的概述繼承是一種由已有的類創(chuàng)建新類的機制。利用繼承,我們可以先創(chuàng)建一個共有屬性的一般類,根據(jù)該一般類再創(chuàng)建具有特殊屬性的新類,新類繼承一般類的狀態(tài)和行為,并根據(jù)需要增加它自己的新的狀態(tài)和行為。由繼承而得到的類稱為子類(派生類),被繼承的類稱為父類(基類)。Java不支持多重繼承(子類只能有一個父類)。4.1.1繼承的概述繼承是從一個類派生出一個新類的過程。通過繼承,可以讓一個類擁有(繼承)另一個類的全部成員。動物食草動物食肉動物誰是父類?誰是子類?能說出繼承的特點嗎?繼承需要符合的關系:is-a,父類更通用、子類更具體生活中的繼承
子類具有父類的一般特性(包括屬性和行為),以及自身特殊的特性巴士是汽車嗎?卡車是汽車嗎?出租車是汽車嗎?最大載客數(shù)量報站引擎數(shù)量外觀顏色剎車加速汽車最大載重量卸貨所屬公司最大載客數(shù)量打發(fā)票屬性行為請問:出租車包含哪些屬性和行為呢?什么是多態(tài)簡單來說,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征同一個實現(xiàn)接口,使用不同的實例而執(zhí)行不同操作彩色打印機
打印機黑白打印機打印效果:彩色打印效果:黑白打印打印生活中的多態(tài)Cut….!!!聽到這個聲音他們會做什么?剪斷頭發(fā)切開皮膚停止表演不同對象對于同一個方法(Cut)調(diào)用的不同行為。理發(fā)師外科醫(yī)生演員4.1.2多態(tài)性的概述多態(tài)性是指對象可以表示多個類型的能力。
JAVA中多態(tài)性主要體現(xiàn)在:指同一操作作用于不同的類的實例,不同的類實例將進行不同的解釋,最后產(chǎn)生不同的執(zhí)行結果。在Java語言中,多態(tài)性體現(xiàn)在兩個方面:方法重載實現(xiàn)的靜態(tài)多態(tài)性(編譯時多態(tài))方法重寫實現(xiàn)的動態(tài)多態(tài)性(也稱動態(tài)聯(lián)編)。4.2繼承機制模擬了現(xiàn)實世界的關系實現(xiàn)代碼重用結構更清晰Student愛好…person姓名年齡…子類更加關注與子類相關的行為和狀態(tài)共有屬性由父類負責開發(fā)教師類,其中教師分為Java教師以及.NET教師,各自的要求如下:Java教師屬性:姓名、所屬部門方法:授課(步驟:打開MyEclipse、實施理論課授課)、自我介紹.NET教師屬性:姓名、所屬部門方法:授課(步驟:打開Visualstudio2010、實施理論課授課)、自我介紹4.2繼承機制請問:以下這個解決方案中存在著什么問題?publicclassDotNetTeacher{privateStringname;//教師姓名privateStringschool;//所在學校publicDotNetTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println("啟動VS2010");System.out.println("知識點講解");System.out.println("總結提問");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}publicclassJavaTeacher{privateStringname;//教師姓名privateStringschool;//所在學校publicJavaTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println("啟動
MyEclipse");System.out.println("知識點講解");System.out.println("總結提問");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}代碼存在重復,違背了“writeonce,onlyonce”的原則4.2繼承機制如何改進?有沒有可能建立繼承關系,讓子類自動繼承父類的屬性和方法?Java教師是教師嗎?.NET教師是教師嗎?publicclassTeacher{privateStringname;//教師姓名privateStringschool;//所在學校publicTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println("知識點講解");System.out.println("總結提問");}publicvoidintroduction(){ System.out.println("大家好!我是“
+school+"的"+name+"。");}}現(xiàn)在,所有子類中相同的代碼都抽取到父類中了屬
性行
為姓名所在學校授課自我介紹教師Java教師.NET教師4.2繼承機制publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動MyEclipse");super.giveLesson();}}publicclassDotNetTeacher2extendsTeacher{publicDotNetTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動VS2010");super.giveLesson();}}使用繼承,可以有效實現(xiàn)代碼復用子類自動繼承父類的屬性和方法,子類中不再存在重復代碼4.2繼承機制一切類的“祖先”——Object在Java中,所有的Java類都直接或間接地繼承了java.lang.Object類publicclassMyObject{//…}publicclassMyObectextendsObject{
//…}在Eclipse中調(diào)用MyObject對象的成員,會自動彈出繼承自Object的所有方法4.2.1繼承的定義在Java語言中,用extends關鍵字來表示一個類繼承了另一個類,例如:publicclassDeriveClassextendsBaseClass{//其它代碼}基類的公共成員被派生類繼承后在派生類中可以直接訪問,也可以在程序的任何地方通過派生類的對象或派生類名訪問;基類的私有成員不能在派生類中訪問,也不能通過派生類的對象或派生類名訪問;基類的保護成員只能在基類和派生類中訪問。在父類中只定義一些通用的屬性與方法,例如:publicclassTeacher{privateStringname;//教師姓名privateStringschool;//所在學校publicTeacher(StringmyName,StringmySchool){//初始化屬性值}publicvoidgiveLesson(){//授課方法的具體實現(xiàn)}publicvoidintroduction(){//自我介紹方法的具體實現(xiàn)
}}4.2.1繼承的定義子類自動繼承父類的屬性和方法,子類中可以定義特定的屬性和方法publicclassTeacher{privateStringname;//教師姓名privateStringschool;//所在學校publicTeacher(StringmyName,StringmySchool){//初始化屬性值}publicvoidgiveLesson(){ //授課方法的具體實現(xiàn)}publicvoidintroduction(){ //自我介紹方法的具體實現(xiàn)
}}publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動Eclipse");super.giveLesson();}}由于giveLesson()方法與父類的實現(xiàn)有所不同,因此重寫了該方法方法重寫:子類和父類的方法具有相同的名稱、參數(shù)列表、返回類型父類中的屬性和方法可以被子類繼承4.2.1繼承的定義繼承的傳遞性汽車雙層單層小型卡車重型卡車同樣具有汽車的特征繼承的傳遞性卡車公共汽車還可以派生更多的類型繼承的傳遞性publicclassVehicle{voidvehicleRun(){
System.out.println("汽車在行駛!");}}publicclassTruckextendsVehicle{
voidtruckRun(){
System.out.println("卡車在行駛!");}}繼承的傳遞性添加一個小型卡車類publicclassSmallTruckextendsTruck{protectedvoidsmallTruckRun(){
System.out.println("微型卡車在行駛!");}
publicstaticvoidmain(String[]args){SmallTrucksmalltruck=newSmallTruck();smalltruck.vehicleRun();smalltruck.truckRun();
smalltruck.smallTruckRun();}}繼承關系父類的父類成員父類的成員傳遞性1.屬性的繼承子類可以繼承父類的所有屬性,但是父類的私有屬性對子類是不可見的。publicclassPerson{publicStringname;publicintage;publicvoidshowInfo(){ System.out.println(“尊敬的”+name+”,您的年齡為:”+age);} }基類4.2.2類中屬性的繼承與隱藏publicclassStudentextendsPerson{publicstringschool;publicintengScore;publicintjavaScore;publicvoidsetInfo(){ name=“陳一”; age=20;school=“西亞斯學院”;}}派生類屬性的繼承訪問基類成員子類也可以隱藏繼承的成員變量,對于子類可以從父類繼承的成員變量,只要子類中定義的成員變量和父類中的成員變量同名時,子類就隱藏了繼承的成員變量.子類通過成員變量的隱藏可以把父類的狀態(tài)變?yōu)樽陨淼臓顟B(tài)。屬性的隱藏父類中非私有方法都可以被子類所繼承。在子類繼承父類的成員方法時,應注意:子類不能訪問父類的private(私有)成員方法,但子類可以訪問父類的public(公有)、protected(保護)成員方法。protected訪問時,子類和同一包內(nèi)的方法都能訪問父類的protected成員方法,但其他方法不能訪問。4.2.3類中方法的繼承、覆蓋與重載publicclassStudentextendsPerson{privateStringschool;privateintengScore;privateintjavaScore;
publicvoidsetScores(Strings,inte,intj){ school=s; engScore=e; javaScore=j;}}派生類publicclassPerson{privateStringname;privateintage;publicvoidinitInfo(Stringn,inta){name=n;age=a;}publicvoidshowInfo(){ System.out.println(“尊敬的”+name+”,您的年齡為:”+age);}}基類publicstaticvoidmain(String[]args){StudentobjStudent=newStudent();objStudent.initInfo(“王爍”,22); objStudent.showInfo(); objStudent.setScores(“清華大學”,79,92);}調(diào)用的基類成員無需實現(xiàn)initInfo()和showInfo()方法方法的繼承方法的覆蓋(重寫)子類通過方法的覆蓋可以隱藏繼承的方法,方法覆蓋是指:子類中定義一個方法,并且這個方法的名字、返回類型、參數(shù)列表與從父類繼承的方法完全相同。注意:1.子類的方法不能縮小父類方法的訪問權限2.子類的方法不能拋出比父類方法更多的異常3.父類的靜態(tài)方法不能被子類覆蓋為非靜態(tài)方法4.父類的私有方法不能被子類覆蓋方法的覆蓋publicclassStudentextendsPerson{privateStringschool;privateintengScore;privateintjavaScore;publicvoidsetScores(Strings,inte,intj){ school=s; engScore=e; javaScore=j;}publicvoidshowInfo(){super.showInfo();System.out.println(",英語成績是:"+engScore+",JAVA成績是:"+javaScore); //System.out.println(school+“的同學+name+“年齡為:”+age+“英語成績是:”+engScore+”,你的JAVA成績是:”+javaScore);//此行代碼錯的原因}}覆蓋了基類的showInfo()方法方法重載類方法方法參數(shù)方法實現(xiàn)司機轎車巴士火車駕駛啟動、行駛、……等待乘客上車、啟動、行駛、到站停車、……正點發(fā)車、行駛、到站停車、……如果用代碼實現(xiàn),我們需要三個方法,這些方法的方法名稱相同,參數(shù)類型不同方法重載publicintSum(intpara1,intpara2){returnpara1+para2;}整形參數(shù),返回值整型如果想讓兩個String型、兩個double型相加,怎么做?編寫兩個不同名字的方法,這樣我們在進行調(diào)用時要先判斷是什么類型,能否不判斷直接就能相加呢?方法重載對于類的方法,如果有兩個方法的方法名相同,但參數(shù)列表不一致,那么可以說,一個方法是另一個方法的重載方法重載方法必須滿足以下條件:方法名相同。方法的參數(shù)類型,個數(shù),順序至少有一個不同。方法的返回類型可以不相同(與方法的返回類型無關)。方法的修飾符可以不相同(與修飾符無關)。方法重載同一個類中添加幾個名字相同,參數(shù)與返回值不同的方法publicString
Sum(String
para1,String
para2){returnpara1+para2;}publicdoubleSum(doublepara1,doublepara2){returnpara1+para2;}調(diào)用時只要傳遞參數(shù)即可,無需判斷類型方法重載classAdd{
publicString
Sum(String
para1,String
para2){…}
publicintSum(intpara1,intpara2){…}}基于不同類型參數(shù)的重載classAdd{
publicintSum(intpara1,intpara2){…}
publicintSum(intpara1,intpara2,intpara3){…}}相同類型不同參數(shù)個數(shù)的重載不允許重載方法僅僅是返回值不同方法重載并不陌生System.out類的println方法能夠打印數(shù)據(jù)并換行,根據(jù)數(shù)據(jù)類型的不同,有多種實現(xiàn)方式publicclassTest{publicstaticvoidmain(String[]args){inti=0;charc='z';Stringstr="hello";System.out.println(i);System.out.println(c);System.out.println(str);}}PrintStreamprintln(int)println(char)println(String)……方法名相同,參數(shù)類型不同調(diào)用不同的println方法方法重載方法重載構造函數(shù)的重載當實例化對象的時候,在不同的條件下,對象可能會有不同的初始化行為。對一個學生對象來說,初始的時候,有可能不知道姓名,有可能不知道年齡,有可能什么都不知道。我們可以通過對構造函數(shù)重載,來實現(xiàn)多種初始化的行為。構造函數(shù)的重載publicStudent(){}publicStudent(Stringname,intage,Stringschool){
=name;
this.age=age;this.hobby=hobby;}構造函數(shù)也可以重載Studentscofield=newStudent();Studentzhang=
newStudent(“張靚靚”,20,“西亞斯學院");方法名相同,參數(shù)不同請編碼實現(xiàn)動物世界的繼承關系:動物(Animal)具有行為:吃(eat)、睡覺(sleep)動物包括:兔子(Rabbit),老虎(Tiger)這些動物吃的行為各不相同(兔子吃草,老虎吃肉);但睡覺的行為是一致的。請通過繼承實現(xiàn)以上需求,并編寫測試類AnimalTest進行測試。
4.2.4在子類中使用構造函數(shù)子類不能繼承父類的構造函數(shù)。
子類在創(chuàng)建新對象時,依次向上尋找其基類,直到找到最初的基類,然后開始執(zhí)行最初的基類的構造函數(shù),再依次向下執(zhí)行派生類的構造函數(shù),直至執(zhí)行完最終的擴充類的構造函數(shù)為止。注意:對于無參數(shù)的構造函數(shù),執(zhí)行不會出現(xiàn)問題。如果是帶參數(shù)的構造函數(shù),還需要做相應的處理。如果基類中沒有默認構造函數(shù)或者希望調(diào)用帶參數(shù)的基類構造函數(shù),就要使用關鍵字super來顯式調(diào)用基類構造函數(shù)。使用關鍵字super調(diào)用基類構造函數(shù)的語句,必須是子類構造函數(shù)的第一個可執(zhí)行語句。調(diào)用基類構造函數(shù)時傳遞的參數(shù)不能是關鍵字this或當前對象的非靜態(tài)成員。4.2.4在子類中使用構造函數(shù)默認構造函數(shù)默認構造函數(shù)指的是沒有參數(shù)的構造函數(shù)。可為分兩種情況。(1)隱含的默認構造函數(shù)類中若未定義構造函數(shù),則JAVA系統(tǒng)自動提供一個缺省的構造函數(shù)。缺省的構造函數(shù)無參,函數(shù)體為空,僅創(chuàng)建對象,不作任何初始化工作。publicPerson(){}(2)程序顯示定義的默認構造函數(shù)publicPerson(){ name=“無名氏”;}只要類中定義了一個構造函數(shù),編譯器就不再提供缺省的構造函數(shù)隱式調(diào)用父類的構造函數(shù)Person類中去掉了構造函數(shù)publicPerson(){}“Person”方法沒有采用“0”個參數(shù)的重載classStudentextendsPerson{publicStudent(){
}
publicStudent(stringname,intage,stringschool)}super()隱式的調(diào)用super()子類的構造函數(shù)沒有使用super指明調(diào)用父類哪個構造函數(shù)父類要提供無參的構造函數(shù)顯示調(diào)用父類的構造函數(shù)如果父類沒有無參的構造函數(shù)子類構造函數(shù)必須指明調(diào)用父類哪個構造函數(shù)publicStudent(){
super("張靚靚",20)}publicStudent(stringname,intage,stringschool){ super(name,age)}4.2.5父類對象與子類對象間的使用和轉(zhuǎn)化this和super關鍵字常用來指代子類對象與父類對象的關鍵字。this關鍵字this是Java的一個關鍵字,表示當前對象。this可以出現(xiàn)在實例方法和構造方法中,但不可以出現(xiàn)在static方法中。this關鍵字出現(xiàn)在類的構造方法中時,代表使用該構造方法所創(chuàng)建的對象。this關鍵字出現(xiàn)在類的實例方法中時,代表正在調(diào)用該方法的當前對象。this關鍵字classDemothis{inta;//成員變量intb;
publicDemo(inta){ this.a=a;}PublicDemo(inta,intb){this(a);this.b=b;}在成員方法定義時,我們使用的形式參數(shù)與成員變量名稱相同,這時我們要用到this在某一構造方法中調(diào)用另一構造方法時,必須使用this來調(diào)用,this關鍵字必須寫在構造方法內(nèi)第一行位置super關鍵字在子類中通過super來實現(xiàn)對父類成員的訪問。我們知道,this用來引用當前對象,與this類似,super用來引用當前對象的父類。(1)訪問父類被隱藏的成員變量,如:
super.variable;(2)調(diào)用父類中被覆蓋的方法,如:
super.Method([paramlist]);(3)調(diào)用父類的構造函數(shù),如:
super([paramlist]);super關鍵字classChildextendsFather{intx=1;Child(){System.out.println(super.x);}publicstaticvoidmain(Stringargs[]){newChild();//其實是super.x=0}}classFather{intx=0;}通過super關鍵字訪問父類中被隱藏的成員變量publicclassStudentextendsPerson{publicStudent(StringmyName,intmyAge){super(myName,myAge);}}子類的構造方法中,通過super關鍵字調(diào)用父類的構造方法方法重寫后,通過super關鍵字調(diào)用父類的方法publicclassStudentextendsPerson{publicvoidshowInfo(){super.showInfo();
System.out.println(",你的英語成績是:"+engScore+",JAVA成績是:"+javaScore");}}通過調(diào)用父類的構造方法,完成對屬性值的初始化super關鍵字4.3多態(tài)性在java語言中,多態(tài)性體現(xiàn)在兩個方面:靜態(tài)多態(tài)性是在編譯的過程中確定同名操作的具體操作對象的。(體現(xiàn)在方法的重載)動態(tài)多態(tài)性則是在程序運行過程中動態(tài)地確定操作所針對的具體對象的。這種確定操作具體對象的過程就是聯(lián)編,也稱為動態(tài)綁定。(體現(xiàn)在方法的重寫)4.3.1方法的動態(tài)調(diào)用當一個類有很多子類時,并且這些子類都重寫了父類中的某個方法。那么當我們把子類創(chuàng)建的對象的引用放到一個父類的對象中時,就得到了該對象的一個上轉(zhuǎn)型對象在通過上轉(zhuǎn)型對象在調(diào)用這個方法時,程序會動態(tài)地(在執(zhí)行時)選擇正確的子類的方法去實現(xiàn)該功能,就稱為動態(tài)方法綁定。就可能具有多種形態(tài)。對象的上轉(zhuǎn)型對象假設B類是A類子類或間接子類,當我們用子類B創(chuàng)建一個對象,并把這個對象的引用放到A類的對象中時:
Aa;Bb=newB();a=b;稱這個A類對象:a,是子類對象b的上轉(zhuǎn)型對象.對象的上轉(zhuǎn)型對象的實體是子類負責創(chuàng)建的,但上轉(zhuǎn)型對象會失去原子類對象的一些屬性和功能。上轉(zhuǎn)對象不能操作子類新增的成員變量;不能使用子類新增的方法。上轉(zhuǎn)型對象可以操作子類繼承或隱藏成員變量,也可以使用子類繼承的或重寫的方法。上轉(zhuǎn)型對象操作子類繼承或重寫的方法時,就是通知對應的子類對象去調(diào)用這些方法。因此,如果子類重寫了父類的某個方法后,對象的上轉(zhuǎn)型對象調(diào)用這個方法時,一定是調(diào)用了這個重寫的方法。可以將對象的上轉(zhuǎn)型對象再強制轉(zhuǎn)換到一個子類對象,該子類對象又具備了子類所有屬性和功能。對象的上轉(zhuǎn)型對象
classMammal{//哺乳動物類
privateintn=40;voidcrySpeak(Strings){System.out.println(s);}}publicclassMonkeyextendsMammal{//猴子類
voidcomputer(intaa,intbb){intcc=aa*bb;System.out.println(cc);}voidcrySpeak(Strings){System.out.println("**"+s+"**");}}上轉(zhuǎn)型對象的使用publicstaticvoidmain(Stringargs[]){
//mammal是Monkey類的對象的上轉(zhuǎn)型對象.Mammalmammal=newMonkey();mammal.crySpeak("Ilovethisgame");//puter(10,10);//把上轉(zhuǎn)型對象強制轉(zhuǎn)化為子類的對象.Monkeymonkey=(Monkey)mammal;puter(10,10);}
如果子類重寫了父類的方法,那么重寫方法的調(diào)用原則如下:Java運行時系統(tǒng)根據(jù)調(diào)用該方法的實例,來決定調(diào)用哪個方法。對子類的一個實例,如果子類重寫了父類的方法,則運行時系統(tǒng)調(diào)用子類的方法;如果子類繼承了父類的方法(未重寫),則運行時系統(tǒng)調(diào)用父類的方法。實例:TestPloymoph/Test.java4.3.2方法的動態(tài)調(diào)用classBase{publicStringname;publicBase(){name="Base";}publicBase(StringpName){name=pName;}publicvoidmethod(){System.out.println(name);}}classChildextendsBase{publicChild(){super("Child1");name="Child2";}}給定如下Java代碼,編譯運行后,輸出結果是什么?publicclassSample{publicstaticvoidmain(String[]args){
Childc=newChild();c.method();
}}Child2控制臺輸出123給定如下Java代碼,編譯運行后,輸出結果是什么?publicclassTeacher{publicvoidgiveLesson(){System.out.println("知識點講解");}}
publicclassDBTeacherextendsTeacher{publicvoidgiveLesson(){System.out.println("啟動SqlServer");}}12publicclassTest{publicstaticvoidmain(String[]args){Teachert=newDBTeacher();t.giveLesson();}}控制臺輸出啟動SqlServer4.4抽象類
Java語言中,用abstract關鍵字來修飾一個類時,這個類叫做抽象類。抽象類只關心它的子類是否具有某種功能,并不關心該功能的具體實現(xiàn),功能的具體行為由子類負責實現(xiàn)的。當一個類的定義完全表示抽象的概念時,它不應該被實例化為一個對象。例如Java中的Number類就是一個抽象類,它只表示數(shù)字這一抽象概念,只有當它作為整數(shù)類Integer或?qū)崝?shù)類Float等的父類時才有意義。4.4.1抽象類的定義abstractclassClassOne{ //類實現(xiàn)}不能實例化只能用作派生類的基類用關鍵字abstract修飾的類稱為抽象類。由于抽象類不能被實例化,因此下面的語句會產(chǎn)生編譯錯誤:
ClassOnea=newClassOne();4.4.2抽象方法抽象方法只有方法頭,沒有具體的方法體。publicabstractvoidMethod();
抽象方法的一個主要目的就是為所有子類定義一個統(tǒng)一的接口,至于方法體的具體實現(xiàn),那是由當前類的不同子類在它們各自的類定義中完成的。與final類和方法相反,抽象類必須被繼承,抽象方法必須被重寫。含有抽象方法的類必須是抽象類,不過,一個抽象類并不一定僅擁有抽象方法。4.4.2抽象方法abstractclasscfath{intx;public
abstractvoidf();//抽象方法
publiccfath(){ x=1;System.out.println(x);}}abstractclassBase{//成員變量intbasevar;//成員函數(shù)publicabstract
voidM1();
//無法實現(xiàn)
…….}classDerivedextendsBase{
//成員變量intderivedvars;
//成員函數(shù)publicvoidM1(){
//實際實現(xiàn)}抽象類派生類4.4.2抽象方法必須重寫
4.4.2抽象方法繼承于抽象類的類一般應該實現(xiàn)抽象類中的所有抽象方法(重寫)。如果沒有,那么該派生類也應該聲明為抽象類。 abstractclassA{ publicabstractvoidMethodA(); } classBextendsA{ //錯誤
publicvoidMethodB(){} } classCextendsA{ publicvoidMethodA(){} }抽象類實例:abstract/Test_abstract.java電腦主板上的PCI插槽的規(guī)范就類似于Java接口聲卡顯卡網(wǎng)卡每種卡的內(nèi)部結構都不相同,可以把聲卡、網(wǎng)卡、顯卡都插在PCI插槽上,而不用擔心哪個插槽是專門插哪個卡的主板生活中的接口:4.5JAVA語言中的接口生活中的接口OFFON請按開關按鈕:ON/OFF兩種方法ONOFF生活中的接口ISwitchON()OFF()4.5.1JAVA語言中的接口接口的主要特點是只有聲明部分,沒有實現(xiàn)部分。接口成員的實現(xiàn)是通過類完成的。定義在接口中的方法都是public的。需要在不相關的類中實現(xiàn)同樣的功能時,可以使用接口。接口的聲明publicinterfaceIBase{finalStringstr=常量;
voidmethod1();intmethod2(float);…….}只有聲明沒有實現(xiàn)無訪問修飾符接口本身并不提供它所定義成員的具體實現(xiàn),它只是指定了實現(xiàn)該接口的類或結構必須實現(xiàn)的成員。接口的聲明接口體中包含常量和方法定義兩部分。常量定義部分定義的常量均具有public、static和final屬性。接口中只能進行方法的聲明,不提供方法的實現(xiàn),在接口中聲明的方法具有public和abstract屬性。publicinterfacePCI{finalintvoltage=10;
publicvoidstart();
publicvoidstop();
}這是Java接口,相當于主板上的PCI插槽的規(guī)范voltage具有publicstaticfinal修飾符接口的實現(xiàn)接口可以由類來實現(xiàn),類通過關鍵字implements聲明自己使用一個或多個接口。所謂實現(xiàn)接口,就是實現(xiàn)接口中聲明的方法。class類名extends[基類]implements接口,…,接口{ ……//成員定義部分}
接口中的方法被默認是public,所以類在實現(xiàn)接口方法時,一定要用public來修飾。如果某個接口方法沒有被實現(xiàn),實現(xiàn)類中必須將它聲明為抽象的,該類當然也必須聲明為抽象的。interfaceIMsg{ voidMessage();}publicabstractclassMyClassimplementsIMsg{
publicabstractvoidMessage();}接口的實現(xiàn)classSoundCardimplementsPCI{publicvoidstart()
{
System.out.println("Dudu...");
}
publicvoidstop()
{
System.out.println("Soundstop!");
}
}Java接口中定義的方法在不同的地方被實現(xiàn),可以具有完全不同的行為classNetworkCardimplementsPCI{publicvoidstart()
{
System.out.println("Send...");
}
publicvoidstop()
{
System.out.println("Networkstop!");
}
}聲卡、網(wǎng)卡都實現(xiàn)了PCI插槽的規(guī)范,但行為完全不同接口的實現(xiàn)接口回調(diào)接口回調(diào)是指:可以把實現(xiàn)某一接口的類創(chuàng)建的對象的引用賦給該接口聲明的接口變量中。那么該接口變量就可以調(diào)用被類實現(xiàn)的接口中的方法。實際上,當接口變量調(diào)用被類實現(xiàn)的接口中的方法時,就是通知相應的對象調(diào)用接口的方法.接口的實現(xiàn)publicclassAssembler{
publicstaticvoidmain(String[]args){
PCInc=newNetworkCard();
PCIsc=newSoundCard();
nc.start();sc.start();
}
}可以使用Java接口標識類型,運行時,根據(jù)實際創(chuàng)建的對象類型調(diào)用相應的方法實現(xiàn)Send...Dudu...控制臺輸出21接口的實現(xiàn)為學校各院系開發(fā)這樣一個小系統(tǒng),包含類型:教師、系部、打印機,具體要求如下:教師、以及系部都具有方法:輸出詳細信息系部具有屬性:打印機,能夠通過系部的打印機打印教師或系部的詳細信息系統(tǒng)要具備良好的可擴展性與可維護性打印教師系部教師詳細信息系部詳細信息detail方法(輸出詳細信息)以下這個解決方案中存在著什么問題?publicclassTeacher1{//輸出教員的詳細信息publicStringdetail(){ return“本人是教師";}}publicclassSchool1{privatePrinterprinter=newPrinter();//輸出系部的詳細信息publicStringdetail(){return“這里是國際教育學院";}//使用打印機打印教師信息publicvoidprint(Teacher1t){printer.print(t.detail());}//使用打印機打印系部信息publicvoidprint(School1s){ printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println("開始打?。?);System.out.println(content);}}每增加一種新類型,都需要增加相應的print(類型名稱var)方法——程序的可擴展性及可維護性極差——這不符合系統(tǒng)的要求接口的實現(xiàn)可以通過多態(tài)性解決這個問題嗎?顯然,本系統(tǒng)符合使用多態(tài)性的條件教師系部detail方法(負責輸出詳細信息)教師
詳細信息系部
詳細信息1221回顧多態(tài)的含義:實現(xiàn)同一個接口,使用不同的實例而執(zhí)行不同操作接口的實現(xiàn)在這個系統(tǒng)中,存在繼承關系嗎?教師、系部屬于兩種不同的類型教師、系部都存在一個共同的方法特征:detail,它們對detail方法有各自不同的實現(xiàn)——這完全符合Java接口的定義定義一個Java接口,在其中定義detail方法,但沒有具體實現(xiàn)實現(xiàn)這個Java接口,不同的類對detail方法有不同的具體實現(xiàn)IntroduceableTeacher2(教員)School2(系部)接口的實現(xiàn)publicinterfaceIntroduceable{publicStringdetail();}publicclassSchool2
implementsIntroduceable{privatePrinterprinter=newPrinter();//輸出系部的詳細信息publicStringdetail(){return“這里是國際教育學院";}//使用系部打印機打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}publicclassTeacher2
implementsIntroduceable{//輸出教師的詳細信息publicStringdetail(){ return“本人是教師";}}通過Java接口,我們同樣可以享受到多態(tài)性的好處,大大提高了程序的可擴展性及可維護性使用print方法時,參數(shù)可以是任何實現(xiàn)Introduceable接口的類的對象,不必再為不同的類型建立不同的print方法了使用了Java接口之后,這個系統(tǒng)有了怎樣的改進?接口的實現(xiàn)小結為剛才完成的系統(tǒng)增加一種新的類型:學員(Student),具體要求如下:學生具有detail方法,負責輸出學員詳細信息能夠通過系部的打印機打印學員的詳細信息系統(tǒng)要具備良好的可擴展性與可維護性編寫測試類StudentTest進行測試,要求:通過中心的打印機打印學員的詳細信息4.5.2什么是面向接口編程開發(fā)系統(tǒng)時,主體構架使用接口,接口構成系統(tǒng)的骨架,這樣就可以通過更換接口的實現(xiàn)類來更換系統(tǒng)的實現(xiàn)publicclassSchool2implementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return“這里是國際教育學院";}//使用系部打印機打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}IntroduceableTeacher2(教師)School2(系部)面向接口編程的示例-1升級上述的系統(tǒng),要求:打印機有多種類型,比如:黑白打印機、彩色打印機等系部可能配備其中任意一款打印機,負責打印教師或者系部的詳細信息系統(tǒng)要具備良好的可擴展性與可維護性print方法(打?。┎噬蛴C黑白打印機黑白內(nèi)容系部/教師詳細信息彩色內(nèi)容面向接口編程的示例-2采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第一步:抽象出Java接口1、分析:黑白、彩色打印機都存在一個共同的方法特征:print黑白、彩色打印機對print方法有各自不同的實現(xiàn)2、結論:抽象出Java接口PrinterFace,在其中定義方法print3、具體實現(xiàn):publicinterfacePrinterFace{publicvoid
print(Stringcontent);}面向接口編程的示例-3采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第二步:publicclassColorPrinter
implementsPrinterFace{publicvoid
print(Stringcontent){System.out.println("彩色打?。?);System.out.println(content);}}publicclassBlackPrinter
implementsPrinterFace{publicvoid
print(Stringcontent){System.out.println("黑白打?。?);System.out.println(content);}}實現(xiàn)Java接口1、分析:已經(jīng)抽象出Java接口PrinterFace,并在其中定義了print方法黑白、彩色打印機對print方法有各自不同的實現(xiàn)2、結論:黑白、彩色打印機都實現(xiàn)PrinterFace接口,各自實現(xiàn)print方法3、具體實現(xiàn):面向接口編程的示例-4采用面向接口編程的方式實現(xiàn),以下是三個步驟中的第三步:使用Java接口1、分析:主體構架使用接口,讓接口構成系統(tǒng)的骨架2、結論:更換實現(xiàn)接口的類就可以更換系統(tǒng)的實現(xiàn)3、具體實現(xiàn):publicclassSchool3implementsIntroduceable{privatePrinterFaceprinter;//打印機
publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicStringdetail(){return“這里是國際教育學院";}publicvoidprint(Introduceableintro){
printer.print(intro.detail());}}publicclassTest{publicstaticvoidmain(String[]args){//創(chuàng)建系部實例School3school=newSchool3();//為該系部配備黑白打印機
school.setPrinter(newBlackPrinter());school.print(school);//為該系部配備彩色打印機
school.setPrinter(new
ColorPrinter());school.print(school);}}小結閱讀如下Java代碼,然后請采用面向接口編程的思想,在空白處填寫正確的代碼publicinterfacePCI{
void
start();
void
stop();
}classSoundCardimplementsPCI{publicvoidstart()
{
System.out.println("Dudu...");
}
publicvoidstop()
{
System.out.println("Soundstop!");
}
}classNetworkCardimplementsPCI{publicvoidstart()
{
System.out.println("Send...");
}
publicvoidstop()
{
System.out.println("Networkstop!");
}
}這是Java接口,相當于主板上的PCI插槽的規(guī)范聲卡、網(wǎng)卡都實現(xiàn)了PCI插槽的規(guī)范,但行為完全不同小結publicclassMainBoard{
publicvoidusePCICard(______p)
{
p.start();
p.stop();
}
}publicclassAssembler{
publicstaticvoidmain(String[]args)
{
MainBoardmb=newMainBoard();
//在主板上插入網(wǎng)卡
//在主板上插入聲卡
}
}提示:通過這個方法,主板上可以插入任意符合PCI插槽規(guī)范的卡PCInc=newNetworkCard();mb.usePCICard(nc);
PCIsc=newSoundCard();
mb.usePCICard(sc);PCI提示:可以通過更換實現(xiàn)接口的類來更換系統(tǒng)的實現(xiàn)4.6包和接口生活案例
文檔分門別類,易于查找不同內(nèi)容的文檔可以放在不同的袋子中,擁有相同的名字,避免沖突
易于管理為什么需要包4.6.1java中的包樹形文件系統(tǒng)使用目錄解決文件同名沖突問題如何存放兩個同名的類而不沖突?Sort.java
插入排序Sort.java
冒泡排序4.6.1java中的包包包——解決類的同名問題允許類組成較小的單元(類似文件夾),易于找到和使用相應的文件
防止命名沖突更好的保護類、數(shù)據(jù)和方法A.java包如何創(chuàng)建包packagecs.java.chap4;publicclassSchool{……publicStringtoString(){……}}
包名使用package聲明包,以分號結尾如果有包的聲明,一定作為Java源代碼的第一條語句包命名規(guī)范包名由小寫字母組成,不能以圓點開頭或結尾自己設定的包名之前最好加上唯一的前綴,通常使用組織倒置的網(wǎng)絡域名。如:域名
設定的包名部分依不同機構各自內(nèi)部的規(guī)范不同而不同packagemypackage;package
net.javagroup.mypackage;package
net.javagroup.research.powerproject;
部門名項目名package.mypackage;×包與目錄的關系創(chuàng)建好的包和Java源文件是如何存儲的?創(chuàng)建包cs.java.chap4,即創(chuàng)建了目錄結構:..\cs\java\chap4Programcsjavachap4School.classHello.classSchool.java如何導入包為了使用不在同一包中的類,需
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代熱風系統(tǒng)在醫(yī)療設備中的應用案例
- 現(xiàn)代口腔門診的通風與空氣質(zhì)量設計
- 烘焙坊經(jīng)營中的供應鏈優(yōu)化
- 現(xiàn)代科技助力教育普及與均衡發(fā)展
- 環(huán)境友好的商業(yè)產(chǎn)品設計案例分享
- 國慶節(jié)兒童泥塑活動方案
- 10《雨和雪》 說課稿-2024-2025學年科學六年級上冊人教鄂教版
- 2023三年級數(shù)學上冊 五 解決問題的策略練習十(2)說課稿 蘇教版
- 2024-2025學年高中歷史 專題二 近代中國資本主義的曲折發(fā)展 2.2 民國時期民族工業(yè)的曲折發(fā)展說課稿1 人民版必修2
- 《11 剪紙花邊》 說課稿-2024-2025學年科學一年級上冊湘科版
- 《水電站繼電保護》課件
- 沈陽市第一屆“舒心傳技 莘紳向陽”職業(yè)技能大賽技術工作文件-27-全媒體運營師
- 安全生產(chǎn)網(wǎng)格員培訓
- 深圳建筑工程公司財務管理制度
- 統(tǒng)編版語文三年級下冊第三單元綜合性學習中華傳統(tǒng)節(jié)日 活動設計
- 降低順產(chǎn)產(chǎn)婦產(chǎn)后2小時失血率PDCA成果匯報書
- 2024年山東泰安市泰山財金投資集團有限公司招聘筆試參考題庫含答案解析
- 新媒體文案創(chuàng)作與傳播精品課件(完整版)
- 2022年全省百萬城鄉(xiāng)建設職工職業(yè)技能競賽暨“華衍杯”江蘇省第三屆供水安全知識競賽題庫
- 廣西北海LNG儲罐保冷施工方案
- 產(chǎn)業(yè)園工程施工組織設計(技術標近200頁)
評論
0/150
提交評論