Java程序設(shè)計(jì)案例教程(第2版)課件 單元5 面向?qū)ο笤O(shè)計(jì)_第1頁
Java程序設(shè)計(jì)案例教程(第2版)課件 單元5 面向?qū)ο笤O(shè)計(jì)_第2頁
Java程序設(shè)計(jì)案例教程(第2版)課件 單元5 面向?qū)ο笤O(shè)計(jì)_第3頁
Java程序設(shè)計(jì)案例教程(第2版)課件 單元5 面向?qū)ο笤O(shè)計(jì)_第4頁
Java程序設(shè)計(jì)案例教程(第2版)課件 單元5 面向?qū)ο笤O(shè)計(jì)_第5頁
已閱讀5頁,還剩155頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit55.1.1包的作用與意義5.1.3導(dǎo)入包-import5.1.4staticimport5.1包5.1.2定義包-package5.1.1包的作用與意義

包的概念為更好地利用和管理類,Java引入了包的機(jī)制。所謂包就是一組相關(guān)類的集合。包和操作系統(tǒng)管理磁盤的“文件夾”或“目錄”概念基本相似。因此在設(shè)計(jì)包時(shí),應(yīng)該盡可能地將功能相近、用途相似、相互之間關(guān)系密切的類放在同一個(gè)包中。

包訪問性同一個(gè)包中的類是可見的。如果一個(gè)類沒有訪問控制符,說明它具有缺省的訪問控制符特性。此時(shí),這個(gè)類只能被同一個(gè)包中的類訪問或引用。這一訪問特性又稱為包訪問性。在Java中,同一個(gè)包中的類和接口之間的相互訪問權(quán)限要高于不同包的類和接口,所以在設(shè)計(jì)類時(shí)應(yīng)該有意識地規(guī)劃組織類。5.1.1包的作用與意義

JavaAPIJava提供了大量的系統(tǒng)類,為方便管理和使用,分為若干個(gè)程序包。程序包又稱為類庫或API(應(yīng)用程序接口)。JavaAPI一方面為編程人員提供了豐富的類和方法,另一方面又負(fù)責(zé)與系統(tǒng)軟硬件打交道。JavaAPI包一般都以“java”或“javax”開頭,以區(qū)別于用戶所創(chuàng)建的包。Java中常用的程序包(1)java.lang包java.lang包是Java語言的核心類庫,包含了運(yùn)行Java程序必不可少的系統(tǒng)類,如基本數(shù)據(jù)類型、基本數(shù)學(xué)函數(shù)、字符串處理、線程、異常處理類等5.1.1包的作用與意義(2)java.io包java.io包是Java語言的標(biāo)準(zhǔn)輸入/輸出類庫,包含了實(shí)現(xiàn)Java與操作系統(tǒng)、用戶界面以及其他Java程序做數(shù)據(jù)交換所使用的類,如基本輸入/輸出流、文件輸入/輸出流、過濾輸入/輸出流、管道輸入/輸出流、隨機(jī)輸入/輸出流等。。(3)java.util包java.util包包括了Java語言中的一些低級的實(shí)用工具,如處理時(shí)間的Date類,處理變長數(shù)組的Vector類,實(shí)現(xiàn)棧和雜湊表的Stack類和Hashtable類等。(4)java.awt包java.awt包是Java語言用來構(gòu)建用戶界面(GUI)的類庫,它包括了許多界面元素和資源,主要在三個(gè)方面提供界面設(shè)計(jì)支持:低級繪圖操作,如Graphics類等;圖形界面組件和布局管理,如Checkbox類、Container類、LayoutManager接口等;以及界面用戶交互控制和事件響應(yīng),如Event類。Java中常用的程序包5.1.1包的作用與意義(5)java.applet包java.applet包用來實(shí)現(xiàn)運(yùn)行于Internet瀏覽器中的JavaApplet的工具類庫,它僅包含少量幾個(gè)接口和一個(gè)非常有用的類java.applet.Applet。(6)包包是Java語言用來實(shí)現(xiàn)網(wǎng)絡(luò)功能的類庫。實(shí)現(xiàn)的功能,如:底層的網(wǎng)絡(luò)通信,如實(shí)現(xiàn)套接字通信的Socket類、ServerSocket類;編寫用戶自己的Telnet、FTP、郵件服務(wù)等實(shí)現(xiàn)網(wǎng)上通信的類;用于訪問Internet上資源的類,如URL類等。(7)java.rmi包、java.rmi.registry包和java.rmi.server包這三個(gè)包用來實(shí)現(xiàn)RMI(remotemethodinvocation,遠(yuǎn)程方法調(diào)用)功能。利用RMI功能,用戶程序可以在遠(yuǎn)程計(jì)算機(jī)(服務(wù)器)上創(chuàng)建對象,并在本地計(jì)算機(jī)(客戶機(jī))上使用這個(gè)對象。Java中常用的程序包5.1.1包的作用與意義(8)java.security包java.security包提供了用于Java程序安全性控制和管理的相關(guān)類和接口。(9)java.util.zip包java.util.zip包提供了與文件壓縮相關(guān)的類和接口。(10)java.sql包java.sql包是實(shí)現(xiàn)JDBC(Javadatabaseconnection)的類庫。利用這個(gè)包可以使Java程序具有訪問不同種類數(shù)據(jù)庫的功能,如Oracle、Sybase、DB2、SQLServer等。只要安裝了合適的驅(qū)動程序,同一個(gè)Java程序幾乎不需修改就可以存取、修改這些不同的數(shù)據(jù)庫中的數(shù)據(jù)。Java中常用的程序包浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.1.1包的作用與意義5.1.3導(dǎo)入包-import5.1.4staticimport5.1包5.1.2定義包-package5.1.2定義包-package

源程序歸入包若要把Java的源程序歸入某個(gè)包中,應(yīng)在源程序的第一行加上:package包名;在源文件中,package是源程序的第一條語句,包名后緊跟分號。如:packagecom.mycompany;publicclassNewClass{ ……}5.1.2定義包-package010203包名除了要符合Java對標(biāo)識符的命名規(guī)則外,還應(yīng)考慮包名的唯一性。建議采用Internet域名或電子郵件地址的字符串作為包名的前綴。建議包名統(tǒng)一采用小寫。注意5.1.2定義包-package實(shí)際上,創(chuàng)建包就是在當(dāng)前文件夾下創(chuàng)建一個(gè)子文件夾,以便存放這個(gè)包中包含的所有類的.class文件。上面的例子中,創(chuàng)建包的語句中的符號“.”代表了目錄分隔符,即這個(gè)語句創(chuàng)建了兩個(gè)文件夾。第一個(gè)是當(dāng)前文件夾下的子文件夾com;第二個(gè)是com下的子文件夾mycompany,當(dāng)前包中的所有類就存放在這個(gè)文件夾里。packagecom.mycompany;浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.1.1包的作用與意義5.1.3導(dǎo)入包-import5.1.4staticimport5.1包5.1.2定義包-package5.1.3導(dǎo)入包-import將類組織成包的目的是為了更好地引用包中的類,通常一個(gè)類只能引用與它在同一個(gè)包中的類。

