第八章類的繼承抽象類和接口_第1頁
第八章類的繼承抽象類和接口_第2頁
第八章類的繼承抽象類和接口_第3頁
第八章類的繼承抽象類和接口_第4頁
第八章類的繼承抽象類和接口_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第八章類的繼承抽象類和接口第1頁,共110頁,2023年,2月20日,星期一8.1 繼承繼承是實(shí)現(xiàn)代碼重用的一種有力手段。如果有多個(gè)類具有一些相同的屬性和方法,可以將這些相同的屬性和方法抽象出來定義為一個(gè)父類,在父類中定義這些屬性和方法,則具有這些屬性和方法的其它類可以從這個(gè)父類派生出來,不必再重新定義這些屬性和方法,稱這些派生而來的類為子類。

第2頁,共110頁,2023年,2月20日,星期一8.1類的繼承1.Java語言的特點(diǎn)有:代碼的重用2.通過繼承可以實(shí)現(xiàn)代碼的復(fù)用。3.父類或超類(superclass)被繼承的類4.子類(subclass)由繼承而得到的類5.一個(gè)父類可以同時(shí)擁有多個(gè)子類,但由于Java中不支持多重繼承,所以一個(gè)類只能有一個(gè)直接父類。第3頁,共110頁,2023年,2月20日,星期一在Java語言中有一個(gè)稱為java.lang.Object的特殊類,所有的類都是直接或間接地繼承該類而得到的。第4頁,共110頁,2023年,2月20日,星期一格式:classSubClassextendsSuperClass{……}把SubClass聲明為類SuperClass的直接子類,如果SuperClass又是某個(gè)類的子類,則SubClass同時(shí)也是該類的間接子類。8.1.1子類的創(chuàng)建第5頁,共110頁,2023年,2月20日,星期一如果沒有extends關(guān)鍵字,則該類默認(rèn)為java.lang.Object類的子類。因此,在Java中所有的類都是通過直接或間接地繼承java.lang.Object類得到的。所以在此之前的所有例子均是java.lang.Object類的子類。第6頁,共110頁,2023年,2月20日,星期一繼承中的構(gòu)造方法第7頁,共110頁,2023年,2月20日,星期一1.子類的構(gòu)建方法【例8.1】類的繼承//app8_1.java繼承的簡單例子classPerson//Person類是java.lang.Object類的子類{privateStringname;//name表示姓名privateintage;//age表示年齡publicPerson()//定義無參構(gòu)造方法{System.out.println(“調(diào)用了個(gè)人構(gòu)造方法Person()”);}publicvoidSetNameAge(Stringname,intage){=name;this.age=age;}第8頁,共110頁,2023年,2月20日,星期一publicvoidshow(){System.out.println(“姓名:“+name+”年齡:”+age);}}classStudentextendsPerson//定義Student類,繼承自Person類{privateStringdepartment;publicStudent()//Student的構(gòu)造方法{System.out.println(“調(diào)用了學(xué)生構(gòu)造方法Student()”);}

【例8.1】續(xù)第9頁,共110頁,2023年,2月20日,星期一publicvoidSetDepartment(Stringdep){department=dep;System.out.println(“我是”+department+”的學(xué)生”);}}publicclassapp8_1//主類{publicstaticvoidmain(Stringargs[]){Studentstu=newStudent();//創(chuàng)建Student對(duì)象stu.SetNameAge(“張小三”,21);//調(diào)用父類的SetNameAge()方法stu.show();//調(diào)用父類的show()方法stu.SetDepartment(“計(jì)算機(jī)系”);//調(diào)用子類SetDepartment{}方法}}【例8.1】續(xù)第10頁,共110頁,2023年,2月20日,星期一程序執(zhí)行的結(jié)果為:調(diào)用了個(gè)人構(gòu)造方法Person()調(diào)用了學(xué)生構(gòu)造方法Student()姓名:張小三年齡:21我是計(jì)算機(jī)的學(xué)生【例8.1】續(xù)第11頁,共110頁,2023年,2月20日,星期一說明:(1)通過extends關(guān)鍵字,可將父類的成員繼承給子類。(2)Java在執(zhí)行子類的構(gòu)造方法之前,會(huì)先自動(dòng)調(diào)用父類中沒有參數(shù)的構(gòu)造方法,其目的是為了幫助繼承自父類的成員做初始化的操作。(3)在嚴(yán)格意義上說,構(gòu)造方法是不能被繼承的,如父Person有一個(gè)構(gòu)造方法Person(String,int),不能說子類Student也自動(dòng)有一個(gè)構(gòu)造方法Person(String,int),但這并不意味著子類不能調(diào)用父類的構(gòu)造方法。第12頁,共110頁,2023年,2月20日,星期一2.調(diào)用父類中特定的構(gòu)造方法【例8.2】調(diào)用父類中某指定的構(gòu)造方法。1

//app8_2.java調(diào)用父類中的特定構(gòu)造方法2

classPerson//定義Person3

{4

privateStringname;5

privateintage;6

publicPerson()//定義無參構(gòu)造方法7

{8

System.out.println(“調(diào)用了Person的無參構(gòu)造方法”);9

}10

publicPerson(Stringname,intage)//定義有參構(gòu)造方法11

{12

System.out.println(“調(diào)用了Person的有參構(gòu)造方法”);13

=name;14

this.age=age;15

}第13頁,共110頁,2023年,2月20日,星期一16

publicvoidshow()17

{18

System.out.println(“姓名:“+name+”年齡:”+age);19

}20

}21

