面向?qū)ο?教案(第15講)面向?qū)ο蟮娜筇卣?;(?6講)類的繼承_第1頁
面向?qū)ο?教案(第15講)面向?qū)ο蟮娜筇卣鳎唬ǖ?6講)類的繼承_第2頁
面向?qū)ο?教案(第15講)面向?qū)ο蟮娜筇卣?;(?6講)類的繼承_第3頁
面向?qū)ο?教案(第15講)面向?qū)ο蟮娜筇卣?;(?6講)類的繼承_第4頁
面向?qū)ο?教案(第15講)面向?qū)ο蟮娜筇卣?;(?6講)類的繼承_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

《面向?qū)ο蟪绦蛟O(shè)計(jì)》教案第15講教學(xué)對(duì)象計(jì)算機(jī)科學(xué)技術(shù)專業(yè)授課內(nèi)容6.1面向?qū)ο蟮娜筇卣?.2包、類庫與模塊6.3案例學(xué)習(xí)——開發(fā)自定義類庫課程標(biāo)準(zhǔn)教學(xué)目標(biāo)(一)知識(shí)目標(biāo)1.了解面向?qū)ο筇卣?.掌握包、類庫、封裝性和訪問修飾符(二)能力目標(biāo)1.能夠應(yīng)用類、對(duì)象、封裝、繼承、多態(tài)等知識(shí)編寫應(yīng)用程序2.能夠掌握面向?qū)ο罄碚撆c方法,進(jìn)行創(chuàng)新性的編程設(shè)計(jì)教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時(shí)及分配(第1學(xué)時(shí)50分鐘)課堂講授30分鐘課堂講授20分鐘6.1面向?qū)ο蟮娜筇卣?.2包、類庫與模塊學(xué)時(shí)及分配(第2學(xué)時(shí)50分鐘)課堂講授20分鐘課堂講授30分鐘6.3案例學(xué)習(xí)——開發(fā)自定義類庫編程訓(xùn)練知識(shí)點(diǎn)分析重點(diǎn):類的組織類的封裝導(dǎo)入類庫難點(diǎn):如何理解類庫、導(dǎo)入類庫教學(xué)過程設(shè)計(jì)內(nèi)容方式問題導(dǎo)入Java語言的封裝性、繼承性和多態(tài)性等面向?qū)ο筇卣鳎òc類庫、封裝性和訪問修飾符、定義類的子類、如何覆蓋超類的方法、final關(guān)鍵字、類的關(guān)系、抽象類、對(duì)象轉(zhuǎn)換與多態(tài)等。內(nèi)容要點(diǎn)6.1面向?qū)ο筇卣鳛橹С置嫦驅(qū)ο蟮脑O(shè)計(jì)原則,所有OOP語言,包括Java在內(nèi),都有三個(gè)特性:封裝性、繼承性和多態(tài)性。封裝(encapsulation)就是把對(duì)象的狀態(tài)(屬性)和行為(方法)結(jié)合成一個(gè)獨(dú)立的系統(tǒng)單位,并盡可能地隱藏對(duì)象的內(nèi)部細(xì)節(jié)。例如,一輛汽車就是一個(gè)封裝體,它封裝了汽車的狀態(tài)和操作。繼承(inheritance)的概念普遍存在于現(xiàn)實(shí)世界中。例如,小汽車是一種車,公交車是一種車,自行車也是一種車,它們都具有車的特性,因此它們是車的子類。所謂多態(tài)(polymorphism),是指一個(gè)程序中相同的名字表示不同含義的情況。面向?qū)ο蟮某绦蛑械亩鄳B(tài)有多種情況。在簡單的情況下,在同一個(gè)類中定義了多個(gè)名稱相同的方法,即方法重載,另一種情況是子類中定義的與父類中的方法同名的方法,即方法覆蓋。這兩種情況都稱為多態(tài),且前者稱為靜態(tài)多態(tài),后者稱為動(dòng)態(tài)多態(tài)。6.2包與類庫Java語言使用包來組織類庫。包(package)實(shí)際是一組相關(guān)類或接口的集合。Java類庫中的類都是通過包來組織的。6.2.1包與package語句用戶自定義的類通常也應(yīng)存放到某個(gè)包中,要將某個(gè)類放到包中,需在定義類時(shí)使用package語句指明屬于哪個(gè)包,如下所示:packagecom.boda.xy;publicclassAccount{…}為了保證自己創(chuàng)建的類不與其他人創(chuàng)建的類沖突,需要將類放入包中,這就需要給包取一個(gè)獨(dú)一無二的名稱。為了使你的包名與別人的包名不同,建議將域名反轉(zhuǎn)過來,然后中間用點(diǎn)(.)號(hào)分隔作為包的名稱。因?yàn)橛蛎侨蛭ㄒ坏?,以這種方式定義的包名也是全球唯一的。例如,假設(shè)一個(gè)域名為,那么創(chuàng)建的包名可以為com.boda.xy。創(chuàng)建的類都存放在這個(gè)包下,這些類就不會(huì)與任何人的類沖突。許多IDE工具(如Eclipse或IntelliJIDEA等)創(chuàng)建帶包的類時(shí)自動(dòng)創(chuàng)建包的路徑,并將編譯后的類放入指定的包中。如果在命令提示符下使用javac編譯程序,可以使用帶–d選項(xiàng)的編譯命令創(chuàng)建包。為了方便程序設(shè)計(jì)和運(yùn)行,Java類庫中的類都是以包的形式組織的,這些類通常稱為JavaAPI。有關(guān)API的詳細(xì)信息請(qǐng)參閱JavaAPI文檔。如果一個(gè)類屬于某個(gè)包,可以用類的完全限定名(fullyqualifiedname)來表示。例如,Account類屬于com.boda.xy包,則Account類的完全限定名是com.boda.xy.Account。6.2.2類的導(dǎo)入在Java語言中可以使用兩種導(dǎo)入:一是使用import語句導(dǎo)入指定包中的類或接口。二是使用importstatic導(dǎo)入類或接口中的靜態(tài)成員。1.import語句import語句的一般格式為:importpackage1[.package2[.package3[…]]].類名|*;如果指定具體的類名將導(dǎo)入指定的類,若選用“*”號(hào),表示導(dǎo)入包中所有類。如果一個(gè)源程序中要使用某個(gè)包中的多個(gè)類,用第二種方式比較方便,否則要寫多個(gè)import語句。導(dǎo)入某個(gè)包中所有類并不是將所有的類都加到源文件中,而是使用到哪個(gè)類才導(dǎo)入哪個(gè)類。也可以不用import語句而在使用某個(gè)類時(shí)指明該類所屬的包。java.util.Scannersc=newjava.util.Scanner(System.in);2.importstatic語句從前面的例子看到,使用類的靜態(tài)常量或靜態(tài)方法,需要在常量名前或方法名前加上類名,如Math.PI、Math.random()等。這樣如果使用的常量或方法較多,代碼就顯得冗長。因此從Java5開始,允許使用importstatic語句導(dǎo)入類中的常量和靜態(tài)方法,然后再使用這些類中的常量或方法就不用加類名前綴了。例如,要使用Math類的random()等方法,可以先使用下列靜態(tài)導(dǎo)入語句。之后,在程序中就可以直接使用random()了。importstaticjava.lang.Math.*;6.2.3Java類庫程序員除了使用自己定義的類外,還可以使用Java標(biāo)準(zhǔn)類庫(JavaClassLibrary,JCL)中定義的類或者第三方定義的類。JCL是Java語言實(shí)現(xiàn)的包的集合。簡單地說,它是JDK中的可用.class文件集合。一旦安裝了Java,它們就將作為安裝的一部分,并可以使用JCL類作為構(gòu)建塊來構(gòu)建應(yīng)用程序代碼,這些構(gòu)建塊負(fù)責(zé)完成許多底層開發(fā)。JCL的豐富性和易用性極大地促進(jìn)了Java的流行。表6-1Java常用類庫包名說明java.langJava語言基礎(chǔ)包,該包中的類不需要導(dǎo)入就可以使用。常用類有Object、Class、String和StringBuilder、System、Math、基本類型包裝類等java.util該包主要包含工具類,其中集合類和接口定義在該包中。常用的有Collection、List、Set、Queue、Map等接口以及這些接口的實(shí)現(xiàn)類java.time包含有用于管理日期、時(shí)間、期間和持續(xù)時(shí)間的類。常用的有LocalDate、LocalTime和LocalDateTime類以及Month、DayOfWeek枚舉java.io包含支持使用流、序列化和文件系統(tǒng)讀寫數(shù)據(jù)的類和接口java.sql和javax.sql這兩個(gè)包組成Java數(shù)據(jù)庫連接(JDBC)API,該API允許訪問和處理存儲(chǔ)在數(shù)據(jù)源(通常是關(guān)系數(shù)據(jù)庫)中的數(shù)據(jù)。javax.sql包是java.sql包的補(bǔ)充該包存放網(wǎng)絡(luò)編程類,例如:Socket和ServerSocket類等java.awt和javax.swing這兩個(gè)包存放圖形界面程序開發(fā)所需要的類6.3案例學(xué)習(xí)——開發(fā)自定義類庫1.問題描述在Java應(yīng)用開發(fā)中通常需要開發(fā)自己的類庫,然后在應(yīng)用程序中使用。本案例學(xué)習(xí)如何開發(fā)一個(gè)簡單的類庫,然后將它打包成.jar文件,并且在程序中使用它。要求定義一個(gè)名為com.boda.xy.MathUtils類,在該類中定義如下兩個(gè)靜態(tài)方法:publicstaticbooleanisPrime(intn)publicstaticbooleanisPalindrome(intn)isPrime(intn)方法返回n是否是素?cái)?shù),isPalindrome(intn)方法返回n是否是回文數(shù),如363是一個(gè)回文數(shù)。最后編寫程序?qū)腩悗?,并編寫main()方法,求出2-1000之間的所有回文素?cái)?shù)。2.運(yùn)行結(jié)果運(yùn)行程序,輸出2-1000之間所有回文素?cái)?shù)如圖6-4所示。圖6-4程序運(yùn)行結(jié)果3.設(shè)計(jì)思路對(duì)于自定義類庫,按下面思路設(shè)計(jì)。(1)按要求編寫com.boda.xy.MathUtils類,其中定義兩個(gè)靜態(tài)方法isPrime(intn)和isPalindrome(intn)。(2)將編譯好的類文件打包到.jar文件中。(3)在應(yīng)用程序中添加.jar文件。4.代碼實(shí)現(xiàn)該案例的完整實(shí)現(xiàn)代碼如教材程序6-3所示。采用機(jī)房授課邊講邊練,同時(shí)用啟發(fā)式、討論式、案例教學(xué)等教學(xué)方法。布置課外學(xué)習(xí)任務(wù)自定義一個(gè)通用的整型數(shù)組操作類,類中定義數(shù)組的初始化方法、輸出數(shù)組元素方法、求最大值|最小值方法。將編譯好的類文件打包生成.jar文件,并在應(yīng)用程序中使用此.jar文件。教學(xué)反思《面向?qū)ο蟪绦蛟O(shè)計(jì)》教案第16講教學(xué)對(duì)象計(jì)算機(jī)科學(xué)技術(shù)專業(yè)授課內(nèi)容6.5類的繼承課程標(biāo)準(zhǔn)教學(xué)目標(biāo)(一)知識(shí)目標(biāo)掌握類繼承的實(shí)現(xiàn)、方法覆蓋掌握super的使用(二)能力目標(biāo)1.能夠應(yīng)用類、對(duì)象、封裝、繼承、多態(tài)等知識(shí)編寫應(yīng)用程序2.能夠掌握面向?qū)ο罄碚撆c方法,進(jìn)行創(chuàng)新性的編程設(shè)計(jì)教學(xué)方法采用講授法、演示法、討論法、案例教學(xué)。學(xué)時(shí)及分配(第1學(xué)時(shí)50分鐘)課堂講授30分鐘課堂練習(xí)20分鐘6.5.1類繼承的實(shí)現(xiàn)6.5.2方法覆蓋學(xué)時(shí)及分配(第2學(xué)時(shí)50分鐘)課堂講授20分鐘課堂練習(xí)30分鐘6.5.3super關(guān)鍵字6.5.4調(diào)用父類構(gòu)造方法知識(shí)點(diǎn)分析重點(diǎn):繼承的實(shí)現(xiàn)super關(guān)鍵字難點(diǎn):方法重寫教學(xué)過程設(shè)計(jì)內(nèi)容方式問題導(dǎo)入本節(jié)來學(xué)習(xí)繼承及繼承的實(shí)現(xiàn)、定義類的子類、如何覆蓋超類的方法。內(nèi)容要點(diǎn)6.5類的繼承在Java語言中,繼承的基本思想是可以從已有的類派生出新類。不同的類可能會(huì)有一些共同的特征和行為,可以將這些共同的特征和行為統(tǒng)一放在一個(gè)類中,使它們可以被其他類所共享。6.5.1類繼承的實(shí)現(xiàn)實(shí)現(xiàn)類的繼承,使用extends關(guān)鍵字,格式如下:[public]class子類名extends父類名{//類體定義}這樣聲明后就說子類繼承了超類或者說子類擴(kuò)展了父類。如果父類又是其他類的子類,則這里的子類就為那個(gè)類的間接子類。設(shè)現(xiàn)有Person類,要設(shè)計(jì)一個(gè)Employee類。因?yàn)镋mployee也是Person,那么就沒有必要從頭定義Employee類,可以繼承Person類。因?yàn)镋mployee除具有人員Person的特征,還有一些自己的特征(如描述員工工資,計(jì)算工資的操作等)。程序6-7是Person類,程序6-8是Employee類表示員工?!境绦?-7】Person.javapackagecom.boda.xy;publicclassPerson{publicStringname;publicintage;publicPerson(){//無參構(gòu)造方法}publicPerson(Stringname,intage){//帶參數(shù)構(gòu)造方法=name;this.age=age;}publicvoidsayHello(){System.out.println("Hello,Mynameis"+name);}}有了Person類,我們定義Employee類時(shí)就可繼承Person類,而不必再從頭定義Employee類,代碼如下?!境绦?-8】Employee.java繼承Person類packagecom.boda.xy;繼承Person類salary表示員工工資,不必定義name和age,它們從父類繼承來。publicclassEmployeeextendsPerson{salary表示員工工資,不必定義name和age,它們從父類繼承來。publicdoublesalary;//無參構(gòu)造方法publicEmployee(){}//帶一個(gè)參數(shù)構(gòu)造方法publicEmployee(doublesalary){this.salary=salary;}//帶3個(gè)參數(shù)構(gòu)造方法調(diào)用父類構(gòu)造方法publicEmployee(Stringname,intage,doublesalary){調(diào)用父類構(gòu)造方法super(name,age);this.salary=salary;}publicdoublecomputeSalary(inthours,doublerate){這里計(jì)算員工的工資doublesalary=hours*rate;這里計(jì)算員工的工資returnthis.salary+salary;}}這里Employee類繼承或擴(kuò)展了Person類,它成為Person類的子類,Person類成為Employee類的父類。關(guān)于類繼承的幾點(diǎn)說明:(1)子類繼承父類中非private的成員變量和成員方法。例如,在Employee類中可以使用父類中繼承來的name和age屬性,還可以調(diào)用從父類中繼承來的方法,如sayHello()方法。子類中還可以定義自己的成員變量和成員方法,如Employee類中定義了一個(gè)表示工資的變量salary,還定義了computeSalary()方法。(2)定義類時(shí)若缺省extends關(guān)鍵字,則所定義的類為java.lang.Object類的直接子類。在Java程序中,所有類都是Object類的直接或間接子類。如,Person類就是Object類的子類,Person類也繼承了Object類中定義的方法。Employee類、Person類和Object之間的類層次關(guān)系如圖6-7所示,箭頭號(hào)表示繼承關(guān)系。前面定義的所有類也都是Object的子類。ObjectObjectPersonPersonEmployeeEmployee圖6-7類層次關(guān)系圖(3)Java僅支持單繼承,即一個(gè)類至多只有一個(gè)直接父類。在Java中可以通過接口實(shí)現(xiàn)其他語言中的多繼承。定義了子類后,就可以使用其構(gòu)造方法創(chuàng)建子類對(duì)象。下面程序演示了子類對(duì)象的使用?!境绦?-9】EmployeeTest.javapackagecom.boda.xy;publicclassEmployeeTest{publicstaticvoidmain(String[]args){ varemp=newEmployee("張明月",30,5000);System.out.println("姓名="+); System.out.println("年齡="+emp.age); emp.sayHello();//調(diào)用從父類繼承的方法System.out.println(puteSalary(10,50.0));//調(diào)用子類定義的方法}}該程序使用Employee類的構(gòu)造方法創(chuàng)建了一個(gè)員工對(duì)象,然后訪問從父類繼承來的name和age變量,調(diào)用從父類繼承來的sayHello()方法,最后調(diào)用子類定義的computeSalary()方法。這里創(chuàng)建的Employee類的對(duì)象emp的UML圖如圖所示。6.5.2方法覆蓋在子類中可以定義與父類中的名字、參數(shù)列表、返回值類型都相同的方法,這時(shí)子類的方法就叫做覆蓋(overriding)或重寫了父類的方法。假設(shè)要在Employee類中也定義一個(gè)sayHello()方法,它用來輸出員工信息,可定義如下:publicvoidsayHello(){System.out.println("你好!我是"+name);System.out.println("我的工資是"+salary);}該方法就是對(duì)Person類的sayHello()方法的覆蓋。如果子類覆蓋了超類的方法,再調(diào)用相同的方法時(shí),調(diào)用的是子類的方法。為了避免在覆蓋方法時(shí)寫錯(cuò)方法頭,可以使用@Override注解語法,即在要覆蓋的方法前面添加@Override注解。例如,假設(shè)一個(gè)Employee類要覆蓋Object類的toString()方法,代碼如下:@OverridepublicStringtoString(){return"姓名:"+name+"年齡:"+age;}@Override注解表示其后的方法必須是覆蓋父類的一個(gè)方法。如果具有該注解的方法沒有覆蓋父類的方法,編譯器將報(bào)告一個(gè)錯(cuò)誤。例如,toString如果被錯(cuò)誤地寫成tosrting,將報(bào)告一個(gè)編譯錯(cuò)誤。如果沒有使用注解,編譯器不會(huì)報(bào)告錯(cuò)誤。使用注解可以避免錯(cuò)誤。關(guān)于方法覆蓋,有下面兩點(diǎn)值得注意:(1)父類中private方法不能被覆蓋。只有非private的實(shí)例方法才可以覆蓋,如果在子類中定義了一個(gè)方法在父類中是private的,則這兩個(gè)方法完全無關(guān)。(2)父類中static方法也不能被覆蓋,但可以被繼承。如果子類中定義了與父類中的static方法完全一樣的方法,那么父類中的方法被隱藏。父類中被隱藏的static方法仍然可以使用“類名.方法名()”形式調(diào)用。6.5.3super關(guān)鍵字在子類中可以使用super關(guān)鍵字,它用來引用當(dāng)前對(duì)象的父類對(duì)象,它可用于下面三種情況。(1)在子類中調(diào)用父類中被覆蓋的方法,格式為:super.方法名([參數(shù)列表])(2)在子類中調(diào)用父類的構(gòu)造方法,格式為:super([參數(shù)列表])(3)在子類中訪問父類中被隱藏

溫馨提示

  • 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)論