如果需要使用其它包中的public類,則可以使用如下三種方式:(1)使用包名、類名前綴一個(gè)類要引用其他的類,如果被引用的類不是同一個(gè)包中的類,則需要在類名的前面加上包名前綴。使用該方法訪問一個(gè)類會顯得冗長且麻煩。例如:java.util.ArrayLista=newjava.util.ArrayList();5.1.3導(dǎo)入包-import(3)加載整個(gè)包有些情況下可以直接利用import語句引入整個(gè)包,此時(shí)這個(gè)包中的所有類都會被加載到當(dāng)前程序中,凡是用這個(gè)包中的類,都不需要再使用包名前綴。加載整個(gè)包的import語句可以寫為:importjava.util.*;(2)加載需要使用的類在程序文件的開始部分利用import語句將需要使用的整個(gè)類加載到當(dāng)前程序中,這樣在程序中需要引用這個(gè)類的地方就不需再使用包名作為前綴。例如上面的語句在程序開始處增加了:importjava.util.ArrayList;語句之后,就可以直接寫成:ArrayLista=newArrayList();浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.1.1包的作用與意義5.1.3導(dǎo)入包-import5.1.4staticimport5.1包5.1.2定義包-package5.1.4staticimport

靜態(tài)導(dǎo)入聲明

靜態(tài)導(dǎo)入聲明可以讓我們導(dǎo)入一個(gè)類或者接口的靜態(tài)成員,這樣,你就可以直接訪問這些靜態(tài)成員,而不必使用類名.成員這樣的格式,直接訪問即可。static導(dǎo)入聲明用來僅導(dǎo)入類的靜態(tài)成員。常規(guī)的導(dǎo)入語句用來導(dǎo)入程序中要使用的指定類。5.1.4staticimport導(dǎo)入指定的靜態(tài)成員(稱為單個(gè)靜態(tài)導(dǎo)入)導(dǎo)入一個(gè)類中的所有靜態(tài)成員(稱為按需靜態(tài)導(dǎo)入)12靜態(tài)導(dǎo)入聲明的形式例如:importstaticpackageName.ClassName.staticMemberName;例如:importstaticpackageName.ClassName.*;5.1.4staticimport靜態(tài)導(dǎo)入例子:importstaticjava.lang.Math.*;publicclassStaticImportTest{publicstaticvoidmain(Stringargs[]){System.out.printf("sqrt(900.0)=%.1f\n",sqrt(900.0));System.out.printf("ceil(-9.8)=%.1f\n",ceil(-9.8));System.out.printf("log(E)=%.1f\n",log(E));System.out.printf("cos(0.0)=%.1f\n",cos(0.0));}}浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.2.1static修飾符5.2.3final修飾符5.2.4final類5.2關(guān)鍵修飾符5.2.2static語句塊5.2.1static修飾符

static關(guān)鍵字和靜態(tài)成員static關(guān)鍵字的中文含義是“靜態(tài)”,使用static修飾的成員變量、常量、方法和代碼塊分別稱為靜態(tài)變量、靜態(tài)常量、靜態(tài)方法及靜態(tài)代碼塊,統(tǒng)稱為靜態(tài)成員。

靜態(tài)成員的使用靜態(tài)成員歸整個(gè)類所有,不依賴類的對象,是被類的所有對象共享,只要這個(gè)類被JVM加載,就可以根據(jù)類名在全局?jǐn)?shù)據(jù)區(qū)找到它們。因此,靜態(tài)成員可以在任何對象未創(chuàng)建前訪問,無需對象訪問。5.2.1static修飾符010203static方法是屬于整個(gè)類的,它在內(nèi)存中的代碼段將隨著類的定義而分配和裝載。而非static的方法是屬于某個(gè)對象的方法,當(dāng)這個(gè)對象創(chuàng)建時(shí),在對象的內(nèi)存中擁有這個(gè)方法的專用代碼段。引用靜態(tài)方法時(shí),可以使用對象名做引用者,也可以使用類名做引用者(推薦);static方法只能訪問static數(shù)據(jù)成員,不能訪問非static數(shù)據(jù)成員,但非static型方法可以訪問static數(shù)據(jù)成員。靜態(tài)方法特點(diǎn)5.2.1static修飾符040506static方法只能訪問static方法,不能訪問非static方法,但非static方法可以訪問static方法。static方法不能被覆蓋,也就是說,子類中不能有與父類中的static方法具有相同名、相同參數(shù)的方法。main方法是靜態(tài)方法。在Java的每個(gè)Application程序中,都必須有且只能有一個(gè)main方法,它是Application程序運(yùn)行的入口點(diǎn)。靜態(tài)方法特點(diǎn)5.2.1static修飾符static型方法的典型應(yīng)用如下:publicclassStaticMethodTest{publicstaticvoidmain(String[]args){inta=9;intb=10;intc=GeneralFunction.addUp(a,b);//類名調(diào)用靜態(tài)方法

System.out.println("a="+a+",b="+b);System.out.println("調(diào)用addUp(a,b)方法,返回值:"+c);}}classGeneralFunction{publicstaticintaddUp(intx,inty){returnx+y;}}靜態(tài)方法(類方法)也可以使用對象名來調(diào)用,例如編寫以下代碼效果不變。但我們建議使用類名來調(diào)用靜態(tài)方法,這樣更能體現(xiàn)靜態(tài)方法屬于類的特性。GeneralFunctiongen=newGeneralFunction();intc=gen.addUp(a,b);5.2.1static修飾符classFather{intd1;staticintd2;voidmethod(){d1=0;}staticvoidmethod1(){method2();//合法引用

d1=33;//錯(cuò),非法引用了非static的數(shù)據(jù)成員

method();//錯(cuò),非法引用了非static的方法

d2=55;//合法引用

}staticvoidmethod2(){d2++;}}classSonextendsFather{//錯(cuò),子類不能覆蓋父類中的static方法voidmethod1()

{inta=0,b;b=a+1;}}static型方法聲明及使用有時(shí)容易出錯(cuò),需引起注意浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.2.1static修飾符5.2.3final修飾符5.2.4final類5.2關(guān)鍵修飾符5.2.2static語句塊5.2.2static語句塊