classStudentextendsPerson//定義繼承自Person類的子類Student22

{23

privateStringdepartment;24

publicStudent()//Student的無參構(gòu)造方法25

{26System.out.println(“調(diào)用了學(xué)生的無參構(gòu)造方法Student()”);27

}【例8.2】續(xù)第14頁,共110頁,2023年,2月20日,星期一28

publicStudent(Stringname,intage,Stringdep)29

{30

super(name,age);//調(diào)用父類的有參構(gòu)造方法,在第10行定義的31

department=dep;32

System.out.println(“我是”+department+”的學(xué)生”);33

System.out.println(“調(diào)用了學(xué)生的有參構(gòu)造方法Student(Stringdep)”);34

}35

}36

publicclassapp8_2//主類37

{38

publicstaticvoidmain(Stringargs[])39

{40

Studentstu1=newStudent();//創(chuàng)建對(duì)象,并調(diào)用無參構(gòu)造方法41

Studentstu2=newStudent(“李小四”,23,”信息系”);//調(diào)用有參構(gòu)造方法42

stu1.show();43

stu2.show();44

}45

}【例8.2】續(xù)第15頁,共110頁,2023年,2月20日,星期一【例8.2】續(xù)程序運(yùn)行結(jié)果如下:調(diào)用了Person的無參構(gòu)造方法調(diào)用了學(xué)生的無參構(gòu)造方法Student()調(diào)用了Person的有參構(gòu)造方法我是信息系的學(xué)生調(diào)用了學(xué)生的有參構(gòu)造方法Student(Stringdep)姓名:null年齡:0姓名:李小四年齡:23第16頁,共110頁,2023年,2月20日,星期一課堂練習(xí):分析輸出結(jié)果和程序的構(gòu)造過程第17頁,共110頁,2023年,2月20日,星期一8.1.2在子類中訪問父類的成員格式:super.<變量名>super.<方法名>第18頁,共110頁,2023年,2月20日,星期一Super關(guān)鍵字關(guān)鍵字super,提供了對(duì)父類的訪問。1.可以使用super訪問父類被子類隱藏的變量或覆蓋的方法。2、可以通過Super([參數(shù)表])來調(diào)用父類中特定的構(gòu)造方法。即根據(jù)super()傳入的參數(shù)去調(diào)用父類中指定的構(gòu)造方法,默認(rèn)情況下調(diào)用的是無參構(gòu)造方法。第19頁,共110頁,2023年,2月20日,星期一子類與父類的成員變量與方法

1.子類繼承父類的所有成員變量和方法,但不包括父類中的由private修飾的部分2.子類中新增加的屬性和方法是對(duì)父類的擴(kuò)展3.子類中定義的與父類同名的屬性是對(duì)父類屬性的隱藏,同名的方法是對(duì)父類方法的覆蓋第20頁,共110頁,2023年,2月20日,星期一子類與父類成員變量同名1.子類中定義的成員變量與父類中的成員變量名稱相同;2.子類在引用與父類成員變量同名的此成員變量時(shí),默認(rèn)是引用子類自己定義的成員變量,而將從父類那里繼承而來的成員變量“隱藏”起來;3.如果在子類程序中要引用與子類同名的父類的成員變量時(shí),可以使用“super”關(guān)鍵字來指示;

第21頁,共110頁,2023年,2月20日,星期一1

//app8_3.java用protected修飾符和super關(guān)鍵字訪問父類的成員2

classPerson//定義Person3

{4

protectedStringname;5

protectedintage;6

publicPerson(){}//定義“不做事”的無參構(gòu)造方法7

publicPerson(Stringname,intage)//定義有參構(gòu)造方法8

{9

=name;10

this.age=age;11

}12

protectedvoidshow()13

{14

System.out.println(“姓名:“+name+”年齡:”+age);15

}16

}【例8.3】在子類中訪問父類的成員。第22頁,共110頁,2023年,2月20日,星期一17

classStudentextendsPerson//定義子類Student,其父類為Person18

{19

privateStringdepartment;20

intage=20;//新添加了一個(gè)與父類的成員變量age同名的成員變量21

publicStudent(Stringxm,Stringdep)//定義Student的有參構(gòu)造方法22

{23

name=xm;//在子類里直接訪問父類的protected成員24

department=dep;25

super.age=25;//利用super關(guān)鍵字將父類的成員變量age賦值為2526

System.out.println(“子類Student中的成員變量age=”+age);27

super.show();//去掉super而只寫show()亦可28

System.out.println(“系別:”+department);29

}30

}【例8.3】續(xù)第23頁,共110頁,2023年,2月20日,星期一【例8.3】續(xù)31

publicclassapp8_3//主類32

