版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JAVA面向?qū)ο蠼虒W(xué)為什么需要封裝1-1編寫一個(gè)類,代表教員,要求:具有屬性:姓名、年齡具有行為:自我介紹教員的最小年齡要求:22歲publicclassTeacher1{publicStringname;//教員姓名publicintage;//年齡/***返回自我介紹的內(nèi)容*/publicStringintroduction(){return"大家好!我是"+name+",我今年"+age+"歲";}}為什么需要封裝1-2編寫一個(gè)測試類,要求:實(shí)例化一個(gè)教員對(duì)象,并對(duì)其初始化在控制臺(tái)輸出該教員的自我介紹publicclassTeacher1Test{publicstaticvoidmain(String[]args){Teacher1teacher=newTeacher1();="李芳";teacher.age=10;System.out.println(roduction());}}要滿足教員的最小年齡要求,可以通過對(duì)屬性的封裝來實(shí)現(xiàn)大家好!我是李芳,我今年10歲什么是封裝publicclassTeacher2{privateStringname;//教員姓名//返回教員姓名publicStringgetName(){
returnname;}//設(shè)定教員姓名publicvoidsetName(Stringname){
=name;}}
封裝,就是隱藏實(shí)現(xiàn)細(xì)節(jié)將屬性私有化,提供公有方法訪問私有屬性通過這些公有方法訪問私有屬性Teacher2teacher=newTeacher2();teacher.setName("李芳");StringtName=teacher.getName();通過setter、getter方法訪問name屬性this代表當(dāng)前類的實(shí)例如何實(shí)現(xiàn)封裝2-1封裝的實(shí)現(xiàn):1、修改屬性的可見性來限制對(duì)屬性的訪問2、為每個(gè)屬性創(chuàng)建一對(duì)賦值(setter)方法和取值(getter)方法,用于對(duì)這些屬性的訪問3、在setter和getter方法中,加入對(duì)屬性的存取限制publicclassTeacher3{privateStringname;//教員姓名privateintage;//年齡publicintgetAge(){ returnage;}publicvoidsetAge(intage){if(age<22){System.out.println("錯(cuò)誤!最小年齡應(yīng)為22歲!");this.age=22;//如果不符合年齡要求,則賦予默認(rèn)值}else{this.age=age;}}//此處省略對(duì)name屬性的setter、getter方法}123如何實(shí)現(xiàn)封裝2-2publicclassTeacher3Test{publicstaticvoidmain(String[]args){ Teacher3teacher=newTeacher3(); teacher.setName("李芳"); teacher.setAge(10); System.out.println(roduction());}}使用封裝,增加了數(shù)據(jù)訪問限制,增強(qiáng)了程序的可維護(hù)性錯(cuò)誤!最小年齡應(yīng)為22歲!大家好!我是李芳,我今年22歲測試類通過調(diào)用setter方法,為對(duì)象的各個(gè)屬性賦值小結(jié)1使用private關(guān)鍵字修飾某個(gè)成員變量后,這個(gè)成員變量可以被同一包中的其它類訪問嗎?在Java程序中,代碼封裝帶給我們的好處是什么?小結(jié)2請(qǐng)通過代碼封裝,實(shí)現(xiàn)如下需求:編寫一個(gè)類Book,代表教材:具有屬性:名稱(title)、頁數(shù)(pageNum),其中頁數(shù)不能少于200頁,否則輸出錯(cuò)誤信息,并賦予默認(rèn)值200為各屬性設(shè)置賦值和取值方法具有方法:detail,用來在控制臺(tái)輸出每本教材的名稱和頁數(shù)編寫測試類BookTest進(jìn)行測試:為Book對(duì)象的屬性賦予初始值,并調(diào)用Book對(duì)象的detail方法,看看輸出是否正確完整代碼實(shí)現(xiàn)為什么需要構(gòu)造方法2-1開發(fā)教員類Teacher4,要求:具有屬性:姓名、年齡、學(xué)歷、職位具有行為:自我介紹publicclassTeacher4{privateStringname;//姓名privateintage;//年齡privateStringeducation;//學(xué)歷privateStringposition;//職位publicStringintroduction(){return"大家好!我是"+name+",我今年”+age+"歲,學(xué)歷“
+education+",目前職位是"+position;}publicStringgetName(){ returnname;}publicvoidsetName(StringmyName){ name=myName;}//以下是其他屬性的setter、getter方法,此處省略}為什么需要構(gòu)造方法2-2編寫一個(gè)測試類,要求:實(shí)例化一個(gè)教員對(duì)象,并對(duì)其初始化在控制臺(tái)輸出該教員的自我介紹publicclassTeacher4Test{publicstaticvoidmain(String[]args){Teacher4teacher=newTeacher4();teacher.setName("李芳");teacher.setAge(23);teacher.setEducation("本科");System.out.println(roduction());}}要簡化對(duì)象初始化的代碼,可以通過構(gòu)造方法來解決大家好!我是李芳,我今年23歲,學(xué)歷本科,目前職位是nullTeacher4中有太多的屬性及對(duì)應(yīng)的setter方法,在初始化時(shí),很容易就忘記了,有沒有可能簡化對(duì)象初始化的代碼?什么是構(gòu)造方法構(gòu)造方法負(fù)責(zé)對(duì)象成員的初始化工作,為實(shí)例變量賦予合適的初始值構(gòu)造方法必須滿足以下語法規(guī)則:1、方法名與類名相同2、沒有返回類型publicclassTeacher5{privateStringname;//教員姓名//構(gòu)造方法publicTeacher5(){name="無名氏";}}publicclassTeacher5Test{publicstaticvoidmain(String[]args){ Teacher5teacher=newTeacher5();}}使用new關(guān)鍵字調(diào)用構(gòu)造方法帶參數(shù)的構(gòu)造方法2-1通過帶參數(shù)的構(gòu)造方法,顯式地為實(shí)例變量賦予初始值publicclassTeacher6{privateStringname;//教員姓名privateintage;//年齡privateStringeducation;//學(xué)歷privateStringposition;//職位//帶參數(shù)的構(gòu)造方法publicTeacher6(StringpName,intpAge,StringpEducation,StringpPosition){name=pName;age=pAge;//可以增加對(duì)age等屬性的存取限制條件education=pEducation;position=pPosition;}publicStringintroduction(){return"大家好!我是"+name+",我今年"+age+"歲,學(xué)歷"+education+",目前職位是"+position;}}帶參數(shù)的構(gòu)造方法2-2通過調(diào)用帶參數(shù)的構(gòu)造方法,簡化對(duì)象初始化的代碼publicclassTeacher6Test{publicstaticvoidmain(String[]args){Teacher6teacher=newTeacher6("李芳",23,"本科","咨詢師");System.out.println(roduction());}}創(chuàng)建對(duì)象時(shí),一并完成了對(duì)象成員的初始化工作大家好!我是李芳,我今年23歲,學(xué)歷本科,目前職位是咨詢師小結(jié)3編寫一個(gè)類Book2,代表教材:具有屬性:名稱(title)、頁數(shù)(pageNum),其中頁數(shù)不能少于200頁,否則輸出錯(cuò)誤信息,并賦予默認(rèn)值200具有方法:detail,用來在控制臺(tái)輸出每本教材的名稱和頁數(shù)。具有帶參數(shù)的構(gòu)造方法:用來完成對(duì)象的初始化工作,并在構(gòu)造方法中完成對(duì)頁數(shù)的最小值限制編寫測試類Book2Test進(jìn)行測試:初始化一個(gè)Book2對(duì)象,并調(diào)用該Book2對(duì)象的detail方法,看看輸出是否正確完整代碼實(shí)現(xiàn)生活中的方法重載類方法方法參數(shù)方法實(shí)現(xiàn)司機(jī)轎車巴士火車駕駛啟動(dòng)、行駛、……等待乘客上車、啟動(dòng)、行駛、到站停車、……正點(diǎn)發(fā)車、行駛、到站停車、……如果用代碼實(shí)現(xiàn),我們需要三個(gè)方法,這些方法的方法名稱相同,參數(shù)類型不同方法重載的代碼示例1方法重載并不陌生java.io.PrintStream類的println方法能夠打印數(shù)據(jù)并換行,根據(jù)數(shù)據(jù)類型的不同,有多種實(shí)現(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方法方法重載方法重載的代碼示例2java.lang.Math類的max()方法能夠從兩個(gè)數(shù)字中取出最大值,它有多種實(shí)現(xiàn)方式運(yùn)行時(shí),Java虛擬機(jī)先判斷給定參數(shù)的類型,然后決定到底執(zhí)行哪個(gè)max()方法Mathmax(inta,intb)max(floata,floatb)max(longa,longb)max(doublea,doubleb)publicclassTest{publicstaticvoidmain(String[]args){Math.max(1,2);Math.max(1.0F,2.F);Math.max(1.0,2);}}方法重載構(gòu)造方法重載2-1構(gòu)造方法重載是方法重載的典型示例publicclassTeacher7{privateStringname;//教員姓名privateStringschool="北京中心";//所在中心publicTeacher7(Stringname){ =name;//設(shè)定教員姓名}publicTeacher7(Stringname,Stringschool){=name;//設(shè)定教員姓名this.school=school;//設(shè)定教員的所在中心}publicStringintroduction(){ return"大家好!我是"+school+"的"+name;}}構(gòu)造方法重載構(gòu)造方法重載2-2通過調(diào)用不同的構(gòu)造方法來表達(dá)對(duì)象的多種初始化行為例如:默認(rèn)情況下,教師來自北京中心,初始化時(shí),只需提供教員姓名有時(shí),需要提供所在中心名稱及教員姓名publicclassTeacher7Test{publicstaticvoidmain(String[]args){Teacher7teacher1=newTeacher7("李芳");System.out.println(roduction());Teacher7teacher2=newTeacher7("張欣",
"天津中心");System.out.println(roduction());}}大家好!我是北京中心的李芳大家好!我是天津中心的張欣小結(jié)4編寫一個(gè)類Book3,代表教材:具有屬性:名稱(title)、頁數(shù)(pageNum)、種類(type)具有方法:detail,用來在控制臺(tái)輸出每本教材的名稱、頁數(shù)、種類具有兩個(gè)帶參構(gòu)造方法:第一個(gè)構(gòu)造方法中,設(shè)置教材種類為“計(jì)算機(jī)”(固定),其余屬性的值由參數(shù)給定;第二個(gè)構(gòu)造方法中,所有屬性的值都由參數(shù)給定編寫測試類Book3Test進(jìn)行測試:分別以兩種方式完成對(duì)兩個(gè)Book3對(duì)象的初始化工作,并分別調(diào)用它們的detail方法,看看輸出是否正確完整代碼實(shí)現(xiàn)給定如下Java代碼,請(qǐng)指出代碼中的錯(cuò)誤,并解釋原因。publicclassSample{privateintx;publicSample(){ x=1;}publicSample(inti){ x=i;}publicintSample(inti){x=i;returnx++;}privateSample(inti,Strings){}publicSample(Strings,inti){}privateSampla(inti){ x=i++;}privatevoidSampla(inti){ x=i++;}}總結(jié)無參構(gòu)造方法帶參構(gòu)造方法不是構(gòu)造方法帶參構(gòu)造方法帶參構(gòu)造方法名稱與類名不相同不是構(gòu)造方法生活中的繼承2-1生活中,繼承的例子隨處可見動(dòng)物食草動(dòng)物食肉動(dòng)物誰是父類?誰是子類?能說出繼承的特點(diǎn)嗎?繼承需要符合的關(guān)系:is-a,父類更通用、子類更具體生活中的繼承2-2子類具有父類的一般特性(包括屬性和行為),以及自身特殊的特性巴士是汽車嗎?卡車是汽車嗎?出租車是汽車嗎?最大載客數(shù)量報(bào)站引擎數(shù)量外觀顏色剎車加速汽車最大載重量卸貨所屬公司最大載客數(shù)量打發(fā)票屬性行為請(qǐng)問:出租車包含哪些屬性和行為呢?為什么需要繼承4-1開發(fā)教員類,其中教員分為Java教員以及.NET教員,各自的要求如下:Java教員屬性:姓名、所屬中心方法:授課(步驟:打開Eclipse、實(shí)施理論課授課)、自我介紹.NET教員屬性:姓名、所屬中心方法:授課(步驟:打開Visualstudio2005、實(shí)施理論課授課)、自我介紹請(qǐng)問:以下這個(gè)解決方案中存在著什么問題?為什么需要繼承4-2publicclassDotNetTeacher{privateStringname;//教員姓名privateStringschool;//所在中心publicDotNetTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println("啟動(dòng)
VisualStudio2005");System.out.println("知識(shí)點(diǎn)講解");System.out.println("總結(jié)提問");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}publicclassJavaTeacher{privateStringname;//教員姓名privateStringschool;//所在中心publicJavaTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLession(){System.out.println("啟動(dòng)
Eclipse");System.out.println("知識(shí)點(diǎn)講解");System.out.println("總結(jié)提問");}publicvoidintroduction(){ System.out.println("大家好!我是" +school+"的"+name+".");}}代碼存在重復(fù),違背了“writeonce,onlyonce”的原則為什么需要繼承4-3如何改進(jìn)?有沒有可能建立繼承關(guān)系,讓子類自動(dòng)繼承父類的屬性和方法?Java教員是教員嗎?.NET教員是教員嗎?publicclassTeacher{privateStringname;//教員姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){name=myName;school=mySchool;}publicvoidgiveLesson(){System.out.println("知識(shí)點(diǎn)講解");System.out.println("總結(jié)提問");}publicvoidintroduction(){ System.out.println("大家好!我是“
+school+"的"+name+"。");}}現(xiàn)在,所有子類中相同的代碼都抽取到父類中了屬
性行
為姓名所在中心授課自我介紹教員Java教員.NET教員為什么需要繼承4-4publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動(dòng)Eclipse");super.giveLesson();}}publicclassDotNetTeacher2extendsTeacher{publicDotNetTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動(dòng)
VisualStudio.NET");super.giveLesson();}}使用繼承,可以有效實(shí)現(xiàn)代碼復(fù)用子類自動(dòng)繼承父類的屬性和方法,子類中不再存在重復(fù)代碼如何實(shí)現(xiàn)繼承3-1在Java語言中,用extends關(guān)鍵字來表示一個(gè)類繼承了另一個(gè)類,例如:publicclassJavaTeacher2
extends
Teacher{//其余代碼省略}在父類中只定義一些通用的屬性與方法,例如:publicclassTeacher{privateStringname;//教員姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化屬性值}publicvoidgiveLesson(){//授課方法的具體實(shí)現(xiàn)}publicvoidintroduction(){//自我介紹方法的具體實(shí)現(xiàn)
}}如何實(shí)現(xiàn)繼承3-2子類自動(dòng)繼承父類的屬性和方法,子類中可以定義特定的屬性和方法publicclassTeacher{privateStringname;//教員姓名privateStringschool;//所在中心publicTeacher(StringmyName,StringmySchool){//初始化屬性值}publicvoidgiveLesson(){ //授課方法的具體實(shí)現(xiàn)}publicvoidintroduction(){ //自我介紹方法的具體實(shí)現(xiàn)}}publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}publicvoidgiveLesson(){System.out.println("啟動(dòng)Eclipse");super.giveLesson();}}由于giveLesson()方法與父類的實(shí)現(xiàn)有所不同,因此重寫了該方法方法重寫:子類和父類的方法具有相同的名稱、參數(shù)列表、返回類型父類中的屬性和方法可以被子類繼承publicclassJavaTeacher2extendsTeacher{publicJavaTeacher2(StringmyName,StringmySchool){super(myName,mySchool);}}如何實(shí)現(xiàn)繼承3-3子類的構(gòu)造方法中,通過super關(guān)鍵字調(diào)用父類的構(gòu)造方法方法重寫后,通過super關(guān)鍵字調(diào)用父類的方法publicclassJavaTeacher2extendsTeacher{publicvoidgiveLesson(){System.out.println("啟動(dòng)Eclipse");super.giveLesson();}}通過調(diào)用父類的構(gòu)造方法,完成對(duì)屬性值的初始化一切類的“祖先”——Object在Java中,所有的Java類都直接或間接地繼承了java.lang.Object類publicclassMyObject{//…}publicclassMyObectextends
Object{
//…}在Eclipse中調(diào)用MyObject對(duì)象的成員,會(huì)自動(dòng)彈出繼承自O(shè)bject的所有方法小結(jié)1請(qǐng)編碼實(shí)現(xiàn)動(dòng)物世界的繼承關(guān)系:動(dòng)物(Animal)具有行為:吃(eat)、睡覺(sleep)動(dòng)物包括:兔子(Rabbit),老虎(Tiger)這些動(dòng)物吃的行為各不相同(兔子吃草,老虎吃肉);但睡覺的行為是一致的。請(qǐng)通過繼承實(shí)現(xiàn)以上需求,并編寫測試類AnimalTest進(jìn)行測試。完整代碼實(shí)現(xiàn)為什么需要多態(tài)5-1在教員類的基礎(chǔ)上,開發(fā)一個(gè)類代表總部,負(fù)責(zé)對(duì)各教員進(jìn)行評(píng)估,評(píng)估內(nèi)容包括:1、教員的自我介紹2、教員的授課為什么需要多態(tài)5-2publicclassHQ1{publicvoidjudge(JavaTeacher2t){roduction();t.giveLesson();}publicvoidjudge(DotNetTeacher2t){roduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ1hq=newHQ1();hq.judge(newJavaTeacher2("李明","北京中心“));hq.judge(newDotNetTeacher2("張明","天津中心“));}}第一種解決方案大家好!我是北京中心的李明.啟動(dòng)Eclipse知識(shí)點(diǎn)講解總結(jié)提問大家好!我是天津中心的張明.啟動(dòng)VisualStudio2005知識(shí)點(diǎn)講解總結(jié)提問控制臺(tái)輸出為什么需要多態(tài)5-3現(xiàn)在,升級(jí)教員類,增加一種新類型:DBTeacher,該類型的教員專門負(fù)責(zé)教授數(shù)據(jù)庫,要求如下:屬性:姓名、所屬中心方法:授課(啟動(dòng)SqlServer、實(shí)施理論課授課)、自我介紹同時(shí),總部也負(fù)責(zé)對(duì)這類教員進(jìn)行評(píng)估為什么需要多態(tài)5-4如果在第一種解決方案的基礎(chǔ)上去解決,我們需要如下兩個(gè)步驟:建立DBTeacher類修改總部類,增加方法:judge(DBTeachert)每增加一種新的教員類型,都要修改總部類,增加相應(yīng)的judge(評(píng)估)方法,代碼的可擴(kuò)展性及可維護(hù)性極差能找到這個(gè)解決方案的弊端嗎?完整代碼實(shí)現(xiàn)總部類完整代碼實(shí)現(xiàn)為什么需要多態(tài)5-5第二種解決方案——使用多態(tài)publicclassHQ3{publicvoidjudge(Teachert){roduction();t.giveLesson();}publicstaticvoidmain(String[]args){HQ3hq=newHQ3();hq.judge(newJavaTeacher2("李明","北京中心“)); hq.judge(newDotNetTeacher2("張明","天津中心")); hq.judge(newDBTeacher(“李嵐","北京中心“));}}可以接收子類類型根據(jù)實(shí)際創(chuàng)建的對(duì)象類型調(diào)用相應(yīng)方法大家好!我是北京中心的李明.啟動(dòng)Eclipse知識(shí)點(diǎn)講解總結(jié)提問大家好!我是天津中心的張明.啟動(dòng)VisualStudio2005知識(shí)點(diǎn)講解總結(jié)提問大家好!我是北京中心的李嵐.啟動(dòng)SqlServer知識(shí)點(diǎn)講解總結(jié)提問控制臺(tái)輸出使用多態(tài)之后,當(dāng)需要增加新的子類類型時(shí),無需更改總部類,程序的可擴(kuò)展性及可維護(hù)性增強(qiáng)什么是多態(tài)簡單來說,多態(tài)是具有表現(xiàn)多種形態(tài)的能力的特征同一個(gè)實(shí)現(xiàn)接口,使用不同的實(shí)例而執(zhí)行不同操作彩色打印機(jī)
打印機(jī)黑白打印機(jī)打印效果:彩色打印效果:黑白打印打印publicclassTeacher{publicvoidgiveLesson(){
System.out.println("知識(shí)點(diǎn)講解");System.out.println("總結(jié)提問");
}}publicclassTest{publicstaticvoidmain(String[]args){
HQ3hq=newHQ3();hq.judge(newDBTeacher());}}3如何實(shí)現(xiàn)多態(tài)1、子類重寫父類的方法2、編寫方法時(shí),使用父類定義的方法3、運(yùn)行時(shí),根據(jù)實(shí)際創(chuàng)建的對(duì)象類型動(dòng)態(tài)決定使用哪個(gè)方法publicclassDBTeacher
extendsTeacher{
publicvoidgiveLesson(){
System.out.println("啟動(dòng)SqlServer");
super.giveLesson();
}}1publicclassHQ3{publicvoidjudge(Teachert){
t.giveLesson();
}}2小結(jié)2請(qǐng)編碼實(shí)現(xiàn)如下需求:樂器(Instrument)分為:鋼琴(Piano)、小提琴(Violin)各種樂器的彈奏(play)方法各不相同。編寫一個(gè)測試類InstrumentTest,要求:編寫方法testPlay,對(duì)各種樂器進(jìn)行彈奏測試。要依據(jù)樂器的不同,進(jìn)行相應(yīng)的彈奏。在main方法中進(jìn)行測試總結(jié)2-1classBase{publicStringname;publicBase(){name="Base";}publicBase(StringpName){name=pName;}publicvoidmethod(){System.out.println(name);}}classChildextendsBase{publicChild(){super("Child1");name="Child2";}}給定如下Java代碼,編譯運(yùn)行后,輸出結(jié)果是什么?publicclassSample{publicstaticvoidmain(String[]args){
Childc=newChild();c.method();
}}Child2控制臺(tái)輸出123總結(jié)2-2給定如下Java代碼,編譯運(yùn)行后,輸出結(jié)果是什么?publicclassTeacher{publicvoidgiveLesson(){System.out.println("知識(shí)點(diǎn)講解");}}
publicclassDBTeacherextendsTeacher{publicvoidgiveLesson(){System.out.println("啟動(dòng)SqlServer");}}12publicclassTest{publicstaticvoidmain(String[]args){Teachert=newDBTeacher();t.giveLesson();}}控制臺(tái)輸出
啟動(dòng)SqlServer生活中的接口電腦主板上的PCI插槽的規(guī)范就類似于Java接口聲卡顯卡網(wǎng)卡每種卡的內(nèi)部結(jié)構(gòu)都不相同,可以把聲卡、網(wǎng)卡、顯卡都插在PCI插槽上,而不用擔(dān)心哪個(gè)插槽是專門插哪個(gè)卡的主板什么是Java接口2-1一個(gè)Java接口是一些方法特征的集合,但沒有方法的實(shí)現(xiàn)publicinterfacePCI{
publicvoidstart();
publicvoidstop();
}classSoundCardimplementsPCI{publicvoidstart()
{
System.out.println("Dudu...");
}
publicvoidstop()
{
System.out.println("Soundstop!");
}
}Java接口中定義的方法在不同的地方被實(shí)現(xiàn),可以具有完全不同的行為這是Java接口,相當(dāng)于主板上的PCI插槽的規(guī)范classNetworkCardimplementsPCI{publicvoidstart()
{
System.out.println("Send...");
}
publicvoidstop()
{
System.out.println("Networkstop!");
}
}聲卡、網(wǎng)卡都實(shí)現(xiàn)了PCI插槽的規(guī)范,但行為完全不同什么是Java接口2-2publicclassAssembler{
publicstaticvoidmain(String[]args){
PCInc=newNetworkCard();
PCIsc=newSoundCard();
nc.start();sc.start();
}
}可以使用Java接口標(biāo)識(shí)類型運(yùn)行時(shí),根據(jù)實(shí)際創(chuàng)建的對(duì)象類型調(diào)用相應(yīng)的方法實(shí)現(xiàn)Dudu...Send...控制臺(tái)輸出21為什么需要Java接口5-1為各中心開發(fā)這樣一個(gè)小系統(tǒng),包含類型:教員、中心、打印機(jī),具體要求如下:教員、以及中心都具有方法:輸出詳細(xì)信息中心具有屬性:打印機(jī),能夠通過中心的打印機(jī)打印教員或中心的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性打印教員中心教員
詳細(xì)信息中心
詳細(xì)信息detail方法(輸出詳細(xì)信息)為什么需要Java接口5-2以下這個(gè)解決方案中存在著什么問題?publicclassTeacher1{//輸出教員的詳細(xì)信息publicStringdetail(){ return"本人是教員";}}publicclassSchool1{privatePrinterprinter=newPrinter();//輸出中心的詳細(xì)信息publicStringdetail(){return"這里是中心";}//使用打印機(jī)打印教員信息publicvoidprint(Teacher1t){printer.print(t.detail());}//使用打印機(jī)打印中心信息publicvoidprint(School1s){ printer.print(s.detail());}}publicclassPrinter{publicvoidprint(Stringcontent){System.out.println("開始打印:");System.out.println(content);}}每增加一種新類型,都需要增加相應(yīng)的print(類型名稱var)方法——程序的可擴(kuò)展性及可維護(hù)性極差——這不符合系統(tǒng)的要求為什么需要Java接口5-3可以通過多態(tài)性解決這個(gè)問題嗎?顯然,本系統(tǒng)符合使用多態(tài)性的條件教員中心detail方法(負(fù)責(zé)輸出詳細(xì)信息)教員
詳細(xì)信息中心
詳細(xì)信息1221回顧多態(tài)的含義:實(shí)現(xiàn)同一個(gè)接口,使用不同的實(shí)例而執(zhí)行不同操作為什么需要Java接口5-4在這個(gè)系統(tǒng)中,存在繼承關(guān)系嗎?教員、中心屬于兩種不同的類型,無法通過“is-a”找到一個(gè)合適的父類教員、中心都存在一個(gè)共同的方法特征:detail,它們對(duì)detail方法有各自不同的實(shí)現(xiàn)——這完全符合Java接口的定義定義一個(gè)Java接口,在其中定義detail方法,但沒有具體實(shí)現(xiàn)實(shí)現(xiàn)這個(gè)Java接口,不同的類對(duì)detail方法有不同的具體實(shí)現(xiàn)IntroduceableTeacher2(教員)School2(中心)為什么需要Java接口5-5publicinterfaceIntroduceable{publicStringdetail();}publicclassSchool2
implementsIntroduceable{privatePrinterprinter=newPrinter();//輸出中心的詳細(xì)信息publicStringdetail(){return"這里是中心";}//使用中心打印機(jī)打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}publicclassTeacher2
implementsIntroduceable{//輸出教員的詳細(xì)信息publicStringdetail(){ return"本人是教員";}}通過Java接口,我們同樣可以享受到多態(tài)性的好處,大大提高了程序的可擴(kuò)展性及可維護(hù)性使用print方法時(shí),參數(shù)可以是任何Introduceable接口的實(shí)現(xiàn)類的對(duì)象,不必再為不同的類型建立不同的print方法了使用了Java接口之后,這個(gè)系統(tǒng)有了怎樣的改進(jìn)?小結(jié)1為剛才完成的系統(tǒng)增加一種新的類型:學(xué)員(Student),具體要求如下:學(xué)員具有detail方法,負(fù)責(zé)輸出學(xué)員詳細(xì)信息能夠通過中心的打印機(jī)打印學(xué)員的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性編寫測試類StudentTest進(jìn)行測試,要求:通過中心的打印機(jī)打印學(xué)員的詳細(xì)信息StudentTest完整代碼實(shí)現(xiàn)Student完整代碼實(shí)現(xiàn)什么是面向接口編程開發(fā)系統(tǒng)時(shí),主體構(gòu)架使用接口,接口構(gòu)成系統(tǒng)的骨架這樣就可以通過更換接口的實(shí)現(xiàn)類來更換系統(tǒng)的實(shí)現(xiàn)publicclassSchool2implementsIntroduceable{privatePrinterprinter=newPrinter();publicStringdetail(){return"這里是中心";}//使用中心打印機(jī)打印信息publicvoidprint(Introduceableintro){ printer.print(intro.detail());}}IntroduceableTeacher2(教員)School2(中心)面向接口編程的示例4-1升級(jí)上述的系統(tǒng),要求:打印機(jī)有多種類型,比如:黑白打印機(jī)、彩色打印機(jī)等中心可能配備其中任意一款打印機(jī),負(fù)責(zé)打印教員、或者中心的詳細(xì)信息系統(tǒng)要具備良好的可擴(kuò)展性與可維護(hù)性print方法(打印)彩色打印機(jī)黑白打印機(jī)黑白內(nèi)容中心/教員詳細(xì)信息彩色內(nèi)容面向接口編程的示例4-2采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第一步:抽象出Java接口1、分析:黑白、彩色打印機(jī)都存在一個(gè)共同的方法特征:print黑白、彩色打印機(jī)對(duì)print方法有各自不同的實(shí)現(xiàn)2、結(jié)論:抽象出Java接口PrinterFace,在其中定義方法print3、具體實(shí)現(xiàn):publicinterfacePrinterFace{publicvoid
print(Stringcontent);}面向接口編程的示例4-3采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第二步:publicclassColorPrinter
implementsPrinterFace{publicvoid
print(Stringcontent){System.out.println("彩色打?。?);System.out.println(content);}}publicclassBlackPrinter
implementsPrinterFace{publicvoid
print(Stringcontent){System.out.println("黑白打?。?);System.out.println(content);}}實(shí)現(xiàn)Java接口1、分析:已經(jīng)抽象出Java接口PrinterFace,并在其中定義了print方法黑白、彩色打印機(jī)對(duì)print方法有各自不同的實(shí)現(xiàn)2、結(jié)論:黑白、彩色打印機(jī)都實(shí)現(xiàn)PrinterFace接口,各自實(shí)現(xiàn)print方法3、具體實(shí)現(xiàn):面向接口編程的示例4-4采用面向接口編程的方式實(shí)現(xiàn),以下是三個(gè)步驟中的第三步:使用Java接口1、分析:主體構(gòu)架使用接口,讓接口構(gòu)成系統(tǒng)的骨架2、結(jié)論:更換實(shí)現(xiàn)接口的類就可以更換系統(tǒng)的實(shí)現(xiàn)3、具體實(shí)現(xiàn):publicclassSchool3implementsIntroduceable{privatePrinterFaceprinter;//打印機(jī)publicvoidsetPrinter(PrinterFacep){this.printer=p;}publicStringdetail(){return"這里是中心";}publicvoidprint(Introduceableintro){
printer.print(intro.detail());}}publicclassTest{publicstaticvoidmain(String[]args){//創(chuàng)建中心實(shí)例School3school=newSchool3();//為該中心配備黑白打印機(jī)school.setPrinter(newBlackPrinter());school.print(school);//為該中心配備彩色打印機(jī)school.setPrinter(new
ColorPrinter());school.print(school);}}小結(jié)2閱讀如下Java代碼,然后請(qǐng)采用面向接口編程的思想,在空白處填寫正確的代碼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接口,相當(dāng)于主板上的PCI插槽的規(guī)范聲卡、網(wǎng)卡都實(shí)現(xiàn)了PCI插槽的規(guī)范,但行為完全不同小結(jié)2publicclassMainBoard{
publicvoidusePCICard(______p)
{
p.start();
p.stop();
}
}publicclassAssembler{
publicstaticvoidmain(String[]args)
{
MainBoardmb=newMainBoard();
//在主板上插入網(wǎng)卡//在主板上插入聲卡
}
}提示:通過這個(gè)方法,主板上可以插入任意符合PCI插槽規(guī)范的卡PCInc=newNetworkCard();mb.usePCICard(nc);
PCIsc=newSoundCard();
mb.usePCICard(sc);PCI提示:可以通過更換實(shí)現(xiàn)接口的類來更換系統(tǒng)的實(shí)現(xiàn)為什么需要常量生活中,一周有七天,如何用代碼表示?publicclassWeek{privateintdays=7;publicstaticvoidmain(String[]args){Weekw=newWeek();System.out.println("一周有"+w.days+"天");}}publicclassWeek{privateintdays=7;publicstaticvoidmain(String[]args){Weekw=newWeek();w.days++;System.out.println("一周有"+w.days+"天");}}一周有7天控制臺(tái)輸出然而,總有不盡人意的事情發(fā)生:一周有8天控制臺(tái)輸出如何保證變量的值在運(yùn)行期無法被改變?——使用常量什么是常量常量是一種標(biāo)識(shí)符,它的值在運(yùn)行期間恒定不變常量標(biāo)識(shí)符在程序中只能被引用,而不能被重新賦值常量圓周率PI圓周率PI代碼表示方式publicstaticfinaldoublePI
=3.14159265358979323846;用法將ang角度轉(zhuǎn)換成徑度publicstaticdoubletoRadians(doubleang){returnang/180.0*PI;}常量的優(yōu)點(diǎn)如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會(huì)有什么麻煩?publicstaticdoubletoRadians(doubleang){returnang/180.0*3.14159265358979323846;}publicstaticdoubletoDegrees(doubleang){returnang*180.0/3.14159265358979323846;}publicstatic
finaldoublePI=3.14159265358979323846;//圓周率publicstaticdoubletoRadians(doubleang){returnang/180.0*PI;}publicstaticdoubletoDegrees(doubleang){returnang*180.0/PI;}程序的可讀性變差:用戶很難理解數(shù)字或字符串的意思程序的可維護(hù)性變差:如果數(shù)值改變,則需要在很多地方改動(dòng),既麻煩又易出錯(cuò)使用常量可以增強(qiáng)程序的可讀性、可維護(hù)性Java中常量的定義規(guī)則加入final關(guān)鍵字代表常量,加入static關(guān)鍵字代表類變量盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串publicclassStudent{publicstaticfinalintFEMALE=1;//代表女性publicstaticfinalintMALE=2;//代表男性privateintsex;//性別publicvoidsetSex(intsex){if(sex==FEMALE) System.out.println("這是一名女學(xué)生");elseif(sex==MALE) System.out.println("這是一名男學(xué)生");this.sex=sex;}}在Java接口中聲明常量在Java接口中聲明的變量在編譯時(shí)會(huì)自動(dòng)加上staticfinal的修飾符,即聲明為常量,因而Java接口通常是存放常量的最佳地點(diǎn)publicinterfaceSchoolType{
publicstaticfinalString="加盟中心";
publicstaticfinalStringBENET="BENET直營中心";}publicinterfaceSchoolType{String="加盟中心";StringBENET="BENET直營中心";}等同于小結(jié)3編寫一個(gè)用于放置常量的Java接口Constants,具有常量MAX和MIN編寫一個(gè)測試類ConstantsTest,在main方法中求取Constants中的兩個(gè)常量之差Constants完整代碼實(shí)現(xiàn)ConstantsTest完整代碼實(shí)現(xiàn)OO思想總結(jié)OO基本特征定義具體實(shí)現(xiàn)方式優(yōu)勢封裝隱藏實(shí)現(xiàn)細(xì)節(jié),對(duì)外提供公共的訪問接口屬性私有化、添加公有的setter、getter方法增強(qiáng)代碼的可維護(hù)性繼承從一個(gè)已有的類派生出新的類,子類具有父類的一般特性,以及自身特殊的特性繼承需要符合的關(guān)系:is-a1、實(shí)現(xiàn)抽象(抽出像的部分)2、增強(qiáng)代碼的可復(fù)用性多態(tài)同一個(gè)實(shí)現(xiàn)接口,使用不同的實(shí)例而執(zhí)行不同操作通過Java接口/繼承來定義統(tǒng)一的實(shí)現(xiàn)接口;通過方法重寫為不同的實(shí)現(xiàn)類/子類定義不同的操作增強(qiáng)代碼的可擴(kuò)展性、可維護(hù)性總結(jié)publicinterfaceIntroduceable{publicStringdetail();publicvoidintroduction(){ detail();}privatevoidshowMessage();voidspeak();}Java接口中的方法必須是publicJava接口中不能有方法體實(shí)現(xiàn)編譯器會(huì)自動(dòng)加上public修飾符請(qǐng)指出下列Java代碼中的錯(cuò)誤。生活中的異常正常情況下,小王每日開車去上班,耗時(shí)大約30分鐘但是,異常情況遲早要發(fā)生!一路暢通堵車!撞車!程序中的異常publicclassHello{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);intcourseCode=in.nextInt();//從鍵盤輸入整數(shù)switch(courseCode){case1:System.out.println("C#編程");break;case2:System.out.println("Java編程");break;case3:System.out.println("SQL基礎(chǔ)");}}}輸入:2輸出:Java編程輸入:B程序中斷運(yùn)行!正常情況:異常情況:什么是異常異常就是在程序的運(yùn)行過程中所發(fā)生的不正常的事件,它會(huì)中斷正在運(yùn)行的程序繞行或者等待請(qǐng)求交警解決異常!面對(duì)異常該怎么辦呢?通常情況下,我們會(huì)這樣處理:程序運(yùn)行程序中斷運(yùn)行堵車!撞車!生活中,我們會(huì)根據(jù)不同的異常進(jìn)行相應(yīng)的處理,而不會(huì)就此中斷我們的生活什么是異常處理Java編程語言使用異常處理機(jī)制為程序提供了錯(cuò)誤處理的能力程序中預(yù)先想好了對(duì)付異常的處理辦法異常!程序運(yùn)行處理完畢,程序繼續(xù)運(yùn)行對(duì)異常進(jìn)行處理Java中如何進(jìn)行異常處理Java的異常處理是通過5個(gè)關(guān)鍵字來實(shí)現(xiàn)的:try、catch、finally、throw、throws
捕獲異常catchtryfinally執(zhí)行可能產(chǎn)生異常的代碼捕獲異常無論是否發(fā)生異常,代碼總能執(zhí)行手動(dòng)拋出異常拋出異常throw聲明異常聲明方法可能要拋出的各種異常throwstry/catch塊7-1trycatchtry/catch
塊后的代碼段publicvoidmethod(){try{//代碼段(此處不會(huì)產(chǎn)生異常)}catch(異常類型ex){//對(duì)異常進(jìn)行處理的代碼段}//代碼段}使用try/catch塊捕獲異常,分為三種情況:第一種情況try/catch塊7-2使用示例模擬第一種情況:publicclassException{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1: System.out.println("C#編程"); break; case2: System.out.println("Java編程"); break; case3: System.out.println("SQL基礎(chǔ)");}}catch(Exceptionex){System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}}輸入:2Java編程歡迎提出建議!控制臺(tái)輸出try/catch塊7-3trycatch異常類型匹配try/catch塊后的代碼段進(jìn)入catch塊publicvoidmethod(){try{//代碼段1//產(chǎn)生異常的代碼段2//代碼段3}catch(異常類型ex){//對(duì)異常進(jìn)行處理的代碼段4}//代碼段5}使用try/catch塊捕獲異常,分為三種情況:第二種情況產(chǎn)生異常對(duì)象程序繼續(xù)執(zhí)行異常是一種特殊的對(duì)象,類型為java.lang.Exception或其子類
發(fā)生異常try/catch塊7-4使用示例模擬第二種情況:publicclassException{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1: System.out.println("C#編程"); break; case2: System.out.println("Java編程"); break; case3: System.out.println("SQL基礎(chǔ)");}}catch(Exceptionex){System.out.println("輸入不為數(shù)字!");
ex.printStackTrace();}System.out.println("歡迎提出建議!");}}輸入:B輸入不為數(shù)字!異常堆棧信息歡迎提出建議!控制臺(tái)輸出printStackTrace的堆棧跟蹤功能顯示出程序運(yùn)行到當(dāng)前類的執(zhí)行流程publicclassException{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();//此處代碼省略}catch(Exceptionex){System.out.println("輸入不為數(shù)字!");
ex.printStackTrace();}System.out.println("歡迎提出建議!");}}try/catch塊7-5java.util.InputMismatchExceptionatjava.util.Scanner.throwFor(Scanner.java:840)atjava.util.Scanner.next(Scanner.java:1461)atjava.util.Scanner.nextInt(Scanner.java:2091)atjava.util.Scanner.nextInt(Scanner.java:2050)ats2jsp.sg.ch05.Exception.main(Exception.java:23)異常類型異常堆棧信息在此方法中拋出了異常try/catch塊7-6trycatch異常類型不匹配try/catch塊后的代碼段程序中斷運(yùn)行
發(fā)生異常publicvoidmethod(){try{//代碼段1//產(chǎn)生異常的代碼段2//代碼段3}catch(異常類型ex){//對(duì)異常進(jìn)行處理的代碼段4}//代碼段5}使用try/catch塊捕獲異常,分為三種情況:第三種情況產(chǎn)生異常對(duì)象try/catch塊7-7使用示例模擬第三種情況:publicclassException2{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1: System.out.println("C#編程"); break; case2: System.out.println("Java編程"); break; case3: System.out.println("SQL基礎(chǔ)");}}catch(NullPointerExceptionex){System.out.println("輸入不為數(shù)字!");}System.out.println("歡迎提出建議!");}}輸入:B程序中斷運(yùn)行try/catch/finally2-1在try/catch塊后加入finally塊,可以確保無論是否發(fā)生異常,finally塊中的代碼總能被執(zhí)行try塊finally塊catch塊無異常有異常try/catch/finally2-2publicclassException3{publicstaticvoidmain(String[]args){System.out.print("請(qǐng)輸入課程代號(hào)(1至3之間的數(shù)字):");Scannerin=newScanner(System.in);try{intcourseCode=in.nextInt();switch(courseCode){ case1:
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度服裝設(shè)計(jì)委托創(chuàng)作合同
- 感恩課程課件教學(xué)課件
- 2024年度互聯(lián)網(wǎng)金融與投資合同
- 2024年城市供水供電管網(wǎng)改造工程合同
- 2024年度電子商務(wù)平臺(tái)服務(wù)外包合同
- 2024年度智能家居產(chǎn)品購銷合同
- 2024年屋產(chǎn)交易合同:個(gè)人賣家與買家之間的協(xié)議
- 2024年度光伏發(fā)電項(xiàng)目建設(shè)與運(yùn)營合同
- 大學(xué)民法課件教學(xué)課件
- 公司中秋節(jié)員工的慰問信(18篇)
- 高考數(shù)學(xué)小題狂練:每題都附有詳細(xì)解析
- 浮動(dòng)碼頭施工方案
- Poka-Yoke防錯(cuò)技術(shù)(完整版)
- 保安交接班記錄表(2)
- 神明—EZflame火焰檢測系統(tǒng)
- 個(gè)人簡歷求職簡歷課件.ppt
- 2018年江蘇高考滿分作文:在母語的屋檐下
- 新青島版五四制2021-2022四年級(jí)科學(xué)上冊(cè)實(shí)驗(yàn)指導(dǎo)
- 小學(xué)四年級(jí)音樂課程標(biāo)準(zhǔn)
- 雙向細(xì)目表和單元測試卷及組卷說明
- 離子色譜法測定空氣中二氧化硫
評(píng)論
0/150
提交評(píng)論