使用static修飾的代碼塊稱為靜態(tài)代碼塊。靜態(tài)代碼塊主要用于初始化類,為類的靜態(tài)屬性初始化。5.2.2static語句塊010203靜態(tài)代碼塊不能存在于任何方法體內(nèi)。靜態(tài)代碼塊不能直接訪問實(shí)例變量和實(shí)例方法,需要通過類的實(shí)例對象來訪問.JVM在加載類時(shí)會執(zhí)行靜態(tài)代碼塊,所以靜態(tài)代碼塊先于主方法執(zhí)行。如果類中包含多個(gè)靜態(tài)代碼塊,那么將按照先定義的代碼塊先執(zhí)行,后定義的代碼塊后執(zhí)行,每個(gè)靜態(tài)代碼塊只執(zhí)行一次。靜態(tài)代碼塊特點(diǎn)5.2.2static語句塊publicclassCodeblock03{static{System.out.println("Codeblock的靜態(tài)代碼塊");}//靜態(tài)代碼塊

publicCodeblock03(){System.out.println("Codeblock的構(gòu)造方法");}//構(gòu)造方法

publicstaticvoidmain(String[]args){System.out.println("Codeblock的主方法");newCode();newCode();//創(chuàng)建兩個(gè)Code對象newCodeblock03();newCodeblock03();//創(chuàng)建兩個(gè)Codeblock03對象

}}classCode{static{System.out.println("Code的靜態(tài)代碼塊");}//靜態(tài)代碼塊

publicCode(){System.out.println("Code的構(gòu)造方法");}//構(gòu)造方法}5.2.2static語句塊程序的運(yùn)行結(jié)果如圖所示:從程序的運(yùn)行結(jié)果可以看出,在public類中的靜態(tài)代碼塊優(yōu)先于主方法執(zhí)行。值得注意的是,無論創(chuàng)建多少個(gè)對象,靜態(tài)代碼塊只會執(zhí)行一次。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.2.1static修飾符5.2.3.final修飾符5.2.4final類5.2關(guān)鍵修飾符5.2.2static語句塊5.2.3final修飾符final關(guān)鍵字的中文含義是“最終的”的意思,可以修飾變量、非抽象的方法和非抽象的類,具有控制變量、成員方法和一個(gè)類是否可以被重寫或者被繼承等功能。5.2.3final修飾符1final型變量

final修飾的基本類型變量如果基本類型變量被修飾為final,其結(jié)果是它成為常量。

想改變final變量的值會導(dǎo)致一個(gè)編譯錯(cuò)誤。下面是一個(gè)正確定義final變量的例子:publicfinalintMAX_ARRAY_SIZE=25;

5.2.3final修飾符1final型變量

final修飾的類的對象如果將對象句柄(即任何類的類型)標(biāo)記為final,那么該句柄不能指向任何其它對象。但可以改變對象的內(nèi)容,因?yàn)橹挥芯浔旧硎莊inal。典型示例如下:典型示例:classStudent{StringstrName;StringstrNum;publicStudent(Stringname,Stringnum){strName=name;strNum=num;}}5.2.3final修飾符1final型變量publicclassFinalVarTest{publicstaticvoidmain(String[]args){finalintMAXSIZE=2;//定義常量

Studentastudent=newStudent("Tom","901");System.out.println("對象astudent的信息:"+astudent.strName+","+astudent.strNum);finalStudentbstudent=newStudent("Lucy","902");//定義對象型句柄bstudentSystem.out.println("對象bstudent的信息:"+bstudent.strName+","+bstudent.strNum);//bstudent=astudent;//錯(cuò),final型對象變量不能改變它所關(guān)聯(lián)的實(shí)體

bstudent.strNum="903";//對

System.out.println("修改后對象bstudent的信息:"+bstudent.strName+","+bstudent.strNum);}5.2.3final修飾符2final型方法

final修飾的方法(最終方法)在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,子類可以利用重寫機(jī)制修改從父類那里繼承來的成員方法,這給程序設(shè)計(jì)帶來方便的同時(shí),也會給系統(tǒng)的安全性帶來了一定的威脅。為此,Java語言提供了final修飾符來保證系統(tǒng)的安全。用final修飾符修飾的方法稱為最終方法,如果類的某個(gè)方法被final修飾符所限定,則該類的子類就不能覆蓋父類的方法,即不能再重新定義與此方法同名的自己的方法,而僅能使用從父類繼承來的該方法??梢?,使用final修飾方法,就是為了給方法“上鎖”,防止任何子類修改此方法,保證了程序的安全性和正確性。5.2.3final修飾符2final型方法classFatherClass{staticintd1;intd2;staticvoidmethod1(){d1=0;}finalvoidmethod2(){d2++;}voidmethod3(){d1=d2+1;}}classSonClassextendsFatherClass{voidmethod1(){d1=3;}/*錯(cuò),子類中不能覆蓋父類中的static方法,由于類的static型方法會自動地系統(tǒng)定為final型,因此它也不能被覆蓋。*/voidmethod2(){d2=3;}//錯(cuò),子類不能覆蓋父類中的final方法

voidmethod3(){d1=d2;}//對}final型方法的典型應(yīng)用5.2.3final修飾符2final型方法0102保持父類的某個(gè)方法的操作在被繼承時(shí)不會發(fā)生變化??梢栽僖欢ǔ潭壬咸岣叻椒ǖ膱?zhí)行速度,因?yàn)樵谡{(diào)用final修飾的方法時(shí),就不會再進(jìn)行覆蓋的判斷了。

final修飾的方法的作用浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.2.1static修飾符5.2.3final修飾符5.2.4final類5.2關(guān)鍵修飾符5.2.2static語句塊5.2.4final類

final修飾的類(最終類)用final修飾的類稱為最終類。最終類不能被繼承,也就是該類不能有子類。所有包含在final類中的方法,都自動成為final方法。優(yōu)點(diǎn)缺點(diǎn)保證了系統(tǒng)的安全性。降低了代碼的可重用性和可擴(kuò)展性5.2.4final類123基于安全原因,類的實(shí)現(xiàn)行為不允許有任何改動。不是專門為繼承而設(shè)計(jì)的類,類本身的方法調(diào)用關(guān)系復(fù)雜。創(chuàng)建設(shè)計(jì)模型時(shí),確定該類不會再擴(kuò)展。最終類在以下幾個(gè)方面可使用5.2.4final類finalclassFinalClass{intd1,d2;voidmethod1(){d1=0;}voidmethod2(){d2++;}}classSonClassextendsFinalClass//錯(cuò),final類不能被任何類繼承。{voidmethod1(){d1=3;}voidmethod2(){d2=3;}}示例程序(不能通過正常編譯)浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院案例

5-3單元5面向?qū)ο笤O(shè)計(jì)圖書借閱系統(tǒng)案例單元Java語言程序設(shè)計(jì)主講張紅eclipseeclipseeclipse案例

5-3:圖書借閱系統(tǒng)案例目標(biāo)根據(jù)書籍借閱的天數(shù)計(jì)算歸還日期。案例解釋圖書館書籍歸還時(shí)間規(guī)定如下:任何書籍自借閱日起,15天內(nèi)必須歸還(標(biāo)準(zhǔn)極限時(shí)間);用戶也可以明確告知圖書館書籍的歸還日期,例如:10天后歸還;用戶自定義的書籍歸還日期,不能超過圖書館規(guī)定的極限時(shí)間:15天。案例效果實(shí)現(xiàn)思路基本步驟按實(shí)訓(xùn)要求創(chuàng)建工程并配置環(huán)境創(chuàng)建工具類:DateUtils創(chuàng)建歸還日期計(jì)算函數(shù):getReturnDate創(chuàng)建標(biāo)準(zhǔn)歸還日期計(jì)算函數(shù):getReturnDate使用工具類案例

5-3:圖書借閱系統(tǒng)浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.4.1抽象類的運(yùn)用場合5.4.2定義抽象類5.4.3繼承抽象類5.4抽象類5.4.1抽象類的運(yùn)用場合

抽象類概述在大多數(shù)情況下,Java的類是可以被其他類繼承的,也可以被直接實(shí)例化使用。但有一種類是專門用來做父類的,自身也不能實(shí)例化,這樣的類稱為抽象類。抽象類有點(diǎn)類似于“模板”的作用,目的是根據(jù)其格式來創(chuàng)建和修改新的類,對象不能由抽象類直接創(chuàng)建,只可以通過抽象類派生出新的子類,再由其子類來創(chuàng)建對象。當(dāng)一個(gè)類被聲明為抽象類時(shí),要在這個(gè)類前面加上修飾符abstract,在抽象類中的成員方法可以包括一般方法和抽象方法。包含了抽象方法的類一律稱為抽象類,一個(gè)抽象類可以存在一個(gè)或多個(gè)抽象方法。

抽象方法是只定義了方法的聲明但不包含具體實(shí)現(xiàn)的方法。5.4.1抽象類的運(yùn)用場合

抽象類的定義與優(yōu)點(diǎn)抽象類可以幫助你管理你的代碼,如:當(dāng)你定義一個(gè)寵物抽象類時(shí),你希望所有的寵物都具有吃、喝、叫功能,這樣你就可以在這個(gè)寵物類中添加三個(gè)抽象方法。在你繼承這個(gè)寵物類時(shí),會提示你是否要實(shí)現(xiàn)這三個(gè)抽象方法。這樣我們便看到了它的好處,它可以防止我們漏掉一些功能,便于我們的開發(fā)。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.4.1抽象類的運(yùn)用場合5.4.2定義抽象類5.4.3繼承抽象類5.4抽象類5.4.2定義抽象類

類的抽象方法類的抽象方法是指沒有具體實(shí)現(xiàn)的方法,抽象方法用關(guān)鍵字abstract修飾:

abstractvoidfn();正如上面所示,fn()方法不存在方法體。5.4.2定義抽象類

抽象類的定義任何含有一個(gè)或多個(gè)抽象方法的類都必須聲明為抽象類。否則,編譯器會向我們報(bào)告一條出錯(cuò)消息。聲明一個(gè)抽象類,只需在類聲明開始時(shí)在關(guān)鍵字class前使用關(guān)鍵字abstract。抽象類定義的具體形式為:abstractclass類名稱{

成員變量;

方法(){……};//一般方法

abstract方法();//抽象方法}5.4.2定義抽象類010203抽象類沒有對象。也就是說,一個(gè)抽象類不能通過new操作符直接實(shí)例化。這樣的對象是無用的,因?yàn)槌橄箢愂遣煌耆x的。不能定義抽象構(gòu)造方法或抽象靜態(tài)方法。所有抽象類的子類都必須實(shí)現(xiàn)父類中的所有抽象方法、或者是它自己也聲明成abstract類。注意點(diǎn)5.4.2定義抽象類若定義Person抽象類:abstractclassPerson{publicstaticfinalStringcountry="中國"; privateStringname;publicvoidsetName(Stringname){=name;}publicStringgetName(){returnname;}publicabstractvoidtell();//定義抽象方法,沒有方法主體}則抽象類可以創(chuàng)建句柄、不能創(chuàng)建對象。如:Personp;//正確,可以定義一個(gè)抽象類句柄Personx=newPerson();//錯(cuò),不允許定義一個(gè)抽象類對象浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.4.1抽象類的運(yùn)用場合5.4.2定義抽象類5.4.3繼承抽象類5.4抽象類5.4.3繼承抽象類抽象類的實(shí)現(xiàn)是指具體化抽象類中的所有抽象方法,這一任務(wù)通常交給抽象類的子類去完成。

子類對抽象類中的抽象方法繼承時(shí),必須實(shí)現(xiàn)抽象類中的所有抽象方法,否則該子類仍被定義為抽象類。若定義Person抽象類:abstractclassPerson{publicstaticfinalStringcountry="中國"; privateStringname;publicvoidsetName(Stringname){=name;}publicStringgetName(){returnname;}publicabstractvoidtell();//定義抽象方法,沒有方法主體}抽象類的實(shí)現(xiàn)5.4.3繼承抽象類構(gòu)造抽象類Person的子類Student:classStudentextendsPerson{publicvoidtell()//重寫抽象類的所有抽象方法

{System.out.println("我叫"+getName()+",是一名"+country+"人!");}}publicclassAbstractDemo01{publicstaticvoidmain(String[]args){Studentstu=newStudent();//創(chuàng)建Student類的實(shí)例

stu.setName("小強(qiáng)");stu.tell();//調(diào)用子類Student的tell()}}浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院案例

5-5單元5面向?qū)ο笤O(shè)計(jì)工程師房屋建造案例單元Java語言程序設(shè)計(jì)主講張紅eclipseeclipseeclipse案例

5-5:工程師房屋建造案例目標(biāo)以建筑師房屋建造為業(yè)務(wù)背景,體驗(yàn)“抽象類”與子類的應(yīng)用關(guān)系和特性。案例解釋房屋建造的施工規(guī)范和流程:先建基礎(chǔ)設(shè)施(如地基),再建主體設(shè)施。基礎(chǔ)設(shè)施必須在計(jì)劃完工時(shí)間前完成施工,隨后開始主體設(shè)施建設(shè)。若實(shí)際完工時(shí)間超過計(jì)劃完工時(shí)間,則不能進(jìn)行主體設(shè)施建設(shè)。案例效果實(shí)現(xiàn)思路基本步驟按實(shí)訓(xùn)要求創(chuàng)建工程并配置環(huán)境創(chuàng)建建造者抽象類:Builder創(chuàng)建辦公室建造者實(shí)體類:OfficeBuilder,OfficeBuilder類需繼承自Builder抽象類創(chuàng)建別墅建造者實(shí)體類:VillaBuilder,VillaBuilder類需繼承自Builder抽象類顯示兩類建筑工程實(shí)施結(jié)果案例

5-5:工程師房屋建造浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.6.1接口類的運(yùn)用場合5.6.2定義接口與方法5.6.3接口默認(rèn)方法(新特性)5.6接口5.6.1接口類的運(yùn)用場合接口(interface)是OOP中又一重要的概念,也是Java中實(shí)現(xiàn)數(shù)據(jù)抽象的重要途徑。所以,本質(zhì)上接口即一系列的行為規(guī)范,它只說明類應(yīng)該做什么,但并不關(guān)心如何做。那么什么是接口呢?事實(shí)上,接口普遍存在于現(xiàn)實(shí)生活中,例如,超市中有各式各樣由不同廠商生產(chǎn)的電視機(jī),產(chǎn)品性能各有特色,但一點(diǎn)是相同的,即都能正常地接收當(dāng)?shù)氐碾娨曅盘枺a(chǎn)品不同那為什么能接收的電視節(jié)目是相同的呢?答案是顯然的,因?yàn)槊恳慌_電視機(jī)在生產(chǎn)過程中都遵循了本土電視信號接收的行業(yè)規(guī)范,這種行業(yè)規(guī)范就是一種接口,它是由相關(guān)部門指定的,這個(gè)部門只是制定了規(guī)范,但并不管生產(chǎn)是如何進(jìn)行的。又如,在美國不同廠商生產(chǎn)的電源插座在其本土可以隨處使用,而拿到中國就用不來,為何?因?yàn)槊绹椭袊碾娫床遄涌谑遣煌模罢呤?10V而后者是220V。5.6.1接口類的運(yùn)用場合在Java中,接口是一個(gè)比類更加抽象的概念。一個(gè)類通常規(guī)定了同一類事物應(yīng)有的靜態(tài)屬性和動態(tài)行為,而一個(gè)接口則規(guī)定了一系列類應(yīng)有的共同的屬性和行為。由于接口的聲明僅僅給出了抽象的方法,因此,要具體地實(shí)現(xiàn)接口所規(guī)定的功能就必須在某個(gè)類中為接口寫出具體的方法體。在Java中,對接口功能的“繼承”被稱為“實(shí)現(xiàn)”。5.6.1接口類的運(yùn)用場合123通過接口可以實(shí)現(xiàn)不相關(guān)類的相同行為,不需要考慮這些類層次之間的關(guān)系。通過接口可以指明多個(gè)類需要實(shí)現(xiàn)的方法。通過接口可以在運(yùn)行時(shí)動態(tài)地定位類所調(diào)用的方法。Java中接口的功能主要體現(xiàn)在以下幾點(diǎn)浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.6.1接口類的運(yùn)用場合5.6.2定義接口與方法5.6.3接口默認(rèn)方法(新特性)5.6接口5.6.2定義接口與方法1定義接口