{33

publicstaticvoidmain(Stringargs[])34

{35

Studentstu=newStudent(“李小四”,”信息系”);36

}37

}程序執(zhí)行結(jié)果為:子類Student中的成員變量age=20姓名:李小四年齡:25系別:信息系第24頁,共110頁,2023年,2月20日,星期一8.1.3覆蓋對(duì)于Java中的方法而言,有兩種特殊的形式,即方法的重載和方法的覆蓋,前面已經(jīng)論述了方法的重載。請(qǐng)同學(xué)們回顧:方法重載的要求?覆蓋(Overriding)也稱為方法的重寫,是指在子類中定義名稱、參數(shù)個(gè)數(shù)與類型均與父類相同的方法,用以重寫父類里同名方法的功能。

第25頁,共110頁,2023年,2月20日,星期一1.覆蓋父類的方法子類在重新定義父類已有的方法時(shí),應(yīng)保持與父類完全相同的方法頭聲明,即應(yīng)與父類有完全相同的方法名、返回值和參數(shù)類型列表。舉例:見【例8.4】第26頁,共110頁,2023年,2月20日,星期一補(bǔ)充:對(duì)象的上轉(zhuǎn)型第27頁,共110頁,2023年,2月20日,星期一對(duì)象的上轉(zhuǎn)型Personp;p=newStudent();Students;s=newStudent();p=s;新增變量新增方法從父類繼承或重寫的變量從父類繼承或重寫的方法

s的上轉(zhuǎn)型對(duì)象S對(duì)象ps第28頁,共110頁,2023年,2月20日,星期一對(duì)象上轉(zhuǎn)型舉例一(1)第29頁,共110頁,2023年,2月20日,星期一對(duì)象上轉(zhuǎn)型舉例一(2)第30頁,共110頁,2023年,2月20日,星期一對(duì)象上轉(zhuǎn)型上轉(zhuǎn)型對(duì)象可通過強(qiáng)制類型轉(zhuǎn)換成為子類對(duì)象。第31頁,共110頁,2023年,2月20日,星期一內(nèi)存分析第32頁,共110頁,2023年,2月20日,星期一對(duì)象上轉(zhuǎn)型舉例二第33頁,共110頁,2023年,2月20日,星期一對(duì)象上轉(zhuǎn)型小結(jié)父類引用可指向子類對(duì)象,方法中的參數(shù)定義為父類對(duì)象引用,實(shí)際傳遞的是子類對(duì)象,再去判斷是哪個(gè)子類,從而去執(zhí)行其方法和成員變量,從而實(shí)現(xiàn)程序的擴(kuò)展性。第34頁,共110頁,2023年,2月20日,星期一多態(tài)多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)的又一重要特性。在java語言中,多態(tài)性體現(xiàn)在兩個(gè)方面:由方法重載實(shí)現(xiàn)的靜態(tài)多態(tài)性(編譯時(shí)多態(tài))多態(tài)和方法重寫實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性(運(yùn)行時(shí)的多態(tài))。目標(biāo):實(shí)現(xiàn)程序的擴(kuò)展性。第35頁,共110頁,2023年,2月20日,星期一運(yùn)行時(shí)的多態(tài)(動(dòng)態(tài)綁定)是指程序運(yùn)行期間,判斷所引用對(duì)象的實(shí)際類型(即在實(shí)際當(dāng)中new的是什么對(duì)象),根據(jù)實(shí)際類型調(diào)用其方法。在程序運(yùn)行期間,如果一個(gè)方法被子類重寫了,且父類的引用指向子類的對(duì)象,則調(diào)用已經(jīng)被重寫的方法(子類中的方法。)例:Test.java第36頁,共110頁,2023年,2月20日,星期一第37頁,共110頁,2023年,2月20日,星期一動(dòng)態(tài)綁定小結(jié)要實(shí)現(xiàn)動(dòng)態(tài)綁定必須具備三個(gè)條件:1.要有繼承2.要有重寫3.父類引用指向子類對(duì)象第38頁,共110頁,2023年,2月20日,星期一2.用父類的變量訪問子類的成員通過父類對(duì)象也可以訪問子類成員。就是因?yàn)楦缸宇惖姆椒ǖ母采w,就產(chǎn)生了Java中的另一個(gè)主要的概念,即多態(tài):也就是在編譯時(shí)并不清楚到底調(diào)用那個(gè)方法,只有在運(yùn)行時(shí)才能最終確定那個(gè)方法被調(diào)用。第39頁,共110頁,2023年,2月20日,星期一【例8.5】利用父類對(duì)象調(diào)用子類中成員。1

//app8_5.java通過父類的對(duì)象來調(diào)用子類的成員2

classPerson//定義Person3

{4

protectedStringname;5

protectedintage;6

publicPerson(Stringname,intage)//定義構(gòu)造方法7

{8

=name;9

this.age=age;10

}11

publicvoidshow()12

{13

System.out.println(“姓名:“+name+”年齡:”+age);14

}15

}第40頁,共110頁,2023年,2月20日,星期一16

classStudentextendsPerson//定義子類Student,其父類為Person17

{18

privateStringdepartment;19

publicStudent(Stringname,intage,Stringdep)//定義構(gòu)造方法20

{21

super(name,age);22

department=dep;23

}24

publicvoidshow()25

{26

System.out.println(“系別:”+department);27

}28

publicvoidsubshow()29

{30

System.out.println(“我在子類中”);31

}32

}【例8.5】續(xù)第41頁,共110頁,2023年,2月20日,星期一33

publicclassapp8_5//主類34

