


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第四章補(bǔ)充案例案例4-1 類的繼承一、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:類的繼承2、練習(xí)目標(biāo)? 了解類繼承的意義和作用? 掌握如何實(shí)現(xiàn)類的繼承3、需求分析在程序中,繼承描述的是事物之間的所屬關(guān)系,通過繼承可以使多種事物之間形成一種關(guān)系體系。為了讓初學(xué)者熟悉類的繼承,本案例將演示類的繼承并編寫測(cè)試類驗(yàn)證子類是否擁有父類的可繼承成 員。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1)設(shè)計(jì)兩個(gè)類 Student和Teacher2) 抽取兩個(gè)類共同的內(nèi)容(如:吃飯、睡覺)封裝到一個(gè)類Person中,各自特有的部分保留在 各自類中。3)讓學(xué)生類繼承 Person類,老師類也繼承 Person。4) 編寫測(cè)試類 Exampl
2、eOl,測(cè)試Student類和Teacher是否繼承了 Person類的成員。、案例實(shí)現(xiàn)1、抽取父類Person,實(shí)現(xiàn)繼承關(guān)系,代碼如下:class Person String name;/ 姓名/吃飯的功能void eat() (”吃飯");/睡覺的功能void sleep() (”睡覺");class Student extends Person /學(xué)號(hào)int sid;class Teacher extends Person / 工號(hào)int tid;/教課的功能void teach() (”老師教課");2、定義測(cè)試類Example01,代碼如下:public
3、 class Example01public static void main(String args) Student s = new Student();s.eat();s.sleep();(”");Teacher t = new Teacher();t.eat();t.sleep();t.teach();運(yùn)行結(jié)果如圖4-1所示。77 営即黃.t . M j ca J. u w-IDI*1D : y Mi plir Frtfc kn-stf SJh豊p臚IM曲屮 Ejtimu-lvHL 時(shí)F±JML囁*I2J圖4-1運(yùn)行結(jié)果三、案例總結(jié)1、在Java中,多個(gè)類可以繼承一
4、個(gè)父類,但是一個(gè)類不能直接繼承多個(gè)類,一個(gè)類只能有一個(gè)直接 父類。2、父類是由子類不斷抽取而來的,不斷地抽取就形成了體系結(jié)構(gòu),這個(gè)結(jié)構(gòu)稱為繼承體系結(jié)構(gòu)。3、子類在繼承父類的時(shí)候,會(huì)自動(dòng)擁有父類所有的成員。4、繼承的好處是劃分了類的層次性,實(shí)現(xiàn)了代碼重用、擴(kuò)展了程序功能。案例4-2方法的重寫、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:方法的重寫2、練習(xí)目標(biāo)?了解方法重寫的意義和作用? 掌握如何進(jìn)行方法重寫3、需求分析在繼承關(guān)系中,子類會(huì)自動(dòng)繼承父類中定義的方法,但有時(shí)在子類中需要對(duì)繼承的方法進(jìn)行一些 修改,即對(duì)父類的方法進(jìn)行重寫。為了讓初學(xué)者掌握方法的重寫,本案例將編寫一個(gè)類NewPho ne,該類繼承
5、Phone類并對(duì)Phone類的call()方法進(jìn)行重寫。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 定義一個(gè)類 Phone,編寫方法call(),表示打電話功能2) 定義一個(gè)Phone的子類NewPhone,重寫父類call()方法,讓它除了打電話功能外還具有開啟語 言和關(guān)閉語言功能。3) 編寫一個(gè)測(cè)試類 Example02,分別調(diào)用重寫前和重寫后的call()方法、案例實(shí)現(xiàn)1、定義Phone及其子類NewPhone,子類對(duì)父類中的 call()方法重寫,代碼如下: class Pho ne void call() 打電話");class NewPh one exte nds Pho ne voi
6、d call() 開啟語音");super.call();關(guān)閉語音");2、定義測(cè)試類 Example02,代碼如下:public class Example02public static void main( Str in g args) 重寫前-");Phone phone = new Pho ne();pho ne.call();重寫后-");Phone n ewPho ne = new NewPho ne(); n ewPh on e.call();運(yùn)行結(jié)果如圖4-2所示。圖4-2運(yùn)行結(jié)果三、案例總結(jié)1、子類中需要對(duì)繼承自父類的方法進(jìn)行一些修改,
7、這時(shí)就用到方法重寫。2、在子類中重寫的方法需要和父類被重寫的方法具有相同的方法名、參數(shù)列表以及返回值類型。3、子類方法的訪問修飾權(quán)限不能小于父類的。4、重寫的主要優(yōu)點(diǎn)是能夠定義子類特有的特征。案例4-3 super訪問父類成員變量一、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:super關(guān)鍵字2、練習(xí)目標(biāo)? 掌握使用super關(guān)鍵字訪問父類成員變量3、需求分析子類可以繼承父類的非私有成員變量,如果在子類中修改了繼承自父類的成員變量的值,再想要 訪問父類的該成員變量時(shí),可以通過super.成員變量來實(shí)現(xiàn)。為了讓初學(xué)者熟悉super關(guān)鍵字的用法,本案例將分別設(shè)計(jì) Fu類及其子類Zi,并在Zi類的方法中使用s
8、uper關(guān)鍵字訪問Fu類的成員變量。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Fu類,在類中定義無參構(gòu)造和一個(gè)初始值為20的num成員變量。2)Zi類繼承Fu類,在子類中對(duì) num值進(jìn)行了修改,同時(shí)在子類中定義無參構(gòu)造和一個(gè)無返回值的method。方法,method。方法中使用super關(guān)鍵字調(diào)用了 Fu類的num成員變量。3)定義測(cè)試類Example03。、案例實(shí)現(xiàn)1、編寫Fu類及其子類Zi,在Zi類中使用super關(guān)鍵字調(diào)用Fu類成員變量,代碼如下 class Fu Fu() int num = 20;class Zi exte nds Fu Zi() int num = 30;/修改 num
9、 的值void method。/ super關(guān)鍵字調(diào)用父類成員變量類中 num 值為:"+ super.num);類中 num 值為:"+ num);2、定義測(cè)試類 Example03,代碼如下:class Example03public static void main( Str in g args) 乙 z = new Zi();z.method();運(yùn)行結(jié)果如圖4-3所示。圖4-3運(yùn)行結(jié)果三、案例總結(jié)1、使用super關(guān)鍵字調(diào)用父類的成員方法。具體格式如下: super. 成員變量2、 被調(diào)用的父類成員變量,必須是非private的。案例4-4 super訪問父類成員
10、方法、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:super關(guān)鍵字2、練習(xí)目標(biāo)?掌握使用super關(guān)鍵字訪問父類成員方法3、需求分析子類重寫父類的方法后,子類對(duì)象將無法訪問父類被重寫的方法,為了解決這個(gè)問題,在Java中專門提供了一個(gè) super關(guān)鍵字用于訪問父類的成員。為了讓初學(xué)者熟悉 super關(guān)鍵字的用法,本案例將 分別設(shè)計(jì)Fu類及其子類Zi,在Zi類的方法中使用super關(guān)鍵字訪問Fu類的成員方法。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Fu類,在類中定義無參構(gòu)造和一個(gè)無返回值的show()方法。2) Zi類繼承Fu類,子類中定義無參構(gòu)造和一個(gè)無返回值的method。方法,method。方法中使用
11、 super關(guān)鍵字調(diào)用了 Fu類的show()方法。3) 定義測(cè)試類Example04。、案例實(shí)現(xiàn)1、編寫Fu類及其子類Zi,在Zi類中使用super關(guān)鍵字調(diào)用Fu類成員方法,代碼如下:class Fu Fu() void show() class Zi exte nds Fu Zi() void method() / super關(guān)鍵字調(diào)用父類成員方法super.show();2、定義測(cè)試類 Example04,代碼如下:class Example04public static void main( Str in g args) 乙 z = new Zi();z.method();運(yùn)行結(jié)果如圖
12、4-4所示。圖4-4運(yùn)行結(jié)果三、案例總結(jié)1、使用super關(guān)鍵字調(diào)用父類的成員方法。具體格式如下: super.成員方法(參數(shù)1,參數(shù)2)2、 被調(diào)用的父類成員方法,必須是非private的。案例4-5 super訪問父類構(gòu)造方法、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:super關(guān)鍵字2、練習(xí)目標(biāo)? 掌握如何在子類構(gòu)造方法中使用super關(guān)鍵字訪問父類構(gòu)造方法3、需求分析在子類的構(gòu)造方法中一定會(huì)調(diào)用父類的某個(gè)構(gòu)造方法,如果想指定調(diào)用類父類中的哪個(gè)構(gòu)造方法,可以使用super關(guān)鍵字來實(shí)現(xiàn)。為了讓初學(xué)者掌握super關(guān)鍵字的用法,本案例將分別設(shè)計(jì)Fu類及其子類Zi,在Zi類的構(gòu)造方法中使用 super
13、關(guān)鍵字訪問Fu類的構(gòu)造方法。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Fu類,在類中定義無參構(gòu)造。2) Zi類繼承Fu類,子類中也定義無參構(gòu)造方法,在構(gòu)造方法中使用super關(guān)鍵字調(diào)用Fu類的構(gòu) 造方法。3)定義測(cè)試類Example05。、案例實(shí)現(xiàn)1、編寫Fu類及其子類Zi,在Zi類構(gòu)造中使用super關(guān)鍵字調(diào)用Fu類構(gòu)造方法,代碼如下: class Fu 類構(gòu)造方法門;Fu() class Zi exte nds Fu Zi() super();在子類構(gòu)造中調(diào)用父類構(gòu)造類構(gòu)造方法!");2、定義測(cè)試類 Example05,代碼如下:public class Example05publi
14、c static void main( Str in g args) Zi zi = new Zi();運(yùn)行結(jié)果如圖4-5所示。圖4-5運(yùn)行結(jié)果三、案例總結(jié)1、通過super調(diào)用父類構(gòu)造方法的代碼必須位于子類構(gòu)造方法的第一行,并且只能出現(xiàn)一次。2、 在子類的構(gòu)造方法中通過super指定調(diào)用父類的哪個(gè)構(gòu)造方法,如果沒有指定,在實(shí)例化子類對(duì)象 時(shí),會(huì)自動(dòng)調(diào)用父類無參的構(gòu)造方法。3、 被調(diào)用的父類構(gòu)造方法,必須是非private的。案例4-6 final修飾類、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:final關(guān)鍵字2、練習(xí)目標(biāo)? 了解final關(guān)鍵字修飾類的特點(diǎn)? 掌握final關(guān)鍵字修飾類的用法3、需
15、求分析Java中的類被final關(guān)鍵字修飾后,該類將不可以被繼承,也就是不能夠派生子類。為了讓初學(xué)者1 )編寫一個(gè)final關(guān)鍵字修飾的Fu類,類體可以為空2) 編寫Zi類,Zi類繼承于Fu類,類體可以為空3) 定義測(cè)試類Example06。、案例實(shí)現(xiàn)1、編寫final修飾的Fu類,Zi類繼承Fu類,代碼如下:final class Fu /類體為空代碼/Zi 類繼承final 修飾的Fu類class Zi extends Fu /類體為空代碼2、定義測(cè)試類 Example06,代碼如下:public class Example06public static void main(String
16、args) Zi zi = new Zi();運(yùn)行結(jié)果如圖4-6所示。圖4-6運(yùn)行結(jié)果三、案例總結(jié)在Java中,被final關(guān)鍵字修飾的類為最終類,不能被其它類繼承。案例4-7 final修飾方法一、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:final關(guān)鍵字2、練習(xí)目標(biāo)? 掌握使用final關(guān)鍵字修飾方法3、需求分析為了final子類可以繼承父類的成員方法,并在必要時(shí)對(duì)方法進(jìn)行重寫,增加了方法的擴(kuò)展的同時(shí)也打破了方法的封裝,如果我們希望父類中的某些方法不能被重寫,這時(shí)就可以使用final關(guān)鍵字來修飾。讓初學(xué)者掌握使用final關(guān)鍵字修飾方法,本案例將分別設(shè)計(jì)兩個(gè)類,一個(gè)是Fu類,其中定義了修飾的sho
17、w()方法,另一個(gè)是繼承Fu類的Zi類,在Zi類中對(duì)show()方法進(jìn)行重寫。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Fu類,類中定義final修飾的show()方法。2) 編寫Zi類,Zi類繼承于Fu類,在Zi類中對(duì)show()方法進(jìn)行重寫3) 定義測(cè)試類 Example07,創(chuàng)建Zi類對(duì)象,并調(diào)用 Zi類show()方法。、案例實(shí)現(xiàn)1、 編寫Fu類及其子類Zi類,在Zi類中對(duì)show()方法重寫,代碼如下: class Fu /final 關(guān)鍵字修飾的方法public final void show() (”這是絕密資源”);class Zi extends Fu /重寫父類中final修飾
18、的方法public void show() (”這是一堆垃圾,給處理了 ");2、 定義測(cè)試類Example07,代碼如下:public class Example07public static void main(String args) Zi z = new Zi();z.show();運(yùn)行結(jié)果如圖4-7所示。圖4-7運(yùn)行結(jié)果三、案例總結(jié)當(dāng)一個(gè)類的方法被 final關(guān)鍵字修飾后,這個(gè)類的子類將不能重寫該方法。案例4-8 final修飾局部變量、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:final關(guān)鍵字2、練習(xí)目標(biāo)?掌握使用final關(guān)鍵字修飾局部變量3、需求分析Java中被final修飾
19、的變量為常量,它只能被賦值一次,也就是說final修飾的變量一旦被賦值,其值不能改變。為了讓初學(xué)者掌握使用final關(guān)鍵字修飾局部變量,本案例將在類的方法中定義一個(gè)final修飾的局部變量,并試著對(duì)該變量重新賦值。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Example08類,類中定義類一個(gè)final修飾的局部變量 age,為其賦初始值為18。2 )為age重新賦值為20。、案例實(shí)現(xiàn)1、編寫類Example08,代碼如下 public class Example08public static void main(String args) final int age = 18; /第一次可以賦值ag
20、e = 20;/再次賦值會(huì)報(bào)錯(cuò)編譯錯(cuò)誤,如圖4-8所示。圖4-8錯(cuò)誤提示三、案例總結(jié)final修飾的變量表示常量,一經(jīng)定義就不能重新賦值。案例4-9 final修飾成員變量、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:final關(guān)鍵字2、練習(xí)目標(biāo)? 掌握使用final關(guān)鍵字修飾成員變量3、需求分析final修飾在Java中,final修飾的變量表示常量,一經(jīng)定義就不能重新賦值。為了讓初學(xué)者熟悉 變量的情況,本案例將使用final關(guān)鍵字修飾成員變量,觀察其是否能夠再次賦值。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )編寫一個(gè)Fu類,父類中定義一個(gè)變量X,并用final關(guān)鍵字修飾變量。2)編寫Zi類,Zi類繼承于Fu類,
21、在子類中對(duì)常量再賦新值。3)定義測(cè)試類Example09,觀察運(yùn)行結(jié)果。、案例實(shí)現(xiàn)1、編寫Fu類及其子類Zi類,在Zi類中對(duì)X再賦值,代碼如下: class Fu /final修飾的變量,也就是常量public final int X = 10;class Zi extends Fu X = 20;/在子類中對(duì)常量再賦新值public void method() 2、 定義測(cè)試類Example09,代碼如下:public class Example09public static void main(String args) Zi z = new Zi();z.method();編譯錯(cuò)誤,結(jié)果如
22、圖 4-9所示。圖4-9錯(cuò)誤提示三、案例總結(jié)在本案例中Zi類中對(duì)變量X再次賦值,運(yùn)行結(jié)果報(bào)錯(cuò)。這是因?yàn)镴ava中被final修飾的變量為常量,它只能被賦值一次,也就是說final修飾的變量一旦被賦值,其值不能改變。如果再次對(duì)該變量進(jìn)行賦值,則程序會(huì)在編譯時(shí)報(bào)錯(cuò)。案例4-10 接口的實(shí)現(xiàn)、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:接口2、練習(xí)目標(biāo)?掌握如何實(shí)現(xiàn)接口3、需求分析由于接口中的方法都是抽象方法,因此不能通過實(shí)例化對(duì)象的方式來調(diào)用接口中的方法。此時(shí)需 要定義一個(gè)類,并使用implements關(guān)鍵字實(shí)現(xiàn)接口中所有的方法。為了上初學(xué)者掌握如何實(shí)現(xiàn)接口, 本案例將設(shè)計(jì)一個(gè)類,使用關(guān)鍵字implemen
23、ts實(shí)現(xiàn)Inter接口中的方法。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )設(shè)計(jì)名為Inter的接口,接口中定義一個(gè)初始值為20的num常量和method()抽象方法。2)編寫Inter接口的實(shí)現(xiàn)類InterImpl,使用implements關(guān)鍵字實(shí)現(xiàn)接口中的方法。3)編寫測(cè)試類Example10,測(cè)試類中對(duì)接口的實(shí)現(xiàn)類進(jìn)行實(shí)例化,并調(diào)用接口中的方法。、案例實(shí)現(xiàn)1、編寫接口 In ter,In terImpl類使用impleme nts實(shí)現(xiàn)了接口,代碼如下: /定義一個(gè)接口interface Inter int num = 20;void method();/ 使用implements關(guān)鍵字實(shí)現(xiàn)接口clas
24、s InterImpl implements Inter void show() public void method() 2、定義測(cè)試類 Example10,代碼如下: class Example10public static void main(String args) /通過實(shí)現(xiàn)類實(shí)例化InterImpl ii = new InterImpl();ii.show();ii.method();運(yùn)行結(jié)果如圖4-10所示。-nJ xId - AmpLataickage chapta LxanplelU28lintnet hod圖4-10運(yùn)行結(jié)果三、案例總結(jié)1、接口使用in terface關(guān)鍵字
25、來定義。2、 接口沒有構(gòu)造方法,接口中的變量缺省都是使用public static final修飾的,即全局常量,接口中的 方法都是public abstract修飾的,即抽象方法。3、 定義一個(gè)類,并使用implements關(guān)鍵字實(shí)現(xiàn)接口中的方法,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。4、由于接口中的方法都是抽象方法,因此不能直接通過實(shí)例化對(duì)象的方式來調(diào)用接口中的方法,需 要在類實(shí)現(xiàn)接口后借助類來間接實(shí)例化。案例4-11 接口的繼承一、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:接口的繼承與多實(shí)現(xiàn)2、練習(xí)目標(biāo)? 掌握接口繼承的方式及其特點(diǎn)3、需求分析解,本案例將演示接口與接口、類與接口的繼承和實(shí)現(xiàn)關(guān)系。4、設(shè)計(jì)思路
26、(實(shí)現(xiàn)原理)1 )設(shè)計(jì)接口 Phone代表傳統(tǒng)手機(jī),在接口中定義receiveMessages()和call()抽象方法。2) 設(shè)計(jì)接口 SmartPhone代表智能手機(jī),在接口中定義faceTime()方法,并使用extends關(guān)鍵字繼 承Phone接口,使其具有 Phone接口的所有功能。3) 設(shè)計(jì)類MIPhone表示小米手機(jī),類中定義useMIUI()方法,并實(shí)現(xiàn)SmartPhone接口的所有方法。4) 編寫測(cè)試類Example",測(cè)試類中對(duì) MIPhone進(jìn)行實(shí)例化,并訪問小米手機(jī)具有的各種功能。、案例實(shí)現(xiàn)1、編寫接口 Phone和 SmartPhone、類 MIPhone。
27、代碼如下: interface Phone void receiveMessages();void call();interface SmartPhone extends Phone void faceTime();class MIPhone implements SmartPhone public void receiveMessages() (”接收短息");public void call() (”語音通話");public void faceTime() (”視頻通話");public void useMIUI() (”使用 MIUI");2、定
28、義測(cè)試類 Example",代碼如下:public class Example11 public static void main(String args) MIPhone miPhone = new MIPhone();miPhone.receiveMessages();miPhone.call();miPhone.faceTime();miPhone.useMIUI();運(yùn)行結(jié)果如圖4-11所示。aceeFa即魯ulaln短逼通MI9:馬吾11-£ 口|圖4-11運(yùn)行結(jié)果三、案例總結(jié)接口與接口之間的繼承關(guān)系,可以是單繼承,也可以是多繼承;一個(gè)接口可以通過extends關(guān)
29、鍵字繼承多個(gè)接口,接口之間用逗號(hào)隔開。案例 4-12 Object 類、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:Object類2、練習(xí)目標(biāo)?了解什么是Object類? 掌握Object類中常用方法的使用3、需求分析在JDK中提供了一個(gè) Object類,它是所有類的父類,即每個(gè)類都直接或間接繼承自該類。Object類自身的equals()方法比較的是內(nèi)存地址值,相當(dāng)于"=”,但是在實(shí)際開發(fā)中我們很少比較兩個(gè)對(duì)象的地址值,這時(shí)候常常就需要根據(jù)自身需求來重寫equals()方法。為了方便初學(xué)者學(xué)習(xí)Object類,本案例將演示如何重寫equals()方法。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 設(shè)計(jì)Stud
30、ent類,定義sid變量表示學(xué)號(hào),重寫equals()方法,判斷進(jìn)行比較的兩個(gè)學(xué)生對(duì)象學(xué) 號(hào)是否相同,相同即為同一個(gè)學(xué)生,否則不是。2) 編寫測(cè)試類 Example12,創(chuàng)建兩個(gè) Student的對(duì)象Lily和Lucy,并分別調(diào)用setter方法為學(xué)號(hào)賦值,最后通過打印語句,輸出這兩個(gè)對(duì)象通過“=”和重寫后的equals()方法比較后的結(jié)果。、案例實(shí)現(xiàn)1、編寫Student類,重寫equals()方法。代碼如下: class Student Student() /學(xué)號(hào)private int sid;public void setSid(int sid) this.sid = sid;publi
31、c int getSid() return sid;/我們的需求是學(xué)號(hào)相同的人就是同一個(gè)人.public boolean equals(Object obj)/判斷是否為當(dāng)前對(duì)象if (this = obj) return true;/為了呈現(xiàn)的健壯性,加入類型判斷if (!(obj instanceof Student) return false;Student s = (Student) obj;return (this.sid = s.sid);2、定義測(cè)試類 Example12,為學(xué)號(hào)賦值,并打印使用"=”和重寫equals()方法的比較結(jié)果,代碼如 下:public cla
32、ss Example12 public static void main(String args) Student Lily = new Student();Lily.setSid(200);Student Lucy = new Student();Lucy.setSid(200);運(yùn)行結(jié)果如圖4-12所示。圖4-12運(yùn)行結(jié)果三、案例總結(jié)1、Object類是Java中所有類的父類,每個(gè)類都直接或間接繼承自該類。2、 Object類中的equals()方法比較的是內(nèi)存地址值,和"=”比較結(jié)果一致。底層代碼如下:public boolean equals(Object obj) retu
33、rn (this = obj);實(shí)際開發(fā)中很少比較內(nèi)存地址值,所以我們常常會(huì)根據(jù)自身需求重寫equals()方法。案例4-13 多態(tài)的作用一、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:多態(tài)2、練習(xí)目標(biāo)?了解多態(tài)的概念、多態(tài)的好處和弊端?掌握如何實(shí)現(xiàn)多態(tài)3、需求分析在Java中為了實(shí)現(xiàn)多態(tài),允許使用一個(gè)父類類型的變量來引用一個(gè)子類類型的對(duì)象,根據(jù)被引用 子類對(duì)象特征的不同,得到不同的運(yùn)行結(jié)果。多態(tài)提高代碼了的擴(kuò)展性和可維護(hù)性。為了幫助初學(xué)者 掌握如何實(shí)現(xiàn)多態(tài),本案例將實(shí)現(xiàn)一個(gè)多態(tài)程序來演示如何實(shí)現(xiàn)多態(tài)。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫Animal接口,接口中定義sleep()方法。2) Cat類實(shí)現(xiàn)
34、Animal接口的方法,并定義另一個(gè)方法catchMouse()3) 編寫測(cè)試類Example13,使Cat對(duì)象指向父類 Animal的引用,并通過該引用調(diào)用sleep()方法。二、案例實(shí)現(xiàn)1、編寫Animal接口及其實(shí)現(xiàn)類 Cat。代碼如下:interface Animal void sleep();class Cat implements Animal void catchMouse() (”抓老鼠");public void sleep() (”睡覺");2、 定義測(cè)試類 Example13, Cat對(duì)象指向Animal引用,并使用父類Animal引用調(diào)用sleep(
35、)方法。代 碼如下:public class Example13 public static void main(String args) / 多態(tài)Animal animal = new Cat(); animal.sleep();運(yùn)行結(jié)果如圖4-13所示。圖4-13運(yùn)行結(jié)果三、案例總結(jié)1、 多態(tài)是指對(duì)象在不同時(shí)刻表現(xiàn)出來的不同狀態(tài),在Java中,允許使用一個(gè)父類類型的變量來引用 一個(gè)子類類型的對(duì)象。2、多態(tài)的前提:(1) 要有繼承關(guān)系。(2) 要有方法重寫。(3) 要有父類引用指向子類對(duì)象。3、多態(tài)的好處是提高代碼的擴(kuò)展性和可維護(hù)性。4、多態(tài)的弊端是父類或者接口只能調(diào)用自己具備的成員,不能訪
36、問子類特有的成員。案例4-14對(duì)象的類型轉(zhuǎn)換、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:對(duì)象的類型轉(zhuǎn)換2、練習(xí)目標(biāo)?掌握如何實(shí)現(xiàn)對(duì)象的類型轉(zhuǎn)換3、需求分析在多態(tài)的學(xué)習(xí)中,涉及到將子類對(duì)象當(dāng)做父類類型使用的情況,這時(shí)進(jìn)行強(qiáng)制類型轉(zhuǎn)換可能會(huì)出 現(xiàn)出錯(cuò)。為了讓初學(xué)者熟悉對(duì)象的類型轉(zhuǎn)換,本案例將演示一個(gè)子類與父類之間類型轉(zhuǎn)換過程中出現(xiàn) 的錯(cuò)誤。編寫一個(gè)接口 Animal,接口中定義sleep()方法,編寫兩個(gè)類 Cat和Pig分別實(shí)現(xiàn)接口,再編寫一 個(gè)測(cè)試類Example14實(shí)現(xiàn)對(duì)象的類型轉(zhuǎn)換。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫Animal接口,接口中定義 sleep()方法。2) Cat類和Pig類分別實(shí)現(xiàn)
37、 Animal接口的方法3) 編寫測(cè)試類Example14對(duì)對(duì)象的類型進(jìn)行轉(zhuǎn)換, 使Cat向上轉(zhuǎn)型為Animal類型,然后再讓Animal 類型轉(zhuǎn)換為Pig類型。二、案例實(shí)現(xiàn)1、編寫Animal接口及其實(shí)現(xiàn)類 Cat。代碼如下:interface Animal void sleep();class Cat implements Animal public void sleep() (”貓晚上睡覺");class Pig implements Animal public void sleep() (”豬整天睡覺");2、 定義測(cè)試類 Example14, Cat對(duì)象指向Ani
38、mal引用,并使用父類Animal引用調(diào)用sleep()方法。代 碼如下:public class Example14 public static void main(String args) Animal animal = new Cat();Pig pig = (Pig) animal;pig.sleep();運(yùn)行結(jié)果如圖4-14所示。圖4-14錯(cuò)誤提示三、案例總結(jié)1、向下類型轉(zhuǎn)換時(shí),需要注意被轉(zhuǎn)換對(duì)象的真實(shí)類型是否和需要轉(zhuǎn)換的對(duì)象類型相同,否則容易報(bào) 類型轉(zhuǎn)換異常。2、 Java提供了一個(gè)關(guān)鍵字instanceof,它可以判斷一個(gè)對(duì)象是否為某個(gè)類(或接口)的實(shí)例或者子類實(shí) 例,語法格式如
39、下:對(duì)象(或者對(duì)象引用變量)instanceof 類(或接口)3、進(jìn)行向上類型轉(zhuǎn)換,子類對(duì)象當(dāng)做父類類型使用時(shí),不能通過父類變量去調(diào)用子類中某些方法, 否則會(huì)拋出編譯異常。案例4-15 匿名內(nèi)部類、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:匿名內(nèi)部類2、練習(xí)目標(biāo)? 了解什么是匿名內(nèi)部類?掌握如何使用匿名內(nèi)部類3、需求分析在學(xué)習(xí)接口時(shí),如果方法的參數(shù)被定義為一個(gè)接口類型,那么就需要定義一個(gè)類來實(shí)現(xiàn)接口。除 此之外,還可以使用匿名內(nèi)部類來實(shí)現(xiàn)接口。為了讓初學(xué)者能更好地理解什么是匿名內(nèi)部類,本案例 將演示如何實(shí)現(xiàn)一個(gè)匿名內(nèi)部類。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1 )設(shè)計(jì)一個(gè)In ter接口,接口中定義 show()
40、和method。方法。2) 設(shè)計(jì)一個(gè) Outer類,在類的function()方法中使用匿名內(nèi)部類實(shí)現(xiàn)Inter接口并實(shí)例化,并調(diào)用 show()和 method()方法。3) 最后編寫一個(gè)測(cè)試類Example15,創(chuàng)建Outer的對(duì)象并調(diào)用function。方法。、案例實(shí)現(xiàn)1、編寫Inter接口及Outer類,使用匿名內(nèi)部類實(shí)現(xiàn)接口并創(chuàng)建對(duì)象。代碼如下:interface Inter void show();void method();class Outer void function。Inter i = new Inter() public void show() public void
41、method() ;i. show();i.method();2、定義測(cè)試類 Example15。代碼如下:public class Example15 public static void main(String args) Outer o = new Outer(); o.function();運(yùn)行結(jié)果如圖4-15所示。圖4-15運(yùn)行結(jié)果三、案例總結(jié)1、匿名內(nèi)部類的格式,具體如下:new父類(參數(shù)列表)或 父接口 ()/匿名內(nèi)部類實(shí)現(xiàn)部分2、匿名內(nèi)部類是實(shí)現(xiàn)接口的一種簡(jiǎn)便寫法,在程序中不一定非要使用匿名內(nèi)部類。3、什么時(shí)候使用匿名內(nèi)部類:通常在使用方法是接口類型參數(shù),并該接口中的方法不超過
42、三個(gè)時(shí), 可以將匿名內(nèi)部類作為參數(shù)傳遞。4、內(nèi)部類:(1) 將一個(gè)類B定義在另一個(gè)類 A的里面,那么B類就稱為內(nèi)部類(嵌套類),內(nèi)部類定義在成員位置 上。(2) 內(nèi)部類可以直接訪問外部類中的成員,包括私有成員,而外部類要訪問內(nèi)部類中的成員必須要建 立內(nèi)部類的對(duì)象。案例 4-16 try.catch 語句一、案例描述1、考核知識(shí)點(diǎn) 編號(hào):名稱:try.catch 和 fin ally2、練習(xí)目標(biāo)? 掌握如何使用try.catch語句進(jìn)行異常處理3、需求分析Java中提供了一種對(duì)異常進(jìn)行處理的方式異常捕獲,異常捕獲通常使用trycatch語句。為了讓初學(xué)者熟悉trycatch語句,本案例將演示如何
43、使用try.catch語句處理遍歷時(shí)可能出現(xiàn)的數(shù)組角標(biāo)越界異常。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1)編寫測(cè)試類 Example16 ,2) 在類Example16中定義名為arr的int類型一維數(shù)組,遍歷數(shù)組輸出每次遍歷出的值,結(jié)束輸 出"over”。2)使用trycatch語句處理遍歷時(shí)可能出現(xiàn)的數(shù)組角標(biāo)越界異常,如果出現(xiàn)異常輸出“角標(biāo)越界、案例實(shí)現(xiàn)public class Example16 public static void main(String args) int arr = 1,2, 3, 4, 5 ;try 程序繼續(xù)向下執(zhí)行.");角標(biāo)越界");運(yùn)行結(jié)果如
44、圖4-16所示。圖4-16運(yùn)行結(jié)果三、案例總結(jié)try1、 try代碼塊中編寫可能發(fā)生異常的Java語句,catch代碼塊中編寫針對(duì)異常進(jìn)行處理的代碼。在 代碼塊中,發(fā)生異常語句后面的代碼是不會(huì)被執(zhí)行的。2、 可能發(fā)生多個(gè)異常時(shí),可以使用多個(gè)try.catch或者用一個(gè)try多個(gè)catch。3、Throwable:是異常體系的超類.卜-Error重大的錯(cuò)誤,這個(gè)問題發(fā)生后,一般我們處理不了,一般不處理,而是要程序進(jìn)行 修正。(內(nèi)存溢出)(異常處理)卜-Exception可以處理的問題,這個(gè)問題需要我們編寫針對(duì)性的代碼進(jìn)行處理。案例4-17 finally語句、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:t
45、ry.catch 和 fin ally2、練習(xí)目標(biāo)? 掌握如何使用fin ally語句3、需求分析catch語句在程序中,有時(shí)候我們希望有些語句無論程序是否發(fā)生異常都要執(zhí)行,這時(shí)就可以在try -語句后,加一個(gè)fin ally代碼塊。為了讓初學(xué)者熟悉 fin ally代碼塊,本案例將演示如何使用 fin ally 來保證不論是否異常都輸出一句話。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1)編寫 Example17 類10/0,2)在main方法中使用tycatchfinally語句,其中try語句塊中編寫可能發(fā)生異常的語句如果不異常輸出“程序繼續(xù)”,如果異常在catch語句塊中會(huì)輸出“出異常類”3) 在fin
46、 ally語句塊中輸出“釋放資源”,保證保證不論是否異常一定輸出此語句、案例實(shí)現(xiàn)public class Example17 public static void main(String args) try / 0);/以下3行代碼不執(zhí)行。try中,發(fā)生異常語句后面的代碼是不會(huì)被執(zhí)行的程序繼續(xù)");System.exit(0);return; catch (ArithmeticException e) e.printStackTrace();(”出異常了 ”);return; finally /finally語句均會(huì)執(zhí)行,除非在這之前執(zhí)行System.exit(0); 退出了 JVM
47、釋放資源");運(yùn)行結(jié)果如圖4-17所示。圖4-17錯(cuò)誤提示三、案例總結(jié)fin ally中的代碼塊在一種情無論是否發(fā)生異常,fin ally代碼塊是一定會(huì)執(zhí)行的。但是需要注意的是, 況下不會(huì)執(zhí)行,那就是在執(zhí)行到fin ally語句之前執(zhí)行了System.exit(O)語句。案例4-18 throws 關(guān)鍵字、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:throws關(guān)鍵字2、練習(xí)目標(biāo)? 掌握如何使用throws關(guān)鍵字3、需求分析Java中允許在方法的后面使用throws關(guān)鍵字對(duì)外聲明該方法有可能發(fā)生的異常,這樣調(diào)用者在調(diào)用方法時(shí),就明確地知道該方法有異常,并且必須在程序中對(duì)異常進(jìn)行處理,否則編譯無
48、法通過。為 了讓初學(xué)者熟悉throws關(guān)鍵字,本案例將演示如何使用throws關(guān)鍵字。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 編寫一個(gè)類 Example182) 在該類中定義方法 div()用于進(jìn)行除法運(yùn)算,運(yùn)算前對(duì)被除數(shù)進(jìn)行判斷,如果等于0,使用throws 拋出異常對(duì)象,否則進(jìn)行正常的除法運(yùn)算。3) 由于throw拋出了非運(yùn)行時(shí)異常,為了保證編譯通過,我們需要在方法名后面使用throws聲明拋 出異常類。2)在main方法中調(diào)用div()方法,并通過trycatch語句處理拋出的異常。、案例實(shí)現(xiàn)public class Example18 public static void main(String
49、 args) (”除法運(yùn)算開始");try div(1,0); catch (Exception e) (”處理運(yùn)算異常");(”除法運(yùn)算結(jié)束”);public static int div(int x, int y) throws Exception /如果除數(shù)傳遞了0進(jìn)來,這個(gè)程序就岀現(xiàn)了異常if (y = 0) /發(fā)生異常自己不處理,誰調(diào)用誰處理/需要在方法上進(jìn)行拋出:throws 異常類throw new Exception();return x / y;運(yùn)行結(jié)果如圖4-18所示。C: *LTXKDOTSsystextiLcFcuckaticExaPiplclS:刊
50、-nUI圖4-18運(yùn)行結(jié)果三、案例總結(jié)1、throws關(guān)鍵字聲明拋出異常的語法格式如下:修飾符 返回值類型 方法名(參數(shù)1,參數(shù)2.)throws ExceptionType1,ExceptionType2.2> throws關(guān)鍵字需要寫在方法聲明的后面,throws后面需要聲明方法中發(fā)生異常的類型,通常將這種做法稱為方法聲明拋出一個(gè)異常。案例4-19自定義異常、案例描述1、考核知識(shí)點(diǎn)編號(hào):名稱:自定義異常2、練習(xí)目標(biāo)? 掌握如何自定義異常3、需求分析Java中定義的異常有限,如果想描述程序中特有的異常情況,就需要自定義異常。為了讓初學(xué)者 熟悉自定義異常,本案例將自定義一個(gè)名為MyExc
51、eption的異常類來演示如何自定義異常。4、設(shè)計(jì)思路(實(shí)現(xiàn)原理)1) 自定義名為 MyException的異常類,繼承自Exception類。2) 在Example19類中進(jìn)行除法運(yùn)算,判斷當(dāng)除數(shù)為零時(shí),拋出自定義的異常類3) 在main()方法中處理異常。、案例實(shí)現(xiàn)1、編寫自定義異常類,代碼如下: class MyException extends Exception private int number;MyException(String message) super(message);MyException(String message, int number) super(mess
52、age); this.number = number;public int getNumber() return number;2、拋出異常和處理異常,代碼如下:public class Example19 public static void main(String args) try divide(20, 0); catch (MyException my) (”你給的除數(shù)是:"+ my.getNumber() + ",而我們要求是:"+ my.getMessage();public static int divide(int a, int b) throws MyException if (b = 0) throw new
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 晉中信息學(xué)院《國學(xué)與人生》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024-2025學(xué)年湖南省湘潭市高三下學(xué)期期末仿真模擬生物試題含解析
- 吉利學(xué)院《社會(huì)體育概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 內(nèi)蒙古農(nóng)業(yè)大學(xué)《基礎(chǔ)口語(一)》2023-2024學(xué)年第二學(xué)期期末試卷
- DB1405T 069-2024西方蜜蜂種蜂場(chǎng)蜂王選育技術(shù)規(guī)程
- 文化用品行業(yè)科技創(chuàng)新動(dòng)態(tài)監(jiān)測(cè)考核試卷
- 合成材料制造的產(chǎn)品可追溯性與溯源技術(shù)考核試卷
- 有機(jī)化學(xué)原料在生物制品的合成考核試卷
- 攝像機(jī)維修入門到精通考核試卷
- 液力機(jī)械在體育場(chǎng)館設(shè)施中的應(yīng)用考核試卷
- 會(huì)下金蛋的鵝課件
- 三級(jí)綜合醫(yī)院評(píng)審標(biāo)準(zhǔn)(2024年版)
- 甘肅省普通高校專升本計(jì)算機(jī)考試21
- 2024天津中考數(shù)學(xué)二輪重難題型專題訓(xùn)練 題型七 第24題平面直角坐標(biāo)系下的圖形變化 (含答案)
- 煙草證轉(zhuǎn)讓協(xié)議共
- DB52-T 1666-2022 公路瓦斯隧道技術(shù)規(guī)范
- 跌倒墜床應(yīng)急演練
- 2024年保密知識(shí)測(cè)試試題庫(完整版)
- 家庭教育指導(dǎo)實(shí)操
- 小題壓軸題專練23-立體幾何(動(dòng)點(diǎn)問題)-2022屆高三數(shù)學(xué)一輪復(fù)習(xí)
- 物理學(xué)簡(jiǎn)明教程馬文蔚等高教出版社
評(píng)論
0/150
提交評(píng)論