接口定義的格式接口的定義與類的定義非常相似,我們可以把接口理解為一個(gè)特殊的類:由常量和抽象方法組成的類。接口定義的常用格式為:[public]interface接口名[extends父接口名列表]//接口聲明{[public][static][final]類型常量名=值;//常量聲明

[public][abstract]返回類型方法名(參列表)[throws異常類型列表]; //上面一行是抽象方法聲明}5.6.2定義接口與方法1定義接口010203在接口聲明前可以放置接口修飾符public,修飾為public的接口可以被不同包內(nèi)的接口或類使用,沒有public修飾的接口只能被其所在包中的成員訪問。接口也有繼承性,定義接口時(shí)也可以通過extends聲明它們父接口并繼承父接口的所有屬性和方法,與類的繼承性不同的是一個(gè)接口可有多個(gè)父接口,這些父接口之間用逗號隔開,形成父接口名列表。接口體由屬性(都是常量)聲明和方法(都是抽象方法)聲明組成。接口中的屬性必須是publicstaticfinal修飾的,但可以不寫,因?yàn)檫@是系統(tǒng)默認(rèn)的。接口中的方法系統(tǒng)默認(rèn)為publicabstract,可以不寫修飾符。注意點(diǎn)5.6.2定義接口與方法1定義接口接口定義的一個(gè)典型示例如下://定義一個(gè)樂器(Instrument)接口,包含一個(gè)常量和三個(gè)抽象方法interfaceInstrument{inti=5;//自動獲得static和final屬性