{35

publicstaticvoidmain(Stringargs[])36

{37

Personper=newStudent(“王老五”,24,”電子”);//聲明父類變量per指向?qū)ο?8

per.show();//利用父類對(duì)象per調(diào)用show()方法39

//per.subshow();40

}41}程序執(zhí)行結(jié)果為:系別:電子【例8.5】續(xù)第42頁,共110頁,2023年,2月20日,星期一classA{ publicvoidfun1() { System.out.println("1、A-->publicvoidfun1()"); }

}classBextendsA{ //重寫了fun1()方法

publicvoidfun1() { System.out.println("2、B-->publicvoidfun1()"); } //增加了一個(gè)fun3()方法

publicvoidfun3() { System.out.println("3、B-->publicvoidfun3()"); }}publicclassTest{ publicstaticvoidmain(Stringargs[]) { Aa; a=newB(); //父類引用指向子類對(duì)象

a.fun1();

}}課堂練習(xí):寫出運(yùn)行結(jié)果第43頁,共110頁,2023年,2月20日,星期一8.1.4不可被繼承的成員與最終類如果父類的成員不希望被子類的成員所覆蓋可以將它們聲明為final。如果用final來修飾成員變量,則說明該成員變量是最終變量,即常量,程序中的其他部分可以訪問,但不能修改。第44頁,共110頁,2023年,2月20日,星期一//app8_6.java父類中的final方法不允許覆蓋classAAA{staticfinaldoublepi=3.14;//聲明靜態(tài)常量

publicfinalvoidshow()//聲明最終方法

{System.out.println("pi="+pi);}}classBBBextendsAAA{privateintnum=100;publicvoidshow()//錯(cuò)誤,不可覆蓋父類的方法

{System.out.println("num="+num);}}【例8.6】父類中被聲明為final的成員不可被繼承。第45頁,共110頁,2023年,2月20日,星期一publicclassapp8_6{publicstaticvoidmain(Stringargs[]){BBBex=newBBB();ex.show();}}【例8.6】續(xù)第46頁,共110頁,2023年,2月20日,星期一

最終類

如果一個(gè)類被final修飾符所修飾和限定,那么這個(gè)類就不能有子類,而被定義為final的類通常是一些用來完成某些標(biāo)準(zhǔn)功能的類,如實(shí)現(xiàn)網(wǎng)絡(luò)功能的類InetAddress、Socket等,這些類中的屬性和方法固定下來,不希望通過繼承來改變,保證這個(gè)類所實(shí)現(xiàn)的功能正確無誤。第47頁,共110頁,2023年,2月20日,星期一8.1.5Object類在Java語言中有一個(gè)特殊類Object,該類是java.lang類庫里的一個(gè)類,所有的類都是直接或間接地繼承該類而得到的。

第48頁,共110頁,2023年,2月20日,星期一表8.1Object類常用的方法方法功能說明publicBooleanequals(Objectobj)判斷兩個(gè)類變量所指向的是否為同一個(gè)對(duì)象。publicStringtoString()將調(diào)用toString()方法的對(duì)象轉(zhuǎn)換成字符串。publicfinalClassgetClass()返回調(diào)用getClass()方法的對(duì)象所屬的類。涉及到反射機(jī)制,拿到被自己編譯好的class文件。protectedObjectclone()返回調(diào)用該方法的對(duì)象的一個(gè)副本。第49頁,共110頁,2023年,2月20日,星期一小結(jié)1.由繼承方式創(chuàng)建的類稱為子類,子類將父類的屬性和方法繼承過來,不必重新定義,并且可根據(jù)需要增加新的屬性和方法。2.Java的所有類都直接或間接地繼承自java.lang.Object類。3.super的使用有如下幾種形式:super.變量名:引用父類成員變量。super.方法名(參數(shù)列表):調(diào)用父類成員方法。super(參數(shù)列表):調(diào)用父類構(gòu)造方法,在子類構(gòu)造方法中調(diào)用父類的構(gòu)造方法以實(shí)現(xiàn)對(duì)繼承自父類的成員變量的初始化,第50頁,共110頁,2023年,2月20日,星期一繼承中的final修飾符(續(xù))

1.定義類時(shí),在class關(guān)鍵字前可以加上final修飾符,則這個(gè)類將不能再派生子類,即不能被其它類所繼承。例如:

publicfinalclassA{ ……}則類A不可被繼承。2.聲明類的成員方法時(shí),在返回類型前可以加上final修飾符,則方法所屬的類被繼承時(shí),這個(gè)方法不會(huì)被重寫。例如:

publicfinalvoidmethod(){ ……}第51頁,共110頁,2023年,2月20日,星期一繼承中的final修飾符(續(xù))

3.final修飾成員變量與繼承無關(guān),它表示的是變量一經(jīng)賦值,其值將不能改變,也就是通過final可以定義常量,常量名一般全部大寫。例如:

finalintMAX_NUM=100;如果程序中試圖修改由final修飾的MAX_NUM的值,將會(huì)產(chǎn)生編譯錯(cuò)誤。第52頁,共110頁,2023年,2月20日,星期一作業(yè)與上機(jī)訓(xùn)練要求1、創(chuàng)建父類Animal和子類Dog要求如下:(1)Animal(父類)中定義至少兩個(gè)成員變量,一個(gè)帶參數(shù)的構(gòu)造方法,一個(gè)成員方法。(2)Dog(子類)中定義兩個(gè)以上成員變量,隱藏父類中的一個(gè)成員變量,重寫父類中的一個(gè)成員方法。(3)對(duì)子類進(jìn)行實(shí)例化,輸出對(duì)象的成員變量值(包括從父類繼承而來的變量),調(diào)用對(duì)象的各成員方法(包括從父類繼承來的方法)。2、按要求補(bǔ)充代碼(實(shí)訓(xùn)書p53-57)第53頁,共110頁,2023年,2月20日,星期一提問1:分析輸出結(jié)果,體會(huì)構(gòu)造函數(shù)和一般成員函數(shù)的區(qū)別第54頁,共110頁,2023年,2月20日,星期一提問2:super的使用classFatherClass{publicintvalue;publicvoidf(){value=100;System.out.println("FatherClass.value="+value);}}classChildClassextendsFatherClass{publicintvalue;publicvoidf(){super.f();value=200;System.out.println("ChildClass.value="+value);System.out.println(value);System.out.println(super.value);}}publicclassTestInherit{ publicstaticvoidmain(String[]args){ ChildClasscc=newChildClass(); cc.f(); }}第55頁,共110頁,2023年,2月20日,星期一補(bǔ)充:訪問控制第56頁,共110頁,2023年,2月20日,星期一8.2抽象類與抽象方法為什么要引入抽象類和抽象方法?1.一個(gè)抽象類可以定義一個(gè)統(tǒng)一的編程接口,使其子類表現(xiàn)出共同的狀態(tài)和行為,但各自的細(xì)節(jié)不同。2.子類共有的行為由抽象類中的抽象方法來約束,而子類行為的具體細(xì)節(jié)則通過抽象方法的覆蓋來實(shí)現(xiàn),這種機(jī)制可以增加編程的靈活性。第57頁,共110頁,2023年,2月20日,星期一8.2抽象類用abstract修飾的類被稱為抽象類。所謂抽象類就是沒有具體實(shí)例對(duì)象的類。抽象類通常包括一個(gè)或多個(gè)抽象方法(只有方法說明,沒有方法體),抽象類的子類必須完成父類定義的每一個(gè)抽象方法,除非該子類也是抽象類。它的主要用途是用來描述概念性的內(nèi)容,這樣可以提高開發(fā)效率,更好地統(tǒng)一用戶“接口”。第58頁,共110頁,2023年,2月20日,星期一8.2.1抽象類與抽象方法1.abstractclass類名稱{成員變量;方法();//定義一般方法abstract方法();//定義抽象方法}說明:抽象類中可以包含有一般方法,也可以包含有抽象方法;對(duì)于抽象方法不用完成其代碼實(shí)現(xiàn),而在派生的子類中實(shí)現(xiàn)所有抽象方法。第59頁,共110頁,2023年,2月20日,星期一8.2.2抽象類abstractclassAAnimal { publicStringname; publicintage;publicAAnimal(Stringname,intage) {=name;this.age=age;} publicvoidprint() { System.out.println("名字:"+name); System.out.println("大小:"+age); } publicabstractvoidrun(); publicabstractvoidcry();}第60頁,共110頁,2023年,2月20日,星期一抽象方法與抽象類使用說明(一)含有抽象方法的類必須定義為抽象類。classAAnimal //錯(cuò)誤{ publicStringname; publicintage; publicvoidprint() { System.out.println("名字:"+name); System.out.println("大小:"+age); } publicabstractvoidrun(); publicabstractvoidcry();}第61頁,共110頁,2023年,2月20日,星期一抽象方法與抽象類使用說明(二)1.不能由抽象類直接創(chuàng)建對(duì)象。它只能做為父類使用,由它派生的子類必須實(shí)現(xiàn)抽象類中所有的抽象方法,才能創(chuàng)建對(duì)象。2.抽象方法的實(shí)現(xiàn):子類重寫父類的抽象方法,增加方法體,使之成為一個(gè)非抽象方法。可以空實(shí)現(xiàn)。classTest{ publicstaticvoidmain(String[]args){ AAnimala; a=newAAnimal(); //錯(cuò)誤}}第62頁,共110頁,2023年,2月20日,星期一classDogextendsAAnimal{ Stringtype; publicDog(Stringname,intage) {super(name,age); type="寵物狗"; } publicvoidrun(){System.out.println("狗在跑"); } publicvoidcry() { System.out.println("汪汪叫"); }}

續(xù)第63頁,共110頁,2023年,2月20日,星期一

publicclassTestAAnimal{publicstaticvoidmain(Stringargs[]){Doga=newDog("歡歡",2);a.print();a.cry();a.run();

}}續(xù)第64頁,共110頁,2023年,2月20日,星期一抽象方法與抽象類使用說明(三)1.如果子類沒有實(shí)現(xiàn)抽象基類(父類)中所有的抽象方法,則子類也必須定義成一個(gè)抽象類。即:抽象的子類也必須使用修飾符:abstract2.可以將沒有任何抽象方法的類聲明為abstract,避免由這個(gè)類直接創(chuàng)建任何的對(duì)象。abstractclassDogextendsAAnimal{ Stringtype; publicDog() { type="寵物狗"; }

//publicvoidrun(); publicvoidcry() { System.out.println("汪汪叫"); }}第65頁,共110頁,2023年,2月20日,星期一classBirdextendsAAnimal//定義鳥類繼承動(dòng)物類{Stringtype;

publicBird(Stringname,intage)//構(gòu)造方法初始化 { super(name,age);type=“鳥類”; } publicvoidrun()//實(shí)現(xiàn)父類的抽象方法 { System.out.println(“鳥會(huì)飛"); } publicvoidcry() { System.out.println("嘰嘰喳喳"); }}課堂練習(xí):創(chuàng)建鳥類對(duì)象第66頁,共110頁,2023年,2月20日,星期一思考:抽象類可以用final聲明嗎?第67頁,共110頁,2023年,2月20日,星期一8.2.2抽象類的應(yīng)用由于抽象類的目的是要根據(jù)它的格式來創(chuàng)建新的類,所以抽象類里的抽象方法并沒有定義處理數(shù)據(jù)的方法體,而是要保留給由抽象類派生出的新類來定義。抽象類的應(yīng)用見教材【例8.10】抽象類的應(yīng)用舉例。

第68頁,共110頁,2023年,2月20日,星期一小結(jié)1.用abstract關(guān)鍵字來修飾一個(gè)類時(shí),這個(gè)類叫做抽象類;用abstract來修飾一個(gè)方法時(shí),該方法叫做抽象方法。2.abstract類必須被繼承,abstract方法必須被重寫。3.抽象類不能被實(shí)例化(直接創(chuàng)建對(duì)象)。4.抽象方法只需聲明,而不需實(shí)現(xiàn)(無方法體)。第69頁,共110頁,2023年,2月20日,星期一作業(yè)1.書上練習(xí)112.實(shí)驗(yàn)34第70頁,共110頁,2023年,2月20日,星期一復(fù)習(xí)抽象方法abstract方法,并且沒有方法體。抽象類abstract類,一般含有抽象方法。抽象類的一般用法只能做為父類被繼承,不能直接實(shí)例化。只有通過子類實(shí)現(xiàn)抽象方法后,才能實(shí)例化。一般對(duì)于不同的子類可以有不同的實(shí)現(xiàn)過程。第71頁,共110頁,2023年,2月20日,星期一提問:編寫代碼假設(shè)人分為兩種,一種是工人,另一種是學(xué)生,不管是工人還是學(xué)生,肯定可以說話,但說話的內(nèi)容不一樣。定義抽象類Person,從抽象類派生具體的子類,Worker和Student,并實(shí)現(xiàn)父類的抽象方法。第72頁,共110頁,2023年,2月20日,星期一為什么要引入接口呢?Java中不允許類的多繼承,但在解決實(shí)際問題過程中,僅僅依靠單一繼承在很多情況下都不能將問題的復(fù)雜性表述完整。通過接口可以實(shí)現(xiàn)多繼承。如:Father類有playFootball(),Mother類有sing(),如果采用類的繼承來產(chǎn)生一個(gè)Son類,則它只能從一個(gè)類中繼承。要么繼承Father,要么繼承Mother。第73頁,共110頁,2023年,2月20日,星期一8.3接口的概念第74頁,共110頁,2023年,2月20日,星期一接口的聲明及注意事項(xiàng)如果一個(gè)抽象類中所有的方法都是抽象的,就可以將這個(gè)類用另外一種方式來定義,也就是接口定義。[public]interface接口名稱[extends父接口名列表]{[public][static][final]數(shù)據(jù)類型成員變量名=常量;……[public][abstract]返回值數(shù)據(jù)類型方法名(參數(shù)表);……}幾點(diǎn)說明:1、interface是接口的關(guān)鍵字,定義接口和定義類相似。并被編譯為class文件。2、接口的訪問控制符只有public,如果使用public修飾符,則可以被所有類和接口使用,且接口名與文件名相同。如果不使用public,則接口只能被同一個(gè)包中的類和接口使用。第75頁,共110頁,2023年,2月20日,星期一接口的聲明及注意事項(xiàng)3、接口中所有的方法都是publicabstract即公共的抽象方法。4、接口中可以有數(shù)據(jù)成員,這些數(shù)據(jù)成員默認(rèn)都是publicstaticfinal即公共類常量。第76頁,共110頁,2023年,2月20日,星期一接口聲明實(shí)例publicinterfaceFather//父親會(huì)踢球{ publicabstractvoidplayFootball();}//Mother.java文件名publicinterfaceMother//母親愛唱歌{ publicabstractvoidsing();}//Flyable.java能飛的動(dòng)物publicinterfaceFlyable{ voidfly();}//Talkable.java能說話的動(dòng)物publicinterfaceTalkable{ voidtalk();}第77頁,共110頁,2023年,2月20日,星期一利用接口實(shí)現(xiàn)類的多重繼承所謂多重繼承,是指一個(gè)子類可以有一個(gè)以上的直接父類,該子類可以繼承它所有直接父類的成員。Java雖不支持多重繼承,但可利用接口來實(shí)現(xiàn)比多重繼承更強(qiáng)的功能。一個(gè)類實(shí)現(xiàn)多個(gè)接口時(shí),在implements子句中用逗號(hào)分隔。

利用接口實(shí)現(xiàn)類的多重繼承見教材【例8.13】第78頁,共110頁,2023年,2月20日,星期一接口的實(shí)現(xiàn)與多繼承publicclassSmartChild

implementsFather,Mother{ publicvoidplayFootball() { System.out.println("我會(huì)踢足球!"); } publicvoidsing() { System.out.println("我會(huì)唱歌!"); } publicstaticvoidmain(String[]args) { SmartChildchild=newSmartChild(); child.playFootball(); child.sing(); }}第79頁,共110頁,2023年,2月20日,星期一類實(shí)現(xiàn)接口時(shí)的注意事項(xiàng)注意:在類聲明部分,用implements關(guān)鍵字指明該類將要實(shí)現(xiàn)哪些接口。實(shí)現(xiàn)接口的類必須在類體中給出所有方法的實(shí)現(xiàn),否則該類應(yīng)該聲明為抽象類。接口中的方法都是public的,所以實(shí)現(xiàn)方法時(shí)也必須加上public,否則編譯報(bào)錯(cuò)。第80頁,共110頁,2023年,2月20日,星期一接口的繼承與類相似,接口也有繼承性。定義一個(gè)接口時(shí)可通過extends關(guān)鍵字聲明該新接口是某個(gè)已存在的父接口的派生接口,它將繼承父接口的所有變量與方法。與類的繼承不同的是,一個(gè)接口可以有一個(gè)以上的父接口,它們之間用逗號(hào)分隔,形成父接口列表。

接口繼承例子見教材【例8.12】接口的繼承

。第81頁,共110頁,2023年,2月20日,星期一類實(shí)現(xiàn)接口時(shí)的注意事項(xiàng)總結(jié):1.一個(gè)接口可以繼承另一個(gè)接口2.Java中不允許類的多繼承,但允許接口的多繼承3.在java中一個(gè)類可以實(shí)現(xiàn)多個(gè)接口4.一個(gè)類在繼承另一個(gè)類的同時(shí),可以實(shí)現(xiàn)多個(gè)接口。第82頁,共110頁,2023年,2月20日,星期一接口回調(diào)是指:可以把使用某一接口類創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類實(shí)現(xiàn)的接口中的方法。當(dāng)接口變量調(diào)用被類實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法。接口回調(diào)第83頁,共110頁,2023年,2月20日,星期一

interfaceShowMessage{voiddisplay(Strings);//接口中的方法默認(rèn)都是public}classTVimplementsShowMessage{publicvoiddisplay(Strings)//在使用接口的類中要顯示表示public

{System.out.println(s);}classPCimplementsShowMessage{

publicvoiddisplay(Strings){System.out.println(s);}}第84頁,共110頁,2023年,2月20日,星期一publicclassEXAMP{publicstaticvoidmain(Stringargs[]){ShowMessagesm;//聲明接口變量

sm=newTV();//接口變量中存放對(duì)象的引用

sm.display(“熊貓電視”);//接口回調(diào)

sm=newPC();//接口變量中存放對(duì)象的引用

sm.disply(“IBMPC”);//接口回調(diào)}}第85頁,共110頁,2023年,2月20日,星期一小結(jié)1、接口的概念:如果一個(gè)方法中的所有方法都是抽象的,則可以以接口的形式進(jìn)行定義。2、接口定義:使用interface關(guān)鍵字進(jìn)行定義,數(shù)據(jù)成員隱含修飾符:publicstaticfinal,方法隱含修飾符:publicabstract3、接口實(shí)現(xiàn):通過類來實(shí)現(xiàn),使用implements短語。4、從服務(wù)的角度來考察接口:接口刻畫了一個(gè)一個(gè)具體的服務(wù)條目;接口的實(shí)現(xiàn)者提供相應(yīng)的服務(wù),接口的調(diào)用者享用相應(yīng)的服務(wù)。第86頁,共110頁,2023年,2月20日,星期一接口與抽象類的比較1.接口與抽象類都不能直接實(shí)例化,通過多態(tài)性,由子類實(shí)例化。2.在抽象類中可以有自己的數(shù)據(jù)成員,也可以有非抽象的成員方法,而在接口中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是publicstaticfinal的,不過在接口中一般不定義數(shù)據(jù)成員),所有的成員方法都是抽象的。3.接口與抽象類如此相似,那么該選誰呢?4.從開發(fā)上講,優(yōu)先使用接口,接口允許使用多繼承。第87頁,共110頁,2023年,2月20日,星期一作業(yè)

1.讀程題見TestInterface.txt第88頁,共110頁,2023年,2月20日,星期一作業(yè)(續(xù))2.創(chuàng)建一個(gè)名為Charge(收費(fèi))的接口,其中包含一個(gè)收取費(fèi)用的方法聲明:publicvoidgetCharge();創(chuàng)建類BusCharge使用實(shí)現(xiàn)接口Charge,實(shí)現(xiàn)顯示公共汽車的收費(fèi)標(biāo)準(zhǔn),如“公汽票價(jià):1.2元/張,不計(jì)算公里數(shù)”;創(chuàng)建類TaxiCharge實(shí)現(xiàn)接口Charge,實(shí)現(xiàn)顯示出租車車的收費(fèi)標(biāo)準(zhǔn),如“出租車:1.4元/公里,起價(jià)3元”;創(chuàng)建類CinemaCharge實(shí)現(xiàn)接口Charge,實(shí)現(xiàn)顯示電影院的收費(fèi)標(biāo)準(zhǔn),如“電影票價(jià):20元/張”。創(chuàng)建包含main()方法的測試類,測試BusCharge、TaxiCharge、CinemaCharge類的使用。

第89頁,共110頁,2023年,2月20日,星期一作業(yè)(續(xù))3.實(shí)訓(xùn)書上實(shí)驗(yàn)41

第90頁,共110頁,2023年,2月20日,星期一8.4內(nèi)部類與匿名類內(nèi)部類(InnerClass)是定義在類中的類,內(nèi)部類的主要作用是將邏輯上相關(guān)的類放到一起;而匿名類(AnonymousClass)是一種特殊的內(nèi)部類,它沒有類名,在定義類的同時(shí),就生成該類的一個(gè)實(shí)例,由于不會(huì)在其他地方用到該類,所以不用取名字。

第91頁,共110頁,2023年,2月20日,星期一8.4.1內(nèi)部類內(nèi)部類是包含在類中的類,所以內(nèi)部類也稱為“嵌套類”,包含內(nèi)部類的類又稱為“外部類”。其實(shí)內(nèi)部類可以看作是外部類的一個(gè)成員,所以內(nèi)部類也稱為“成員類”。

第92頁,共110頁,2023年,2月20日,星期一//Group.java內(nèi)部類與外部類的訪問規(guī)則內(nèi)部類外部類publicclassGroup{privateintage;//聲明外部類的私有成員變量

publicclassStudent//聲明內(nèi)部類

{Stringname;//聲明內(nèi)部類的成員變量

publicStudent(Stringn,inta)//定義內(nèi)部類的構(gòu)造方法

{name=n;//訪問內(nèi)部類的成員變量nameage=a;//訪問外部類的成員變量age}publicvoidoutput()//內(nèi)部類的成員方法

{System.out.println(“姓名:”++”;年齡:”+age);}}

【例8.14】內(nèi)部類與外部類的訪問規(guī)則。第93頁,共110頁,2023年,2月20日,星期一publicvoidoutput()//定義外部類的成員方法

{Studentstu=newStudent(“劉洋”,24);//創(chuàng)建內(nèi)部類對(duì)象stustu.output();//通過stu調(diào)用內(nèi)部類的成員方法

}publicstaticvoidmain(Stringargs[]){GroupG=newGroup();G.output();}}【例8.14】續(xù)程序運(yùn)行結(jié)果如下:姓名:劉洋;年齡:24第94頁,共110頁,2023年,2月20日,星期一8.4.2匿名內(nèi)部類匿名內(nèi)部類(anonymousinnerclass),是指可以利用內(nèi)部類創(chuàng)建沒有名稱的對(duì)象,并利用它訪問到類里的成員。

第95頁,共110頁,2023年,2月20日,星期一創(chuàng)建匿名內(nèi)部類并訪問成員的語法格式如下:(//創(chuàng)建匿名內(nèi)部類,并執(zhí)行所定義的方法new類名()//括號(hào)“()”內(nèi)不允許有參數(shù){方法名(參數(shù)1,參數(shù)2,…,參數(shù)n){方法體語句;}}).方法名(參數(shù)1,參數(shù)2,…,參數(shù)n);匿名內(nèi)部類的使用方法見教材【例8.16】

第96頁,共110頁,2023年,2月20日,星期一8.5包包的概念與作用1.Java中,包(package)是相關(guān)類與接口的一個(gè)集合,是一種管理和組織類(包括類和接口)的機(jī)制。2.簡單的來看,包就相當(dāng)于是一個(gè)目錄,其中可以包含類、接口、子包(相當(dāng)于子目錄)。其作用包括:一是能減少類的名稱的沖突問題,二是能分門別類地組織各種類,三是有助于實(shí)施訪問權(quán)限控制,當(dāng)位于不同包的類相互訪問時(shí),會(huì)受到訪問權(quán)限的約束。第97頁,共110頁,2023年,2月20日,星期一8.5包包的概念與作用(續(xù))典型的,Java的類庫就是按有層次的包的方式組織的。

第98頁,共110頁,2023年,2月20日,星期一8.5.2使用package語句創(chuàng)建包1.格式:package包名1[.包名2[.包名3]…];2.注意:包聲明語句(package語句)必須出現(xiàn)在Java源文件的第一行(忽略注釋行)一個(gè)Java源文件只能包含一個(gè)package語句。如果Java文件中沒有package語句,則這個(gè)文件中的類位于默認(rèn)包,默認(rèn)包沒有名字。第99頁,共110頁,2023年,2月20日,星期一8.5.4利用import語句引用Java定義的包位于同一個(gè)包(即同一個(gè)目錄)中的類可以直接相互訪問,不需要做額外操作。但,如果一個(gè)類要訪問來自于另外一個(gè)包中的類,則需要通過import語句將其需要訪問的類引入,否則無法使用別包中的類,編譯時(shí)會(huì)報(bào)錯(cuò)。。第100頁,共110頁,2023年,2月20日,星期一8.5.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論