voidplay();//自動獲得public屬性

Stringwhat();voidadjust();}5.6.2定義接口與方法2實(shí)現(xiàn)接口

實(shí)現(xiàn)接口的格式由于接口的聲明僅僅給出了抽象的方法,因此,要具體地實(shí)現(xiàn)接口所規(guī)定的功能就必須在某個(gè)類中為接口寫出具體的方法體。

一個(gè)類要實(shí)現(xiàn)某個(gè)接口,必須在類的定義時(shí)用關(guān)鍵字implements來申明。接口的實(shí)現(xiàn)形式如下:class類名implements接口名列表5.6.2定義接口與方法2實(shí)現(xiàn)接口010203一個(gè)類能實(shí)現(xiàn)多個(gè)接口,多個(gè)接口之間用逗號隔開。如果某個(gè)類實(shí)現(xiàn)了接口,這個(gè)類就可以訪問接口中的常量,就如同它們是聲明在類中的常量一樣。類在實(shí)現(xiàn)接口的方法時(shí),必須顯式地使用訪問控制符public,因?yàn)榻涌诘姆椒ǘ际莗ublic類型的,否則系統(tǒng)會警告縮小了接口中定義的訪問控制范圍。注意點(diǎn)5.6.2定義接口與方法2實(shí)現(xiàn)接口實(shí)現(xiàn)接口的典型例子如下://定義了一個(gè)管樂器(wind)類實(shí)現(xiàn)于樂器(instrument)接口classWindimplementsInstrument{publicvoidplay(){System.out.println("Wind.play()");}publicStringwhat(){return"Wind";}publicvoidadjust(){}}當(dāng)Wind類實(shí)現(xiàn)了Instrument接口中的所有抽象方法的時(shí)候,它就成為了一個(gè)具體類,可以用Wind類定義一個(gè)對象,如:Windw=newWind();浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.6.1接口類的運(yùn)用場合5.6.2定義接口與方法5.6.3接口默認(rèn)方法(新特性)5.6接口5.6.3接口默認(rèn)方法(新特性)

接口的缺陷在Java中一個(gè)接口一旦發(fā)布就已經(jīng)被定型,除非我們能夠一次性的更新所有該接口的實(shí)現(xiàn),否者在接口的添加新方法將會破壞現(xiàn)有接口的實(shí)現(xiàn)。

新特性:默認(rèn)方法Java8新增了接口的默認(rèn)方法,默認(rèn)方法就是為了解決這一問題的,這樣接口在發(fā)布之后依然能夠繼續(xù)演化。簡單說,就是接口可以有實(shí)現(xiàn)方法,而且不需要實(shí)現(xiàn)類去實(shí)現(xiàn)其方法。只需在方法名前面加個(gè)default關(guān)鍵字即可。5.6.3接口默認(rèn)方法(新特性)//定義接口A,并提供foo()方法的默認(rèn)實(shí)現(xiàn)publicinterfaceA{defaultvoidfoo(){System.out.println("CallingA.foo()");}//默認(rèn)方法}//接口實(shí)現(xiàn)類Clazz,并沒有實(shí)現(xiàn)foo()方法,而是通過繼承得到默認(rèn)方法。publicclassClazzimplementsA{publicstaticvoidmain(String[]args){Clazzclazz=newClazz();clazz.foo();//繼承并調(diào)用接口A的foo()方法}浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院案例

5-7單元5面向?qū)ο笤O(shè)計(jì)人才市場找工作案例單元Java語言程序設(shè)計(jì)主講張紅eclipseeclipseeclipse案例

5-7:人才市場找工作案例目標(biāo)以畢業(yè)生在人才市場找工作為背景,體驗(yàn)接口與實(shí)現(xiàn)類的應(yīng)用特性。。案例解釋大學(xué)生有不同的專業(yè)背景,但通常都需要找工作,人才市場根據(jù)不同的專業(yè)和雇主要求為求職者提供工作機(jī)會,人才市場需要每類專業(yè)的畢業(yè)生提供專業(yè)平均分和姓名。案例效果實(shí)現(xiàn)思路基本步驟按實(shí)訓(xùn)要求創(chuàng)建工程并配置環(huán)境創(chuàng)建找工作接口類及分?jǐn)?shù)常量創(chuàng)建實(shí)體類,用于描述軟件專業(yè)創(chuàng)建實(shí)體類,用于描述大數(shù)據(jù)專業(yè)創(chuàng)建實(shí)體類,用于描述人才市場顯示人才市場為求職者找工作的結(jié)果案例

5-7:人才市場找工作浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.8.1內(nèi)部類的運(yùn)用場合5.8.3靜態(tài)內(nèi)部類5.8.4匿名內(nèi)部類5.8內(nèi)部類5.8.2局部內(nèi)部類5.8.1內(nèi)部類的運(yùn)用場合

類的嵌套定義內(nèi)部類(innerclass),即被定義于某一個(gè)類內(nèi)部的類。類的定義可以是多層嵌套的,例如A類中定義B類,在B類中定義C類,C類中還可以定義D類…..將最外層的類稱為頂級類,也稱為頂層類,如A類。

內(nèi)部類的分類根據(jù)內(nèi)部類在外部類中所處的位置不同,可以將內(nèi)部類分為局部內(nèi)部類和成員內(nèi)部類。局部內(nèi)部類是指定義在外部類的方法體中的類。成員內(nèi)部類是指定義在外部類方法體外的內(nèi)部類。5.8.1內(nèi)部類的運(yùn)用場合

成員內(nèi)部類的分類成員內(nèi)部類也可定義為靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類。兩者的最大區(qū)別是:非靜態(tài)內(nèi)部類的對象實(shí)例,必須在有定義它的外部類的對象實(shí)例存在的情況下才能創(chuàng)建,靜態(tài)內(nèi)部類的對象實(shí)例創(chuàng)建則不受此限制。非靜態(tài)內(nèi)部類內(nèi)部不能定義靜態(tài)成員,而靜態(tài)內(nèi)部類內(nèi)部可以定義任意形式的成員。5.8.1內(nèi)部類的運(yùn)用場合1234內(nèi)部類對象可以訪問其所在外部類的所有屬性,包括私有屬性。內(nèi)部類提供了更好的封裝,可以隱藏在外部類之中,不被同一個(gè)包中的其他類所見。匿名內(nèi)部類還可以方便地定義運(yùn)行時(shí)回調(diào)和用于僅需要一次使用的類。使用內(nèi)部類編寫事件驅(qū)動程序很方便。使用內(nèi)部類的主要原因5.8.1內(nèi)部類的運(yùn)用場合//定義一個(gè)含有內(nèi)部類的類OuterclassOuter{privateStringstr="Java學(xué)習(xí)手記"; //聲明內(nèi)部類

publicclassInter{ publicvoidadd(intx,inty){System.out.println(x+"+"+y+"="+(x+y));}publicvoidgetStr(){System.out.println(str);}}//從外部類調(diào)用內(nèi)部類的方法

publicvoidgetInfo(){newInter().getStr();}}//運(yùn)行應(yīng)用例子publicclassInnerClassDemo01{publicstaticvoidmain(String[]args){//創(chuàng)建外部類的實(shí)例,調(diào)用外部類的方法Outerout=newOuter();//

out.getInfo(); //創(chuàng)建內(nèi)部類的實(shí)例,調(diào)用內(nèi)部類的方法

Outer.Interoin=newOuter().newInter();

oin.add(3,5);

oin.getStr();}}定義內(nèi)部類并使用的例子5.8.1內(nèi)部類的運(yùn)用場合

訪問規(guī)則總結(jié)在外部類中,不能直接訪問內(nèi)部類的成員,需要通過內(nèi)部類的實(shí)例去訪問,如newInter().getStr()。而在外部類以外的其他類,則需要通過內(nèi)部類的完整類名訪問內(nèi)部類。在外部類以外的其他類訪問內(nèi)部類的格式為:外部類.內(nèi)部類內(nèi)部類對象=new外部類().new內(nèi)部類();在內(nèi)部類中可以訪問外部類的所有成員,包括私有成員,若是多層嵌套的內(nèi)部類,那么該內(nèi)部類可以訪問所有外部類的所有成員。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.8.1內(nèi)部類的運(yùn)用場合5.8.3靜態(tài)內(nèi)部類5.8.4匿名內(nèi)部類5.8內(nèi)部類5.8.2局部內(nèi)部類5.8.2局部內(nèi)部類

局部內(nèi)部類的概念局部內(nèi)部類是定義在方法體內(nèi)的內(nèi)部類,局部內(nèi)部類僅在該方法里有效。

局部內(nèi)部類的被訪問規(guī)則局部內(nèi)部類不能被外部類和外部類以外的其他類訪問,所以局部內(nèi)部類是不需要訪問控制符和static修飾符。5.8.2局部內(nèi)部類//定義一個(gè)含有局部內(nèi)部類的類OuterclassOuter{publicvoidfun(){

classInter{publicinti=10;}//局部內(nèi)部類定義

Interin=newInter();//局部內(nèi)部類對象創(chuàng)建

System.out.println(in.i);}}//運(yùn)行示例publicclassInnerClassDemo05{publicstaticvoidmain(String[]args){Outerout=newOuter();//創(chuàng)建外部類實(shí)例

out.fun();}}正確應(yīng)用示例

局部內(nèi)部類只在其所定義的方法體內(nèi)有效。5.8.2局部內(nèi)部類classOuter{//Interin=newInter();//編譯錯(cuò)誤

//Interin=newOuter().newInter();//編譯錯(cuò)誤

//Outer.Interin=newOuter().newInter();//編譯錯(cuò)誤

//Outer.Interin=newOuter.Inter();//編譯錯(cuò)誤publicvoidfun(){classInter{publicinti=10;}Interin=newInter();//創(chuàng)建局部內(nèi)部類的實(shí)例

System.out.println(in.i);}}錯(cuò)誤應(yīng)用示例

局部內(nèi)部類不能被外部類和外部類以外的其他類訪問。5.8.2局部內(nèi)部類

局部內(nèi)部類對外的訪問規(guī)則局部內(nèi)部類可以訪問外部類的所有成員,包括私有成員。

若局部內(nèi)部類定義在靜態(tài)方法體內(nèi),局部內(nèi)部類不能直接訪問外部類的非靜態(tài)成員,但可以訪問外部類的靜態(tài)成員,若需要調(diào)用外部內(nèi)的非靜態(tài)成員時(shí),可以通過外部類的實(shí)例。5.8.2局部內(nèi)部類

/*含局部內(nèi)部類的方法fun1()*/publicvoidfun1(){classInter1{privatefloatinterF=4.0F;publicInter1(){System.out.println(f+"+"+interF+"="+(f+interF));}}newInter1();//匿名對象

}注意:外部類的方法fun1所含有的局部內(nèi)部類直接訪問了外部類的屬性f。//定義含局部內(nèi)部類的外部類OuterclassOuter{

privatefloatf=1.0F;//實(shí)例屬性

privatestaticintx=90;//靜態(tài)屬性

/*含局部內(nèi)部類的方法fun1()*//*含局部內(nèi)部類的靜態(tài)方法fun2()*/}對外訪問示例/*含局部內(nèi)部類的靜態(tài)方法fun2()*/publicstaticvoidfun2(){classInter2{privateinti=10;publicInter2(){System.out.println(i+"+"+x+"="+(i+x));

floattemp=newOuter().f;//通過外部類的實(shí)例調(diào)用

System.out.println(i+"+"+temp+"="+(i+temp));}}newInter2();//匿名對象

}5.8.2局部內(nèi)部類注意:外部類的靜態(tài)fun2()所含有的局部內(nèi)部類只能通過外部類的實(shí)例訪問屬性f。對外訪問示例5.8.2局部內(nèi)部類//創(chuàng)建外部類實(shí)例,調(diào)用方法fun1和fun2publicclassInnerClassTest04{publicstaticvoidmain(String[]args){Outerout=newOuter();//創(chuàng)建外部類實(shí)例

out.fun1();out.fun2();}}運(yùn)行結(jié)果圖對外訪問示例浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.8.1內(nèi)部類的運(yùn)用場合5.8.3靜態(tài)內(nèi)部類5.8.4匿名內(nèi)部類5.8內(nèi)部類5.8.2局部內(nèi)部類5.8.3靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類對外的訪問規(guī)則靜態(tài)內(nèi)部類是使用關(guān)鍵字static修飾的內(nèi)部類,是外部類的靜態(tài)成員,因此它遵守類的靜態(tài)成員所應(yīng)遵守的一些規(guī)則,如不能直接訪問外部類的非靜態(tài)成員,只能訪問外部類的靜態(tài)成員等。如果需要訪問外部類的非靜態(tài)成員,則需要?jiǎng)?chuàng)建外部類的對象,再用對象去調(diào)用外部類的非靜態(tài)成員。

靜態(tài)內(nèi)部類的對象創(chuàng)建靜態(tài)內(nèi)部類的實(shí)例對象可以獨(dú)立創(chuàng)建,不與任何外部類的對象相關(guān)聯(lián)。創(chuàng)建靜態(tài)內(nèi)部類對象的語法格式如下:外部類.靜態(tài)內(nèi)部類靜態(tài)內(nèi)部類對象名=new外部類.靜態(tài)內(nèi)部類();5.8.3靜態(tài)內(nèi)部類classOuter{privateinta=4;//定義實(shí)例屬性aprivatestaticintb=5;//定義靜態(tài)屬性bpublicstaticclassInter{ /*定義靜態(tài)內(nèi)部類*/privateintx=5;//定義實(shí)例屬性xprivatestaticinty=6;//定義靜態(tài)屬性ypublicvoidadd(){

①inttemp=newOuter().a;//通過外部類的實(shí)例對象調(diào)用外部類的非靜態(tài)成員

System.out.println(temp+"+"+x+"="+(temp+x));}publicstaticvoidmul(){//定義靜態(tài)方法②System.out.println(b+"×"+y+"="+(b*y));//直接調(diào)用外部類的靜態(tài)成員

}}publicvoidgetInfo(){③newInter().add();//通過內(nèi)部類對象訪問靜態(tài)內(nèi)部類的非靜態(tài)方法④Inter.mul();//直接通過“靜態(tài)內(nèi)部類名.靜態(tài)方法”形式訪問靜態(tài)內(nèi)部類的靜態(tài)方法

}}靜態(tài)內(nèi)部類示例5.8.3靜態(tài)內(nèi)部類publicclassStaticInnerClassTest{publicstaticvoidmain(String[]args){//創(chuàng)建外部類實(shí)例,并調(diào)用外部類方法Outerout=newOuter();

out.getInfo();//創(chuàng)建內(nèi)部類實(shí)例,并調(diào)用內(nèi)部類方法

Outer.Interin=newOuter.Inter();

in.add();

in.mul();}}運(yùn)行結(jié)果圖靜態(tài)內(nèi)部類示例5.8.3靜態(tài)內(nèi)部類01020304靜態(tài)內(nèi)部類創(chuàng)建對象實(shí)例時(shí),并不需要外部類的實(shí)例。靜態(tài)內(nèi)部類可以定義非靜態(tài)成員和靜態(tài)成員。外部類以外的其他類,需要通過完整的類名訪問靜態(tài)內(nèi)部類的靜態(tài)成員,如果要訪問靜態(tài)內(nèi)部類的實(shí)例成員,則需要通過靜態(tài)內(nèi)部類的實(shí)例。在外部類中,可以直接通過“靜態(tài)內(nèi)部類名.靜態(tài)方法”的形式訪問靜態(tài)內(nèi)部類的靜態(tài)方法。05靜態(tài)內(nèi)部類可以直接訪問外部類的靜態(tài)成員,如果要訪問外部類的非靜態(tài)成員,則需要通過外部類的實(shí)例。靜態(tài)內(nèi)部類特點(diǎn)浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.8.1內(nèi)部類的運(yùn)用場合5.8.3靜態(tài)內(nèi)部類5.8.4匿名內(nèi)部類5.8內(nèi)部類5.8.2局部內(nèi)部類5.8.4匿名內(nèi)部類

匿名內(nèi)部類及其格式匿名內(nèi)部類是指在定義時(shí)沒有名稱的內(nèi)部類,它是一種特殊的內(nèi)部類,除了具有普通內(nèi)部類的特點(diǎn)以外,還有自己的一些特點(diǎn)。

匿名內(nèi)部類一般只使用一次,在GUI圖像用戶界面的引用編程中使用非常廣泛。匿名內(nèi)部類的語法格式:new<類或接口>([參數(shù)列表]){……..}5.8.4匿名內(nèi)部類

匿名內(nèi)部類的創(chuàng)建特點(diǎn)雖然匿名內(nèi)部類沒有類名,但它必須擴(kuò)展一個(gè)父類或者實(shí)現(xiàn)一個(gè)接口,并且不能顯式地使用extends關(guān)鍵字或者implements關(guān)鍵字。如果匿名內(nèi)部類是繼承抽象類或者實(shí)現(xiàn)接口,還需要實(shí)現(xiàn)父類或者接口中所有的抽象方法。有名稱的類若沒有顯式地指定父類,系統(tǒng)會讓其自動繼承Object類,但匿名內(nèi)部類不會自動繼承Object類,所以每個(gè)匿名內(nèi)部類都要明確地指出它繼承的類或者實(shí)現(xiàn)的接口。5.8.4匿名內(nèi)部類

匿名內(nèi)部類如何處理構(gòu)造方法在匿名內(nèi)部類的語法格式中的“參數(shù)列表”是表示在調(diào)用父類的構(gòu)造方法時(shí)傳入的參數(shù)。匿名內(nèi)部類只在其所定義的代碼塊內(nèi)使用一次,所以無法為其定義構(gòu)造方法。匿名內(nèi)部類總是使用父類的構(gòu)造方法來創(chuàng)建實(shí)例。如果匿名內(nèi)部類實(shí)現(xiàn)的是接口,那么匿名內(nèi)部類的構(gòu)造方法就是Object()。匿名內(nèi)部類的語法格式:new<類或接口>([參數(shù)列表]){……..}5.8.4匿名內(nèi)部類//定義抽象類AbstrClassabstractclassAbstrClass{publicabstractvoidgetInfo();}//定義含匿名內(nèi)部類的類InterclassInter{publicvoidprint(){show(//匿名內(nèi)部類實(shí)現(xiàn)抽象類AbstrClassnewAbstrClass(){publicvoidgetInfo(){System.out.println("Java學(xué)習(xí)手記");}});}//抽象類的對象作為參數(shù)并調(diào)用抽象類的方法

publicvoidshow(AbstrClassa){a.getInfo();}}publicclassInnerClassDemo08{publicstaticvoidmain(String[]args){newInter().print();//創(chuàng)建Inter類的實(shí)例并調(diào)用print()方法

}}匿名內(nèi)部類示例運(yùn)行結(jié)果圖浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.9.1Lambda表達(dá)式概述5.9.3函數(shù)式接口5.9.4方法與構(gòu)造器引用5.9Lambda表達(dá)式(新特性)5.9.2Lambda表達(dá)式運(yùn)用場合5.9.1Lambda表達(dá)式概述lambda表達(dá)式是Java8給我們帶來的幾個(gè)重量級新特性之一,借用lambda表達(dá)式,可以讓我們的Java程序設(shè)計(jì)更加簡潔。我們可以將lambda表達(dá)式定義為一種簡潔、可傳遞的匿名函數(shù)。010203需要明確lambda表達(dá)式本質(zhì)上是一個(gè)函數(shù),雖然它不屬于某個(gè)特定的類,但具備參數(shù)列表、函數(shù)主體、返回類型,以及能夠拋出異常。lambda表達(dá)式是匿名的,沒有具體的函數(shù)名稱。lambda表達(dá)式可以像參數(shù)一樣進(jìn)行傳遞,從而極大的簡化代碼的編寫。

注意點(diǎn)5.9.1Lambda表達(dá)式概述

lambda表達(dá)式的定義格式lambda表達(dá)式的格式定義如下所示:格式一:參數(shù)列表->表達(dá)式格式二:參數(shù)列表->{表達(dá)式集合}。0102lambda表達(dá)式隱含了return關(guān)鍵字,所以在單個(gè)的表達(dá)式中,我們無需顯式的寫return關(guān)鍵字。但是當(dāng)表達(dá)式是一個(gè)語句集合的時(shí)候,則需要顯式添加return,并用花括號{}將多個(gè)表達(dá)式包圍起來。

注意點(diǎn)5.9.1Lambda表達(dá)式概述Lambda表達(dá)式的使用舉例(Strings)->s.length()//返回給定字符串的長度,隱含return語句()->42//始終返回42的無參方法(intx,inty)->{intz=x*y;returnx+z;}//包含多行表達(dá)式,則用花括號括起來浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.9.1Lambda表達(dá)式概述5.9.3函數(shù)式接口5.9.4方法與構(gòu)造器引用5.9Lambda表達(dá)式(新特性)5.9.2Lambda表達(dá)式運(yùn)用場合5.9.2Lambda表達(dá)式運(yùn)用場合

Lambda表達(dá)式的用處Lambda表達(dá)式的用處淺顯來說就是替代“內(nèi)部匿名類”,JAVA8中就提供了這種“函數(shù)式編程”的方法——lambda表達(dá)式,供我們來更加簡明扼要的實(shí)現(xiàn)內(nèi)部匿名類的功能。任何函數(shù)式接口都可以使用lambda表達(dá)式替換。5.9.2Lambda表達(dá)式運(yùn)用場合

lambda表達(dá)式由三個(gè)部分組成:一個(gè)括號內(nèi)用逗號分隔的形式參數(shù),參數(shù)是函數(shù)式接口里面方法的參數(shù);一個(gè)箭頭符號:->;第三部分是方法體,可以是表達(dá)式和代碼塊,方法體是函數(shù)式接口里面方法的實(shí)現(xiàn),如果是代碼塊,則必須用{}來包裹起來,且需要一個(gè)return返回值。

但有個(gè)例外,若函數(shù)式接口里面方法返回值是void,則無需{}。因此,要使用Lambda表達(dá)式,先說一個(gè)名詞的概念——函數(shù)式接口。浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.9.1Lambda表達(dá)式概述5.9.3函數(shù)式接口5.9.4方法與構(gòu)造器引用5.9Lambda表達(dá)式(新特性)5.9.2Lambda表達(dá)式運(yùn)用場合5.9.3函數(shù)式接口

函數(shù)式接口函數(shù)式接口(functionalinterface),也叫功能性接口,簡單來說,一個(gè)函數(shù)式接口只有一個(gè)抽象方法,java8中稱這種為“SingleAbstractMethod”(SAM)類型。比如Java標(biāo)準(zhǔn)庫中的java.lang.Runnable和java.util.Comparator都是典型的函數(shù)式接口。

函數(shù)式接口和lambda表達(dá)式的關(guān)系Java中的lambda表達(dá)式無法單獨(dú)出現(xiàn),它需要一個(gè)函數(shù)式接口來盛放,lambda表達(dá)式方法體其實(shí)就是函數(shù)接口的實(shí)現(xiàn)。5.9.3函數(shù)式接口自定義一個(gè)函數(shù)式接口,必須用@FunctionalInterface注解標(biāo)記。比如:用lambda表達(dá)式實(shí)現(xiàn)這個(gè)接口:publicclassUseSimpleInterface{publicstaticvoidmain(String[]args){

SimpleInterfaceobj=(v1,v2)->{intresult=v1+v2;System.out.println("result:"result);};obj.doAdd(2,3);}}定義一個(gè)函數(shù)式接口,只有一個(gè)有參數(shù)的抽象方法:@FunctionalInterfacepublicinterfaceSimpleInterface{

publicvoiddoAdd(inta,intb);}運(yùn)行結(jié)果:result:55.9.3函數(shù)式接口

lambda表達(dá)式的類型是什么?通過前面的例子我們可以看到,lambda表達(dá)式?jīng)]有名字,那我們怎么知道它的類型呢?答案是通過上下文推導(dǎo)而來的。編譯器利用lambda表達(dá)式所在的上下文所期待的類型來推導(dǎo)表達(dá)式的類型,這個(gè)被期待的類型被稱為目標(biāo)類型。也就是說lambda表達(dá)式的類型可以從目標(biāo)類型獲取。lambda表達(dá)式只能出現(xiàn)在目標(biāo)類型為函數(shù)式接口的上下文中。5.9.3函數(shù)式接口1234T是一個(gè)函數(shù)式接口lambda表達(dá)式的參數(shù)必須和T的方法參數(shù)在數(shù)量、類型和順序上一致(一一對應(yīng))lambda表達(dá)式的返回值必須和T的方法的返回值一致或者是它的子類。lambda表達(dá)式拋出的異常和T的方法的異常一致或者是它的子類。一個(gè)lambda表達(dá)式要想賦值給目標(biāo)類型T則必須滿足下面所有的條件:浙江經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院程序設(shè)計(jì)面向?qū)ο驤ava語言程序設(shè)計(jì)Unit5主講張紅5.9.1Lambda表達(dá)式概述5.9.3函數(shù)式接口5.9.4

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論