版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
8435759Java程序設(shè)(第3版)
全套可編輯PPT課件第七部分編程實(shí)戰(zhàn)目錄CONTENTS第四部分核心API的使用第三部分異常處理第二部分類(lèi)之間的關(guān)系第一部分Java語(yǔ)言的類(lèi)第六部分JDK8及以后版本特性總結(jié)第五部分特性總結(jié)第一部分Java語(yǔ)言的類(lèi)全套可編輯PPT課件第1章Java語(yǔ)言概述本章主要介紹Java語(yǔ)言的特點(diǎn)、開(kāi)發(fā)環(huán)境的安裝以及如何編譯運(yùn)行一個(gè)簡(jiǎn)單的Java類(lèi)。通過(guò)學(xué)習(xí)本章,讀者將能快速上手,揭開(kāi)Java語(yǔ)言的面紗。Java語(yǔ)言的特點(diǎn)1.可移植性可移植性又稱跨平臺(tái)性、平臺(tái)無(wú)關(guān)性,即“一次編寫(xiě),處處運(yùn)行”,可以說(shuō)是Java語(yǔ)言較為閃光的特點(diǎn),在任何場(chǎng)合介紹Java語(yǔ)言,都少不了這一特點(diǎn)。2.面向?qū)ο驤ava語(yǔ)言是一門(mén)面向?qū)ο螅╫bjectoriented)的語(yǔ)言,也就是說(shuō),Java程序都以對(duì)象為基本組成單元。3.自動(dòng)垃圾回收J(rèn)ava語(yǔ)言的垃圾回收機(jī)制采用后臺(tái)線程自動(dòng)完成的方式,不需要程序員通過(guò)代碼完成,稱為“自動(dòng)垃圾回收”。4.魯棒性魯棒性又稱健壯性(robustness)。5.簡(jiǎn)單性Java語(yǔ)言取消了指針,內(nèi)存管理通過(guò)后臺(tái)線程自動(dòng)進(jìn)行;不再使用goto語(yǔ)句,不支持多繼承。全套可編輯PPT課件第1章Java語(yǔ)言概述面向?qū)ο蟮幕靖拍?.對(duì)象Java是面向?qū)ο蟮恼Z(yǔ)言,即使用Java語(yǔ)言開(kāi)發(fā)應(yīng)用,從需求到設(shè)計(jì),再到編程實(shí)現(xiàn),都以對(duì)象為驅(qū)動(dòng)。一個(gè)真正的面向?qū)ο蟮膽?yīng)用是嚴(yán)格反映現(xiàn)實(shí)世界的,即在現(xiàn)實(shí)的業(yè)務(wù)系統(tǒng)中存在的實(shí)際對(duì)象,計(jì)算機(jī)應(yīng)用系統(tǒng)中都有相應(yīng)的語(yǔ)言對(duì)象。反之也成立,即在現(xiàn)實(shí)業(yè)務(wù)系統(tǒng)中不存在的對(duì)象,計(jì)算機(jī)應(yīng)用系統(tǒng)中也不應(yīng)該存在該對(duì)象。2.類(lèi)類(lèi)是對(duì)象的藍(lán)圖,對(duì)象都是通過(guò)類(lèi)創(chuàng)建出來(lái)的,這個(gè)過(guò)程也稱為實(shí)例化。Java應(yīng)用都由若干類(lèi)組成,而在運(yùn)行過(guò)程中,都通過(guò)類(lèi)實(shí)例化出的若干對(duì)象相互協(xié)作,從而實(shí)現(xiàn)業(yè)務(wù)邏輯。3.引用Java語(yǔ)言取消了指針,卻有一個(gè)概念類(lèi)似于指針,即引用(reference)。Java語(yǔ)言中沒(méi)有明確的指針定義,實(shí)質(zhì)上用來(lái)創(chuàng)建對(duì)象的每個(gè)語(yǔ)句返回的都是一個(gè)類(lèi)似指針的引用,只不過(guò)大多時(shí)候在Java中不用關(guān)心如何操作這個(gè)“指針”。引用也可以被稱為“虛地址”,如果兩個(gè)對(duì)象的引用相同,那么在物理內(nèi)存上就認(rèn)為是一個(gè)對(duì)象。如果兩個(gè)對(duì)象的引用不同,那么在物理內(nèi)存上就認(rèn)為是兩個(gè)對(duì)象。對(duì)對(duì)象的屬性、方法的調(diào)用,都是通過(guò)引用來(lái)實(shí)現(xiàn)的。第1章Java語(yǔ)言概述第一個(gè)Java類(lèi)環(huán)境搭建1.安裝JDK2.安裝開(kāi)發(fā)工具Java源代碼可以在任意文本編輯器中編寫(xiě),但在開(kāi)發(fā)企業(yè)級(jí)應(yīng)用過(guò)程中,一般會(huì)采用IDE(集成開(kāi)發(fā)環(huán)境)工具以提高效率,如Eclipse等。在學(xué)習(xí)Java語(yǔ)言的初期,不必使用IDE工具,建議使用簡(jiǎn)單的編輯器,以強(qiáng)化對(duì)語(yǔ)言基礎(chǔ)的理解和掌握,如EditPlus編輯器。編譯運(yùn)行Java類(lèi)1.編譯代碼2.編譯3.運(yùn)行第2章Java類(lèi)的組成類(lèi)要學(xué)習(xí)Java類(lèi)的組成,首先要了解Java類(lèi)的聲明形式。類(lèi)的聲明形式如下(【】代表可選項(xiàng)):其中public是訪問(wèn)權(quán)限修飾符,Employee是類(lèi)名。訪問(wèn)權(quán)限修飾符的相關(guān)知識(shí)將在后面章節(jié)詳細(xì)介紹。該類(lèi)的類(lèi)體目前為空,類(lèi)體往往包括屬性、方法、構(gòu)造方法、塊、內(nèi)部類(lèi)等元素。第2章Java類(lèi)的組成屬性類(lèi)是對(duì)象的模板,對(duì)象都會(huì)有不同的屬性,所以類(lèi)中應(yīng)該聲明該類(lèi)所具有的屬性。屬性即對(duì)象的數(shù)據(jù),如員工的姓名、薪水、數(shù)量,都是員工類(lèi)的屬性。屬性的聲明形式如下(【】代表可選項(xiàng)):其中,private是訪問(wèn)權(quán)限修飾符的一種,表示私有權(quán)限;static是修飾符的一種,表示靜態(tài)變量,二者都不是必須使用的。String、double、int均為數(shù)據(jù)類(lèi)型,name、salary、count均為屬性名稱,其中count的初值為0。第2章Java類(lèi)的組成方法方法的聲明形式對(duì)象除了具有屬性外,還有自己的行為,即方法。所以類(lèi)里除了要聲明屬性,還要聲明方法。如員工對(duì)象可以修改姓名、修改薪水、查看姓名、查看薪水,這些就是Employee類(lèi)應(yīng)該聲明的方法。方法的聲明形式如下(【】代表可選項(xiàng)):第2章Java類(lèi)的組成方法重載假設(shè)Employee的薪水調(diào)整還有一種方案,即根據(jù)員工級(jí)別,按照一定比例調(diào)整,那么在Employee類(lèi)中增加如下方法:至此,Employee類(lèi)中就有兩個(gè)名為setSalary的方法,只不過(guò)參數(shù)不同。在Java語(yǔ)言的類(lèi)中,有多個(gè)同名但是不同參的方法,稱為“方法重載(overload)”。所謂不同參數(shù),可能是形式參數(shù)的個(gè)數(shù)不同,也可能是類(lèi)型不同。方法重載能夠增強(qiáng)程序的可讀性。如Employee類(lèi)中的setSalary(charlevel)方法,命名為setSalary2也可以,不會(huì)影響使用,但是可讀性將會(huì)降低。兩個(gè)方法都跟薪資調(diào)整有關(guān),只是算法不同、參數(shù)不同,所以應(yīng)該使用同樣的名稱,提高可讀性。第2章Java類(lèi)的組成構(gòu)造方法要想使用Java類(lèi),就必須創(chuàng)建類(lèi)的對(duì)象,即對(duì)類(lèi)進(jìn)行實(shí)例化。而要?jiǎng)?chuàng)建對(duì)象,就必須使用構(gòu)造方法,因此,構(gòu)造方法在Java類(lèi)中有舉足輕重的作用。構(gòu)造方法的聲明形式如下(【】代表可選項(xiàng)):構(gòu)造方法有兩個(gè)顯著特征:①名稱必須與類(lèi)名相同,且對(duì)大小寫(xiě)敏感;②沒(méi)有返回值類(lèi)型。聲明Employee類(lèi)中無(wú)參的構(gòu)造方法的形式如下:值得注意的是,任何一個(gè)Java類(lèi)都默認(rèn)有一個(gè)如上所示的無(wú)參構(gòu)造方法。也就是說(shuō),即使Employee類(lèi)中沒(méi)有聲明無(wú)參的構(gòu)造方法,照樣可以直接使用。如第2.2節(jié)展示的Employee類(lèi),其中沒(méi)有任何構(gòu)造方法的聲明,但是可以使用如下代碼:第2章Java類(lèi)的組成塊塊是在Java類(lèi)中不太常見(jiàn)的一種元素。塊的聲明形式與方法體類(lèi)似,分實(shí)例塊和靜態(tài)塊(static塊)兩種。static的具體含義將在相關(guān)章節(jié)詳細(xì)展開(kāi)。1.實(shí)例塊實(shí)例塊的聲明形式如下:2.靜態(tài)塊靜態(tài)塊的聲明形式如下:靜態(tài)塊與實(shí)例塊的區(qū)別在于,靜態(tài)塊是只運(yùn)行一次,而實(shí)例塊是每次創(chuàng)建對(duì)象時(shí)都會(huì)運(yùn)行。因此,靜態(tài)塊往往用來(lái)包含該類(lèi)必須執(zhí)行且只執(zhí)行一次的代碼。第2章Java類(lèi)的組成內(nèi)部類(lèi)內(nèi)部類(lèi)(innerclass)即在類(lèi)體中聲明的類(lèi),包含內(nèi)部類(lèi)的類(lèi)被稱為外部類(lèi)(outerclass)。內(nèi)部類(lèi)作為外部類(lèi)的成員存在,可以像方法一樣使用外部類(lèi)的屬性和方法。內(nèi)部類(lèi)具有類(lèi)的特征,可以聲明屬性、方法、構(gòu)造方法等,需要?jiǎng)?chuàng)建對(duì)象才能使用類(lèi)中的方法或?qū)傩缘瘸蓡T。如以下代碼中的Inner類(lèi)即Outer類(lèi)的內(nèi)部類(lèi):第3章訪問(wèn)權(quán)限修飾符包要理解訪問(wèn)權(quán)限修飾符,首先需要掌握包的概念。包在物理上是文件夾,在邏輯上是有邏輯關(guān)系的類(lèi)的集合。包的作用有兩個(gè)方面:①避免類(lèi)重名;②控制訪問(wèn)權(quán)限。要為一個(gè)類(lèi)指定包,在類(lèi)文件的第一行用package語(yǔ)句聲明即可。如以下代碼:Java程序中的類(lèi)、屬性、方法都需要使用訪問(wèn)權(quán)限修飾符,本章將詳細(xì)講解訪問(wèn)權(quán)限修飾符的使用。上述代碼中,使用packagecom.etc.chapter03語(yǔ)句指定了包。編譯Employee后,其類(lèi)文件將被編譯在com/etc/chapter03目錄下。包名是名稱空間的一部分,也就是說(shuō),Employee類(lèi)的名稱將不再是Employee,而是com.etc.chapter03.Employee。如果在其他包里調(diào)用Employee類(lèi),需要使用import語(yǔ)句將其引入。如以下代碼:第3章訪問(wèn)權(quán)限修飾符4種訪問(wèn)權(quán)限修飾符Java語(yǔ)言有4種訪問(wèn)權(quán)限修飾符,權(quán)限從大到小依次如下。1.公共權(quán)限:public此種權(quán)限可修飾類(lèi)、屬性、方法;可以被任意類(lèi)訪問(wèn)。2.受保護(hù)的權(quán)限:protected此種權(quán)限可修飾屬性、方法;可以被同包類(lèi)訪問(wèn),如果不是同包類(lèi),則必須是該類(lèi)的子類(lèi)才可以訪問(wèn)。3.同包權(quán)限:default此種權(quán)限可修飾類(lèi)、屬性、方法,并不使用關(guān)鍵字default,意思是不寫(xiě)訪問(wèn)權(quán)限修飾符時(shí),默認(rèn)情況下的權(quán)限;只能被同包類(lèi)訪問(wèn)。4.私有權(quán)限:private此種權(quán)限可修飾屬性、方法;只能在本類(lèi)中訪問(wèn)。可見(jiàn),類(lèi)(專(zhuān)指外部類(lèi))只可以使用同包權(quán)限或公共權(quán)限,而屬性、方法卻可以使用4種權(quán)限中的任意一個(gè)。第3章訪問(wèn)權(quán)限修飾符封裝性封裝性是一種信息隱藏技術(shù),往往有兩個(gè)含義:①對(duì)象的全部屬性和全部方法結(jié)合在一起,形成一個(gè)不可分割的獨(dú)立單位;②盡可能隱藏對(duì)象的內(nèi)部結(jié)構(gòu)。具體表現(xiàn)是,在Java類(lèi)中,屬性都盡量使用private權(quán)限,這樣可以保證屬性不會(huì)被任意修改;而對(duì)屬性的操作都封裝到方法中,方法往往使用public權(quán)限。如以下代碼:第4章數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型基本數(shù)據(jù)類(lèi)型不需要通過(guò)new關(guān)鍵字來(lái)創(chuàng)建,而是可以直接賦值,數(shù)據(jù)值存放在棧(stack)內(nèi),在空間的分配和釋放上都有較高的效率?;緮?shù)據(jù)類(lèi)型有4類(lèi),共8種。1.整型:byte/short/int/long整型有4種,分別為字節(jié)型(byte),長(zhǎng)度為8位;短整型(short),長(zhǎng)度為16位;整型(int),長(zhǎng)度為32位;長(zhǎng)整型(long),長(zhǎng)度為64位。整數(shù)默認(rèn)以int類(lèi)型存儲(chǔ)。2.浮點(diǎn)型:float/double浮點(diǎn)型有兩種,分別為單精度浮點(diǎn)型(float),長(zhǎng)度為32位;雙精度浮點(diǎn)型(double),長(zhǎng)度為64位。小數(shù)默認(rèn)以double類(lèi)型存儲(chǔ)。如floatf=2.3;將有編譯錯(cuò)誤,因?yàn)?.3默認(rèn)為double類(lèi)型,將高精度數(shù)值直接賦給低精度變量會(huì)出現(xiàn)編譯錯(cuò)誤。解決辦法有兩種:①floatf=2.3f;這種方式使用后綴f指定2.3的類(lèi)型為float;②floatf=(float)2.3;這種方式稱為強(qiáng)制類(lèi)型轉(zhuǎn)換,強(qiáng)制將2.3轉(zhuǎn)換為float類(lèi)型。3.字符型:char字符型用于表示一個(gè)單一的字母,在Java語(yǔ)言中不常用,一般使用單引號(hào)包含字母,如charc='a';。4.邏輯型:boolean邏輯型也叫布爾型,有兩個(gè)值,分別是true(表示真)和false(表示假)。需要注意的是,在Java語(yǔ)言中,0和1不再表示邏輯值,僅表示數(shù)值。Java語(yǔ)言中的基本數(shù)據(jù)類(lèi)型長(zhǎng)度都是固定的,不會(huì)隨著平臺(tái)不同而改變。第4章數(shù)據(jù)類(lèi)型引用類(lèi)型第4章數(shù)據(jù)類(lèi)型字符串類(lèi)型字符串(String)是常用的數(shù)據(jù)類(lèi)型,那么String到底是什么類(lèi)型?首先需要明確的是,String是引用類(lèi)型,即String類(lèi)型的變量都是對(duì)象,而不是基本數(shù)據(jù)類(lèi)型。但是String可以像基本數(shù)據(jù)類(lèi)型那樣直接使用=賦值,如Strings="hello";。String是JavaAPI中的類(lèi),屬于java.lang包,該類(lèi)提供了多個(gè)構(gòu)造方法,所以String對(duì)象也可以與其他類(lèi)型的對(duì)象一樣,通過(guò)使用new關(guān)鍵字調(diào)用構(gòu)造方法來(lái)創(chuàng)建,如Strings=newString("hello");。要真正理解String類(lèi),首先要明確String類(lèi)是一個(gè)不可變(immutable)類(lèi),所謂不可變類(lèi),即實(shí)例在初始化賦值后,就不能被修改。如Strings1="hello";,s1被賦值為hello,在整個(gè)生命周期內(nèi)該值無(wú)法被修改,即使使用s1="world";,賦值也并不是將hello替代為world,而是將新的實(shí)例world重新賦值給s1引用,s1不再引用hello。第4章數(shù)據(jù)類(lèi)型包裝器類(lèi)型在API的java.lang包中有8個(gè)類(lèi),即Byte、Short、Integer、Long、Float、Double、Character、Boolean。這8個(gè)類(lèi)對(duì)應(yīng)8個(gè)基本數(shù)據(jù)類(lèi)型,可以將每種基本數(shù)據(jù)類(lèi)型包裝成引用類(lèi)型,稱為包裝器(wrapper)類(lèi)型。JDK5.0及以后版本實(shí)現(xiàn)了自動(dòng)裝箱、自動(dòng)拆箱,基本數(shù)據(jù)類(lèi)型和包裝器類(lèi)型可以直接轉(zhuǎn)換。如以下代碼:第4章數(shù)據(jù)類(lèi)型值傳遞面向?qū)ο蟮南到y(tǒng)依靠對(duì)象之間互相協(xié)作調(diào)用對(duì)象的方法來(lái)實(shí)現(xiàn)業(yè)務(wù)功能。很多方法都有形式參數(shù),調(diào)用時(shí)就需要將實(shí)際參數(shù)賦給形式參數(shù),可以理解為值傳遞的本質(zhì)就是賦值的過(guò)程,是將實(shí)際參數(shù)賦給形式參數(shù)的過(guò)程。1.基本數(shù)據(jù)類(lèi)型:傳遞的是復(fù)制的值基本數(shù)據(jù)類(lèi)型之間進(jìn)行賦值時(shí),僅僅對(duì)值(value)進(jìn)行復(fù)制。2.引用類(lèi)型:傳遞的是引用引用類(lèi)型變量之間是對(duì)引用(reference)進(jìn)行賦值。第5章高級(jí)類(lèi)特性static修飾符static被稱為靜態(tài),可以用來(lái)修飾類(lèi)的屬性或方法,本節(jié)詳細(xì)介紹static屬性和方法的作用及使用。1.static屬性如果類(lèi)的某個(gè)屬性,不管創(chuàng)建多少個(gè)對(duì)象,其存儲(chǔ)空間只有唯一的一個(gè),那么這個(gè)屬性就應(yīng)該用static修飾,被稱為靜態(tài)屬性或類(lèi)屬性。static屬性是類(lèi)的所有對(duì)象共享的屬性,即不管創(chuàng)建了多少個(gè)對(duì)象,靜態(tài)屬性在內(nèi)存中只有一個(gè)。static屬性可以用對(duì)象調(diào)用,也可以直接用類(lèi)名調(diào)用。Employee類(lèi)的count屬性用來(lái)保存Employee類(lèi)的對(duì)象的個(gè)數(shù),該屬性是Employee類(lèi)的所有對(duì)象共享的屬性,所以被聲明為static屬性,在內(nèi)存中只有一個(gè)count,每次創(chuàng)建對(duì)象都對(duì)同一個(gè)count加1。不用static修飾的屬性稱為實(shí)例屬性,每創(chuàng)建一個(gè)對(duì)象都會(huì)為該對(duì)象初始化一個(gè)實(shí)例屬性。2.static方法如果某個(gè)方法不需要與某個(gè)特定的對(duì)象綁定,那么該方法可以使用static修飾。static方法可以用對(duì)象調(diào)用,也可以直接用類(lèi)名調(diào)用。3.總結(jié)static可以修飾類(lèi)的屬性和方法,稱為靜態(tài)屬性、靜態(tài)方法,或者類(lèi)屬性、類(lèi)方法。static屬性和方法都不再與某個(gè)對(duì)象綁定,而是所有對(duì)象共享,所以可以用對(duì)象名或類(lèi)名調(diào)用靜態(tài)屬性和方法。實(shí)際開(kāi)發(fā)中,多數(shù)情況都直接用類(lèi)名調(diào)用靜態(tài)屬性和方法。非靜態(tài)屬性和方法都必須與某個(gè)特定對(duì)象綁定,隨著對(duì)象的創(chuàng)建而被初始化,只能用某個(gè)特定對(duì)象調(diào)用。由于非靜態(tài)屬性和方法都是與某個(gè)特定對(duì)象相關(guān)的,所以要保證程序正常運(yùn)行,就要保證調(diào)用的每個(gè)非靜態(tài)屬性和方法都很明確其屬于哪個(gè)對(duì)象。而靜態(tài)方法不屬于任何一個(gè)對(duì)象,所以不能直接使用非靜態(tài)屬性和方法。final修飾符final修飾符的使用范圍較廣,可以修飾類(lèi)、屬性、方法。本節(jié)先介紹final屬性,final類(lèi)和final方法均與繼承有關(guān),參見(jiàn)后續(xù)章節(jié)。final修飾屬性,屬性就由變量成為常量,分為編譯期常量和運(yùn)行期常量?jī)煞N。1.編譯期常量編譯期常量在聲明的同時(shí)必須賦值,且賦值后不能改變。2.運(yùn)行期常量運(yùn)行期常量在聲明時(shí)不初始化,而在運(yùn)行期初始化,并且初始化后不能修改。第5章高級(jí)類(lèi)特性Java類(lèi)中的變量總結(jié)根據(jù)聲明位置不同,Java類(lèi)中的變量可分為兩種:①在類(lèi)中聲明的變量,稱為屬性或數(shù)據(jù)成員;②在方法中聲明的變量,稱為局部變量或臨時(shí)變量。下面從各個(gè)方面比較兩種變量的不同。1.作用域?qū)傩缘淖饔糜驗(yàn)檎麄€(gè)類(lèi);局部變量的作用域?yàn)槁暶髟撟兞康姆椒ɑ虼a塊。2.生命周期屬性分為非靜態(tài)屬性和靜態(tài)屬性兩種,非靜態(tài)屬性隨著對(duì)象創(chuàng)建而被初始化,直到對(duì)象被銷(xiāo)毀才被回收,靜態(tài)屬性隨著類(lèi)加載而被初始化,類(lèi)被銷(xiāo)毀才被回收;局部變量在調(diào)用方法時(shí)被臨時(shí)初始化,方法返回即被回收。3.初始化屬性可以在聲明的時(shí)候不賦初值,創(chuàng)建對(duì)象的時(shí)候自動(dòng)初始化,根據(jù)數(shù)據(jù)類(lèi)型不同賦不同的初始值,其中整型為0,浮點(diǎn)型為0.0,布爾型為false;局部變量不能自動(dòng)初始化,必須在聲明的時(shí)候賦初值才能被使用,否則將發(fā)生編譯錯(cuò)誤。4.訪問(wèn)權(quán)限屬性可以使用任何一種訪問(wèn)權(quán)限修飾符,往往使用private權(quán)限;局部變量不能使用訪問(wèn)權(quán)限修飾符。5.static屬性可以使用static修飾成類(lèi)屬性,類(lèi)中的所有對(duì)象共享;局部變量不能使用static修飾。6.final屬性和局部變量均可以使用final修飾,使得變量成為常量。第5章高級(jí)類(lèi)特性操作符1.算術(shù)操作符算術(shù)操作符可以對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行數(shù)學(xué)運(yùn)算,包括加(+)、減(-)、乘(*)、除(/)、取余(%)、自加(++)、自減(--)。加、減、乘、除、取余都很簡(jiǎn)單,在此詳細(xì)講解自加、自減。++或--可以對(duì)變量進(jìn)行自加1、自減1的運(yùn)算,如++或--在變量后,則“先取值后運(yùn)算”;如在變量前,則“先運(yùn)算后取值”。其中運(yùn)算的意思是對(duì)變量加1或減1,取值的意思是將變量當(dāng)前值賦給表達(dá)式。2.位操作符位操作符作用于基本數(shù)據(jù)類(lèi)型的二進(jìn)制位,包括與(AND)&,或(OR)|,異或(XOR)^,取反(NOT)~,移位操作符<<、>>>、>>。運(yùn)算規(guī)則如下。(1)&:兩個(gè)輸入位都為1,輸出1。(2)|:任何一個(gè)輸入位為1,輸出1。(3)^:兩個(gè)輸入位不同,輸出1。(4)~:輸入位為1,輸出0;輸入位為0,輸出1。(5)移位操作符有3種。3.比較操作符比較操作符可以對(duì)兩個(gè)操作數(shù)進(jìn)行比較,返回值為布爾值,即true或false。大多數(shù)比較操作符只能作用于基本數(shù)據(jù)類(lèi)型。比較操作符有>、<、==、!=、>=、<=共6種。對(duì)基本數(shù)據(jù)類(lèi)型進(jìn)行比較,即對(duì)數(shù)值的二進(jìn)制進(jìn)行比較。4.邏輯操作符Java語(yǔ)言中的邏輯操作符對(duì)布爾類(lèi)型的數(shù)據(jù)進(jìn)行運(yùn)算,有&、|、&&、||共4種。其中&和&&的返回值規(guī)則相同,兩個(gè)操作數(shù)都是true才返回true;|和||的返回值規(guī)則相同,兩個(gè)操作數(shù)中只要有一個(gè)是true就返回true;&和&&、|和||雖然返回值的運(yùn)算規(guī)則相同,但是運(yùn)算過(guò)程有所區(qū)別。第6章操作符、流程控制流程控制Java語(yǔ)言的流程控制和其他語(yǔ)言差別不大,共3種。1.順序流程順序流程自上而下,依照代碼先后順序執(zhí)行。2.分支流程分支流程是常見(jiàn)的流程,可以用兩種方式實(shí)現(xiàn):ifelse語(yǔ)句和switchcase語(yǔ)句。(1)ifelse語(yǔ)句。(2)switchcase語(yǔ)句。3.循環(huán)流程循環(huán)流程也是程序設(shè)計(jì)中另外一種較常用的流程,共有3種實(shí)現(xiàn)方式:for循環(huán)、while循環(huán)和dowhile循環(huán)。第6章操作符、流程控制“中斷”語(yǔ)句比較Java程序中的break、return、System.exit(0)這3個(gè)語(yǔ)句都跟程序“中斷”有關(guān)系,非常容易混淆,在此進(jìn)行比較總結(jié)。1.break語(yǔ)句break語(yǔ)句只能用在循環(huán)語(yǔ)句或switch流程的case語(yǔ)句中,用來(lái)中斷循環(huán)或switch流程。2.return語(yǔ)句return語(yǔ)句可以在方法中的任何位置使用。如果該方法有返回值類(lèi)型,則return必須帶值返回;如果該方法的返回值類(lèi)型為void,則不需帶值返回,只寫(xiě)return;即可。return的含義是方法返回,即運(yùn)行return語(yǔ)句后該方法運(yùn)行結(jié)束,程序跳出方法體。3.System.exit(0)語(yǔ)句System是API中java.lang包的一個(gè)類(lèi),exit是該類(lèi)的靜態(tài)方法,形式參數(shù)為int類(lèi)型。因此可以使用類(lèi)名System直接調(diào)用靜態(tài)方法exit,參數(shù)值為0表示強(qiáng)制退出。該方法的含義是強(qiáng)制JVM退出,即main方法結(jié)束,整個(gè)程序退出。第6章操作符、流程控制第二部分類(lèi)之間的關(guān)系第8章關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系的表示關(guān)聯(lián)關(guān)系是一種“有”的關(guān)系,也就是說(shuō),如果A類(lèi)的一個(gè)屬性是B類(lèi),那么就可以說(shuō)A類(lèi)對(duì)象“有”一個(gè)B類(lèi)對(duì)象,即A類(lèi)關(guān)聯(lián)B類(lèi)。Java語(yǔ)言中,如果A類(lèi)關(guān)聯(lián)B類(lèi),那么表現(xiàn)形式如下:簡(jiǎn)言之,A類(lèi)關(guān)聯(lián)B類(lèi),即B類(lèi)對(duì)象作為A類(lèi)對(duì)象的屬性存在。如果實(shí)例化A類(lèi)對(duì)象,那么就會(huì)為之實(shí)例化一個(gè)B類(lèi)對(duì)象。所以說(shuō)關(guān)聯(lián)關(guān)系是“有”的關(guān)系,即每個(gè)A類(lèi)對(duì)象都有一個(gè)B類(lèi)對(duì)象作為其屬性存在。關(guān)聯(lián)關(guān)系的方向關(guān)聯(lián)關(guān)系可以分為單向關(guān)聯(lián)和雙向關(guān)聯(lián)兩種,如果有A類(lèi)和B類(lèi),所謂單向關(guān)聯(lián)即B類(lèi)作為A類(lèi)的屬性存在,但A類(lèi)不是B類(lèi)的屬性。如以下代碼:第8章關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系的多重性除了從方向上考慮,還可以從多重性方面考慮關(guān)聯(lián)關(guān)系。常見(jiàn)的關(guān)聯(lián)關(guān)系有一對(duì)一關(guān)聯(lián)和一對(duì)多關(guān)聯(lián)。例如,如果一個(gè)員工對(duì)象只能在一個(gè)部門(mén)中,那么員工和部門(mén)之間就是一對(duì)一的關(guān)聯(lián)關(guān)系;如果一個(gè)員工可以同時(shí)掛職在多個(gè)部門(mén),那么員工和部門(mén)之間就是一對(duì)多的關(guān)聯(lián)關(guān)系?,F(xiàn)實(shí)中,一對(duì)多的關(guān)聯(lián)關(guān)系遠(yuǎn)多于一對(duì)一的關(guān)聯(lián)關(guān)系,例如,一個(gè)系有多個(gè)專(zhuān)業(yè),一個(gè)專(zhuān)業(yè)有多個(gè)班,一個(gè)班有多名學(xué)生,一名學(xué)生選多門(mén)課程等。顯而易見(jiàn),如果A類(lèi)和B類(lèi)是一對(duì)多的關(guān)聯(lián)關(guān)系,那么就需要在A類(lèi)中引用多個(gè)B類(lèi)的對(duì)象。而如何對(duì)多個(gè)B類(lèi)對(duì)象進(jìn)行管理,是必須解決的問(wèn)題。解決一對(duì)多的關(guān)聯(lián)關(guān)系,“多”的這方對(duì)象一定需要用另外一個(gè)對(duì)象進(jìn)行“持有”,或者稱為“容納”,否則無(wú)法進(jìn)行管理。Java語(yǔ)言中能承擔(dān)“數(shù)據(jù)容器”任務(wù)的對(duì)象有兩種:數(shù)組和集合。第8章關(guān)聯(lián)關(guān)系數(shù)組1.?dāng)?shù)組的定義數(shù)組是類(lèi)型相同的元素的集合,可以存儲(chǔ)任何數(shù)據(jù)類(lèi)型,但是只有類(lèi)型相同的元素才可存到一個(gè)數(shù)組中。2.?dāng)?shù)組的類(lèi)型數(shù)組是引用類(lèi)型。數(shù)組中存儲(chǔ)的元素可能是基本數(shù)據(jù)類(lèi)型,也可能是引用類(lèi)型,但是數(shù)組對(duì)象本身是引用類(lèi)型,即對(duì)象。3.?dāng)?shù)組的聲明Java語(yǔ)言中,數(shù)組的聲明方式有兩種。如以下代碼:第8章關(guān)聯(lián)關(guān)系數(shù)組的創(chuàng)建及長(zhǎng)度聲明數(shù)組后,數(shù)組對(duì)象還只是一個(gè)空指針,不能使用。要使用數(shù)組,必須先創(chuàng)建數(shù)組。本節(jié)主要介紹數(shù)組的創(chuàng)建方法。1.?dāng)?shù)組的創(chuàng)建數(shù)組是引用類(lèi)型,因此也需要使用new關(guān)鍵字創(chuàng)建,創(chuàng)建時(shí)必須指定數(shù)組的長(zhǎng)度,長(zhǎng)度是數(shù)組中能存儲(chǔ)的元素個(gè)數(shù)。如以下代碼:上述代碼中,數(shù)組i被創(chuàng)建為一個(gè)長(zhǎng)度為3的int型數(shù)組對(duì)象,emp1被創(chuàng)建為長(zhǎng)度為2的Employee數(shù)組對(duì)象。數(shù)組創(chuàng)建后,即為數(shù)組的元素分配了內(nèi)存空間,并為每個(gè)元素進(jìn)行了初始化,初始值為元素對(duì)應(yīng)的數(shù)據(jù)類(lèi)型的默認(rèn)值。例如,數(shù)組i中的3個(gè)元素均被初始化為0,數(shù)組emp1中的兩個(gè)元素均被初始化為null。第8章關(guān)聯(lián)關(guān)系數(shù)組的創(chuàng)建及長(zhǎng)度2.?dāng)?shù)組的長(zhǎng)度創(chuàng)建數(shù)組時(shí)必須指定數(shù)組的長(zhǎng)度,而且長(zhǎng)度值會(huì)直接初始化到內(nèi)存中。例如,雖然c=newchar[5];創(chuàng)建的數(shù)組c長(zhǎng)度為5,但是分配的內(nèi)存空間卻是6塊,其中除了5個(gè)數(shù)組元素外,另一個(gè)空間存儲(chǔ)了數(shù)組的長(zhǎng)度,如圖所示。訪問(wèn)數(shù)組的長(zhǎng)度不需要調(diào)用方法,使用數(shù)組的length屬性即可。如c.length直接返回?cái)?shù)組c的長(zhǎng)度,值為5。第8章關(guān)聯(lián)關(guān)系數(shù)組元素的訪問(wèn)數(shù)組是用來(lái)存儲(chǔ)其他變量的對(duì)象,所以在實(shí)際應(yīng)用中,不可避免地需要訪問(wèn)數(shù)組中的元素。往往使用索引訪問(wèn)數(shù)組中的元素,索引值從0開(kāi)始。如以下代碼:上述代碼中的數(shù)組a的長(zhǎng)度為3,所以可以使用索引0、1、2訪問(wèn)數(shù)組的第一個(gè)到第三個(gè)元素,進(jìn)行賦值等操作。除了對(duì)數(shù)組中的元素進(jìn)行賦值,還常常遍歷數(shù)組中的元素。遍歷數(shù)組中的元素有兩種方式:一種是傳統(tǒng)for循環(huán),另一種是增強(qiáng)for循環(huán)。如以下代碼:第8章關(guān)聯(lián)關(guān)系數(shù)組的賦值數(shù)組必須進(jìn)行賦值才能使用,本節(jié)將介紹數(shù)組賦值的3種方式。1.聲明的同時(shí),使用new關(guān)鍵字創(chuàng)建。如以下代碼:第8章關(guān)聯(lián)關(guān)系使用new關(guān)鍵字創(chuàng)建數(shù)組時(shí),將為數(shù)組元素賦默認(rèn)值。如數(shù)組eArray1的長(zhǎng)度為2,其中的兩個(gè)元素是Employee類(lèi)型,元素值被賦為引用類(lèi)型的默認(rèn)值null。2.聲明的同時(shí),直接使用{}賦值。如以下代碼:可以在聲明數(shù)組的同時(shí),使用{}對(duì)數(shù)組中的元素直接賦值。如eArray2的兩個(gè)元素被賦值為newEmployee("Grace")和newEmployee("Alice")對(duì)象。3.使用new[]{}直接賦值。如以下代碼:除了可以使用{}直接對(duì)數(shù)組元素賦值,還可以使用new[]{}為數(shù)組元素賦值。區(qū)別在于,{}必須在聲明數(shù)組的同時(shí)賦值,而new[]{}不僅可以在聲明數(shù)組的同時(shí)賦值,還可以在數(shù)組聲明后,在其他語(yǔ)句行中為數(shù)組賦值。多維數(shù)組聲明一個(gè)二維int型數(shù)組可以有以下3種方式。建議使用第一種方式進(jìn)行聲明,具有較好的可讀性。如圖所示的是一個(gè)二維數(shù)組的創(chuàng)建過(guò)程。第8章關(guān)聯(lián)關(guān)系數(shù)組的復(fù)制在JDKAPI的System類(lèi)中,提供了一個(gè)復(fù)制數(shù)組的靜態(tài)方法。代碼如下:該方法可以從一個(gè)源數(shù)組的特定位置,將指定個(gè)數(shù)的元素復(fù)制到目標(biāo)數(shù)組的指定位置。如以下代碼:第8章關(guān)聯(lián)關(guān)系A(chǔ)rrays類(lèi)JavaAPI的java.util包中提供了數(shù)組的工具類(lèi)Arrays。該類(lèi)中的所有方法都是靜態(tài)方法,可以對(duì)數(shù)組進(jìn)行操作,主要有以下幾種。1.二分查找(binarySearch)本類(lèi)中提供了大量的二分查找方法,可以在數(shù)組中查找指定值的元素,返回該元素的索引值。如:2.填充(fill)本類(lèi)中提供了大量的填充方法,可以對(duì)數(shù)組中指定范圍的元素使用指定的值填充。如:3.排序(sort)本類(lèi)中提供了大量的排序方法,可以對(duì)數(shù)組中的元素進(jìn)行排序。如:第8章關(guān)聯(lián)關(guān)系依賴關(guān)系是類(lèi)與類(lèi)之間另一種常見(jiàn)的關(guān)系??梢詫⑦@種關(guān)系理解為“USE-A”關(guān)系,即“使用”關(guān)系。Java語(yǔ)言中依賴關(guān)系的表示依賴關(guān)系是一種“使用”關(guān)系,如果A類(lèi)對(duì)象的某個(gè)方法的參數(shù)是B類(lèi)對(duì)象,那么就可以說(shuō)A類(lèi)依賴B類(lèi)。如以下代碼:第9章依賴關(guān)系上述代碼中,A類(lèi)方法f的形式參數(shù)類(lèi)型是B類(lèi)類(lèi)型,也就是說(shuō),A類(lèi)對(duì)象如果要使用方法f,那么必須有一個(gè)B類(lèi)對(duì)象作為參數(shù)方可實(shí)現(xiàn),這種情形被稱為A類(lèi)依賴B類(lèi)。依賴與關(guān)聯(lián)的區(qū)別關(guān)聯(lián)關(guān)系是面向?qū)ο蟪绦蛟O(shè)計(jì)中常用的復(fù)用策略,依賴關(guān)系相對(duì)于關(guān)聯(lián)關(guān)系是一種“簡(jiǎn)單”的關(guān)系,本節(jié)將比較兩種關(guān)系的不同。1.關(guān)聯(lián)關(guān)系是“HAS”關(guān)系,依賴關(guān)系是“USE”關(guān)系A(chǔ)類(lèi)關(guān)聯(lián)B類(lèi),指的是B類(lèi)對(duì)象作為A類(lèi)對(duì)象的屬性存在,稱為“HAS”關(guān)系。A類(lèi)依賴B類(lèi),指的是B類(lèi)對(duì)象作為A類(lèi)對(duì)象的方法參數(shù)存在,稱為“USE”關(guān)系。2.生命周期不同如果A類(lèi)關(guān)聯(lián)B類(lèi),那么創(chuàng)建A類(lèi)對(duì)象時(shí)就會(huì)實(shí)例化B類(lèi)對(duì)象,直到A類(lèi)對(duì)象被銷(xiāo)毀,所關(guān)聯(lián)的B類(lèi)對(duì)象才被銷(xiāo)毀,即只要A類(lèi)對(duì)象存在,B類(lèi)對(duì)象就存在。而如果A類(lèi)依賴B類(lèi),那么只有當(dāng)A類(lèi)對(duì)象調(diào)用到相應(yīng)方法時(shí),B類(lèi)對(duì)象才被臨時(shí)創(chuàng)建,方法執(zhí)行結(jié)束,B類(lèi)對(duì)象即被回收,A類(lèi)和B類(lèi)之間的依賴關(guān)系是一種瞬時(shí)關(guān)系。第9章依賴關(guān)系Java語(yǔ)言的繼承在Java語(yǔ)言中,如果B類(lèi)是在A類(lèi)的基礎(chǔ)上衍生出來(lái)的,即B類(lèi)不僅擁有A類(lèi)的所有屬性和方法,還擴(kuò)展了新的屬性或方法,那么就可以讓B類(lèi)繼承A類(lèi),以達(dá)到重復(fù)使用A類(lèi)的目的??梢哉f(shuō),繼承關(guān)系是關(guān)聯(lián)關(guān)系之外的另一種面向?qū)ο蟮膹?fù)用策略。Java語(yǔ)言中,類(lèi)與類(lèi)之間使用關(guān)鍵字extends來(lái)表示繼承關(guān)系。如以下代碼:由于圓形和三角形都是圖形,都具有圖形的屬性和方法,所以圓形和三角形可以作為圖形的子類(lèi)存在。上述代碼中,形狀Shape是父類(lèi),定義了方法draw。而圓形Circle和三角形Triangle是Shape類(lèi)的子類(lèi),使用extends關(guān)鍵字繼承了父類(lèi)Shape。如此一來(lái),Circle和Triangle也擁有了方法draw,而且Circle和Triangle又分別擴(kuò)展了新的方法,用來(lái)獲取直徑和面積。值得注意的是,Java語(yǔ)言中類(lèi)與類(lèi)之間的繼承關(guān)系是單繼承,即一個(gè)類(lèi)最多只能繼承一個(gè)父類(lèi),而一個(gè)父類(lèi)可以同時(shí)有多個(gè)子類(lèi)。單繼承可以避免調(diào)用混亂。第10章繼承關(guān)系繼承中構(gòu)造方法的調(diào)用面向?qū)ο蟮恼Z(yǔ)言中,一切都以對(duì)象為基礎(chǔ),類(lèi)的使用都是從創(chuàng)建對(duì)象開(kāi)始的,而創(chuàng)建對(duì)象都離不開(kāi)調(diào)用構(gòu)造方法。在繼承關(guān)系中,創(chuàng)建子類(lèi)對(duì)象時(shí)構(gòu)造方法的調(diào)用順序需遵守一定的規(guī)則。方法覆蓋方法覆蓋(override)也稱方法重寫(xiě),是繼承中非常重要的知識(shí)點(diǎn)。如果子類(lèi)需要修改從父類(lèi)繼承到的方法的方法體,就可以使用方法覆蓋。方法覆蓋允許子類(lèi)對(duì)父類(lèi)中的方法進(jìn)行重寫(xiě),子類(lèi)對(duì)象能夠自動(dòng)調(diào)用子類(lèi)重寫(xiě)的方法。接下來(lái)通過(guò)Employee類(lèi)的例子介紹方法覆蓋。抽象類(lèi)1.抽象類(lèi)往往用來(lái)做父類(lèi)抽象類(lèi)不能被實(shí)例化,往往用來(lái)做父類(lèi),定義子類(lèi)中公有的屬性和方法。子類(lèi)繼承抽象類(lèi)后,可以復(fù)用其中的屬性和方法。2.抽象類(lèi)可以作為數(shù)據(jù)類(lèi)型使用抽象類(lèi)不能創(chuàng)建對(duì)象。3.抽象類(lèi)可以使用類(lèi)名直接調(diào)用其靜態(tài)成員如果抽象類(lèi)中存在靜態(tài)成員,依然可以使用抽象類(lèi)的類(lèi)名直接調(diào)用。抽象類(lèi)不能創(chuàng)建對(duì)象。4.抽象類(lèi)需要有構(gòu)造方法抽象類(lèi)雖然不能被實(shí)例化,但是依然需要有構(gòu)造方法。因?yàn)槌橄箢?lèi)往往作為父類(lèi)使用,而子類(lèi)的構(gòu)造方法總要調(diào)用父類(lèi)的構(gòu)造方法。如果沒(méi)有為抽象類(lèi)顯式聲明構(gòu)造方法,抽象類(lèi)也存在默認(rèn)無(wú)參的構(gòu)造方法。第10章繼承關(guān)系抽象方法抽象類(lèi)里常常會(huì)聲明抽象方法,本節(jié)將介紹抽象方法的概念和使用。前面章節(jié)中提及了子類(lèi)Sales覆蓋了父類(lèi)Employee中的setSalary方法,假設(shè)Engineer類(lèi)也需要覆蓋Employee類(lèi)中的setSalary方法,代碼如下:第10章繼承關(guān)系抽象方法1.抽象方法與抽象類(lèi)之間的關(guān)系有抽象方法的類(lèi)一定是抽象類(lèi),抽象類(lèi)中卻不一定有抽象方法。抽象方法是沒(méi)有方法體的方法,那么抽象方法所在的類(lèi)就無(wú)法實(shí)例化,所以有抽象方法的類(lèi)一定是抽象類(lèi)。只要一個(gè)類(lèi)不應(yīng)該被實(shí)例化,就可以聲明為抽象類(lèi),與其是否有抽象方法無(wú)關(guān),所以抽象類(lèi)中不一定有抽象方法。2.抽象方法往往被子類(lèi)實(shí)現(xiàn)“怎么做”往往在子類(lèi)中實(shí)現(xiàn)。如果子類(lèi)忽略父類(lèi)中的抽象方法,不去加以實(shí)現(xiàn),根據(jù)“有抽象方法的類(lèi)一定是抽象類(lèi)”的原則,子類(lèi)就必須聲明為抽象類(lèi),否則將出現(xiàn)編譯錯(cuò)誤。第10章繼承關(guān)系多態(tài)性多態(tài)指聲明形式一致,實(shí)現(xiàn)方式卻不同。Java語(yǔ)言中的多態(tài)性有以下3種體現(xiàn)。1.方法重載前面章節(jié)介紹了方法重載的概念。方法重載指一個(gè)類(lèi)中有多個(gè)同名但是不同參數(shù)的方法。例如,Employee類(lèi)中的兩個(gè)setSalary方法,名稱完全相同,區(qū)別在于參數(shù)不同。調(diào)用重載方法時(shí),Java虛擬機(jī)將根據(jù)參數(shù)自動(dòng)綁定到對(duì)應(yīng)的方法。2.方法覆蓋前面章節(jié)介紹了方法覆蓋的概念。方法覆蓋是繼承關(guān)系中的概念,子類(lèi)可以重寫(xiě)父類(lèi)中的方法,子類(lèi)中的方法必須與父類(lèi)中的方法名稱相同、參數(shù)相同、返回值類(lèi)型相同,且子類(lèi)中的方法的訪問(wèn)權(quán)限不能比父類(lèi)中的小,可以等同或擴(kuò)大。使用子類(lèi)對(duì)象調(diào)用被子類(lèi)覆蓋的方法時(shí),將自動(dòng)綁定到對(duì)應(yīng)子類(lèi)中的方法,如果調(diào)用沒(méi)有被子類(lèi)覆蓋的方法,則調(diào)用父類(lèi)中的方法。3.多態(tài)參數(shù)多態(tài)參數(shù)是多態(tài)性的另一種體現(xiàn),也是使用較多的一種方式。多態(tài)參數(shù),即方法的形式參數(shù)類(lèi)型是父類(lèi)類(lèi)型,而傳遞的實(shí)際參數(shù)可以是任意子類(lèi)的對(duì)象。第10章繼承關(guān)系第10章繼承關(guān)系this和super關(guān)鍵字this和super是Java語(yǔ)言中的兩個(gè)關(guān)鍵字,其中super是在繼承關(guān)系中使用的關(guān)鍵字,此節(jié)對(duì)兩個(gè)關(guān)鍵字進(jìn)行介紹。1.this關(guān)鍵字this關(guān)鍵字有兩種使用方式。一種使用方式是作為本類(lèi)當(dāng)前的引用,用來(lái)調(diào)用本類(lèi)的屬性和方法,常見(jiàn)的是用來(lái)區(qū)分同名的方法參數(shù)和屬性。2.super關(guān)鍵字super關(guān)鍵字都在子類(lèi)中使用,有兩種使用方式。一種使用方式是作為父類(lèi)的引用,用來(lái)調(diào)用父類(lèi)中的屬性或方法。如Sales類(lèi)需要覆蓋父類(lèi)Employee中的setSalary(double)方法,使薪資調(diào)整方式不變,僅增加記錄日志功能。也就是說(shuō),子類(lèi)Sales的setSalary(double)方法首先調(diào)用父類(lèi)中的setSalary(double)方法,然后增加日志功能。這時(shí)候就可以使用super關(guān)鍵字來(lái)調(diào)用父類(lèi)中的方法第10章繼承關(guān)系final在繼承中的使用final修飾變量后,變量成為常量,賦值后不能被修改。另外,final還可以修飾類(lèi)和方法。如果一個(gè)類(lèi)被final修飾,則稱為終極類(lèi),該類(lèi)不允許被繼承。API中有大量final類(lèi),如String類(lèi)。如果一個(gè)方法被final修飾,則稱為終極方法,該方法不能被子類(lèi)覆蓋。如果一個(gè)類(lèi)中的所有方法都是final方法,那么等同于類(lèi)聲明為final類(lèi)嗎?答案是否定的。即使一個(gè)類(lèi)中的所有方法都是final方法,該類(lèi)還是可以作為父類(lèi)被繼承,final方法也可以被子類(lèi)對(duì)象使用,只不過(guò)不能被覆蓋。而類(lèi)聲明為final后,就不能做父類(lèi)了,也不能被繼承。第10章繼承關(guān)系static、abstract、final修飾符總結(jié)1.static靜態(tài)屬性:靜態(tài)屬性不綁定到某個(gè)對(duì)象,屬于整個(gè)類(lèi),且存儲(chǔ)空間不變,可以直接使用類(lèi)名調(diào)用。靜態(tài)方法:靜態(tài)方法與靜態(tài)屬性類(lèi)似,不綁定到某個(gè)對(duì)象,是所有對(duì)象共享的方法,可以直接使用類(lèi)名調(diào)用。靜態(tài)塊:靜態(tài)塊在類(lèi)加載時(shí)被調(diào)用,且只能被調(diào)用一次。2.a(chǎn)bstract抽象類(lèi):抽象類(lèi)是不能被實(shí)例化的類(lèi),往往用來(lái)做父類(lèi)。抽象方法:沒(méi)有方法體的方法是抽象方法,往往在子類(lèi)中實(shí)現(xiàn)。有抽象方法的類(lèi)一定是抽象類(lèi)。3.finalfinal類(lèi):final類(lèi)不能被繼承。final屬性:final屬性為常量,賦值后不能被修改。賦值方式有兩種,一種是聲明時(shí)賦值,另一種是在構(gòu)造方法中賦值。final方法:final方法不能被子類(lèi)覆蓋。關(guān)聯(lián)和繼承如果A類(lèi)的某些方法需要“借助”B類(lèi)的方法實(shí)現(xiàn),那么就可以將B類(lèi)作為A類(lèi)的屬性,即關(guān)聯(lián)。關(guān)聯(lián)關(guān)系通過(guò)把已存在的類(lèi)作為屬性的方式,達(dá)到重復(fù)使用的目的。如以下代碼:第10章繼承關(guān)系上述代碼中,B類(lèi)作為A類(lèi)的屬性存在,那么A類(lèi)的所有方法都可以調(diào)用B類(lèi)的方法,從而達(dá)到復(fù)用B類(lèi)的目的。如果需要為某個(gè)類(lèi)創(chuàng)建一個(gè)特殊化的版本,即某個(gè)類(lèi)是一個(gè)通用的類(lèi),而需要開(kāi)發(fā)的類(lèi)在通用的基礎(chǔ)上,還需要一些特殊化處理,這時(shí)就需要使用繼承。如本章中使用的例子:Employee類(lèi)、Sales類(lèi)、Engineer類(lèi)。其中Employee類(lèi)是一個(gè)通用的類(lèi),而Sales類(lèi)和Engineer類(lèi)是對(duì)Employee類(lèi)的特殊化處理。在實(shí)際應(yīng)用中,關(guān)聯(lián)關(guān)系比繼承關(guān)系使用得更為廣泛,但很多初學(xué)者很容易將關(guān)聯(lián)關(guān)系錯(cuò)誤地用成繼承關(guān)系。在選擇使用關(guān)聯(lián)還是繼承時(shí),關(guān)鍵要思考兩個(gè)類(lèi)到底是“HAS-A”關(guān)系還是“IS-A”關(guān)系,切忌盲目地使用繼承。Object類(lèi)中定義了一些常用的方法,任何子類(lèi)都可以直接使用或者進(jìn)行方法覆蓋。下面介紹Object類(lèi)中的兩個(gè)主要方法。1.toString方法toString方法可以將任何一個(gè)對(duì)象轉(zhuǎn)換成字符串返回,返回值的生成算法為getClass().getName()+'@'+Integer.toHexString(hashCode())。toString方法可以被很多方法自動(dòng)調(diào)用,如System.out.println方法,輸出一個(gè)引用類(lèi)型對(duì)象時(shí),將默認(rèn)調(diào)用該對(duì)象的toString方法,輸出toString方法的返回值。API中的很多類(lèi)覆蓋了toString方法,實(shí)現(xiàn)了新的算法。如String類(lèi)的toString方法返回的就是字符串的字符序列。如以下代碼:第10章繼承關(guān)系2.equals方法Object類(lèi)中的equals方法用來(lái)比較兩個(gè)引用的虛地址。當(dāng)且僅當(dāng)兩個(gè)引用在物理上是同一個(gè)對(duì)象時(shí),返回值為true,否則將返回false。如以下代碼:第10章繼承關(guān)系接口的定義Java語(yǔ)言中,可以使用interface關(guān)鍵字來(lái)聲明接口。接口的特點(diǎn)是,沒(méi)有變量,所有方法都是抽象方法??梢詫⒔涌诳闯梢粋€(gè)特殊的抽象類(lèi),特殊之處在于接口中的任何方法都必須是抽象的,而且不能聲明變量。接口編譯后,也生成.class文件。以下代碼演示接口的聲明形式:上述代碼聲明了接口Flyer,該接口中聲明了一個(gè)靜態(tài)常量TYPE,沒(méi)有任何變量;同時(shí)聲明了3個(gè)抽象方法,沒(méi)有任何具體方法。第11章實(shí)現(xiàn)關(guān)系類(lèi)與接口之間的關(guān)系:實(shí)現(xiàn)接口是抽象的,其中沒(méi)有任何具體方法和變量,所以不能進(jìn)行實(shí)例化。接口定義的是多個(gè)類(lèi)都要實(shí)現(xiàn)的操作,即“做什么”。類(lèi)可以實(shí)現(xiàn)接口,從而覆蓋接口中的方法,實(shí)現(xiàn)“怎么做”。類(lèi)實(shí)現(xiàn)接口通過(guò)使用關(guān)鍵字implements完成,然后就擁有了接口中的常量和抽象方法,所以該類(lèi)必須實(shí)現(xiàn)接口定義的抽象方法,否則類(lèi)將是抽象類(lèi),無(wú)法進(jìn)行實(shí)例化。第11章實(shí)現(xiàn)關(guān)系接口的作用接口將Java中抽象的概念進(jìn)一步發(fā)揮。接口的本質(zhì)是一個(gè)“純粹”的抽象類(lèi),即所有方法都是抽象的。接口中只定義“做什么”,將多個(gè)類(lèi)型都需要實(shí)現(xiàn)的功能進(jìn)行統(tǒng)一規(guī)范,而“怎么做”都由各實(shí)現(xiàn)類(lèi)完成,實(shí)現(xiàn)可擴(kuò)展的效果。接口的作用如下。1.實(shí)現(xiàn)多重繼承由于Java類(lèi)要求單繼承,如果沒(méi)有接口的概念,子類(lèi)一旦繼承那些“純粹”的抽象類(lèi),便不能再繼承其他類(lèi)。所以Java語(yǔ)言將“純粹”的抽象類(lèi)定義為一種類(lèi)型,即接口。類(lèi)可以同時(shí)繼承父類(lèi)以及實(shí)現(xiàn)接口,也就是說(shuō),extends和implements關(guān)鍵字可以同時(shí)使用,而且一個(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口,從而實(shí)現(xiàn)對(duì)“純粹”的抽象類(lèi)的多重繼承,解決了類(lèi)與類(lèi)單繼承的局限性。2.實(shí)現(xiàn)多態(tài)性接口不能創(chuàng)建對(duì)象,但是可以作為類(lèi)型存在,因此可以實(shí)現(xiàn)多態(tài)參數(shù)。第11章實(shí)現(xiàn)關(guān)系接口的語(yǔ)法細(xì)節(jié)接口本質(zhì)上是抽象類(lèi),所以具備類(lèi)的特征,但是也有其特殊性。本節(jié)將從多個(gè)方面總結(jié)接口的一些細(xì)節(jié)特征。1.接口的訪問(wèn)權(quán)限類(lèi)(專(zhuān)指外部類(lèi))的訪問(wèn)權(quán)限有兩種:public權(quán)限和default權(quán)限。類(lèi)如果不顯式聲明public權(quán)限,則默認(rèn)為default權(quán)限。然而,接口的訪問(wèn)權(quán)限只能是public,即使不顯式聲明public權(quán)限,也默認(rèn)為public權(quán)限。2.接口體接口體中只能聲明靜態(tài)常量、抽象方法,不能有其他元素。3.接口的常量接口中不能有變量,只能聲明常量,而且常量必須是靜態(tài)的、公共的,即public、static、final修飾的常量,且必須賦初值。值得注意的是,接口中常量的3個(gè)修飾符是默認(rèn)存在的,不管寫(xiě)幾個(gè),甚至不寫(xiě),這3個(gè)修飾符也都同時(shí)存在。4.接口中的方法接口中的方法必須是抽象方法,且訪問(wèn)權(quán)限只能是public。和類(lèi)中的方法權(quán)限不同,接口中的方法即使不顯式聲明權(quán)限修飾符,默認(rèn)也是public權(quán)限。5.類(lèi)與接口之間的關(guān)系前已述及,類(lèi)與接口之間的關(guān)系稱為實(shí)現(xiàn),使用implements關(guān)鍵字表示,是一對(duì)多的關(guān)系。一個(gè)類(lèi)可以同時(shí)實(shí)現(xiàn)多個(gè)接口,多個(gè)接口名稱使用逗號(hào)隔開(kāi)即可。6.接口與接口之間的關(guān)系接口也可以繼承其他接口,達(dá)到復(fù)用效果,和類(lèi)的繼承關(guān)系一樣,也使用關(guān)鍵字extends表示,區(qū)別在于接口可以同時(shí)繼承多個(gè)接口,而類(lèi)只能同時(shí)繼承一個(gè)類(lèi)。第11章實(shí)現(xiàn)關(guān)系Comparable接口1.?dāng)?shù)組元素的類(lèi)實(shí)現(xiàn)Comparable接口如果要使用Arrays.sort(Object[])方法對(duì)某數(shù)組進(jìn)行排序,那么該數(shù)組元素的類(lèi)一定要實(shí)現(xiàn)Comparable接口。例如,要對(duì)Sales數(shù)組進(jìn)行排序,Sales類(lèi)必須實(shí)現(xiàn)Comparable接口。2.覆蓋Comparable接口中的compareTo方法compareTo方法實(shí)現(xiàn)了數(shù)組的某個(gè)元素與其他任意一個(gè)元素的比較,通過(guò)返回值來(lái)表示大于、小于、等于。如按照薪水進(jìn)行比較,則sort方法就按照薪水排序。如果需要按照姓名排序,則compareTo方法就應(yīng)該按照姓名比較。3.調(diào)用Arrays.sort方法當(dāng)完成書(shū)中第1、2步后,就可以創(chuàng)建數(shù)組對(duì)象,傳遞給sort方法,使用類(lèi)名Arrays調(diào)用sort方法進(jìn)行排序。第11章實(shí)現(xiàn)關(guān)系第三部分異常處理第13章Java應(yīng)用異常處理異常概述異常指在程序運(yùn)行的過(guò)程中,發(fā)生了某些意外的事件,如除以0、文件不存在等。如以下代碼:如果傳遞運(yùn)行期參數(shù)0,那么div方法就進(jìn)行了除以0的操作,是不正常的事件,將發(fā)生異常。異常并不是錯(cuò)誤,只是一些不正常的事件,錯(cuò)誤往往與源代碼的Bug或內(nèi)部環(huán)境有關(guān),如內(nèi)存泄露等。Java標(biāo)準(zhǔn)異常類(lèi)型JavaAPI中提供了很多異常類(lèi)及錯(cuò)誤類(lèi),所有的異常類(lèi)和錯(cuò)誤類(lèi)都繼承于java.lang.Throwable類(lèi),該類(lèi)的所有子類(lèi)對(duì)象都可以“被當(dāng)成異常拋出”。Throwable類(lèi)有兩個(gè)直接子類(lèi):Error類(lèi)和Exception類(lèi)。Error類(lèi)表示錯(cuò)誤,可能是編譯期錯(cuò)誤或系統(tǒng)錯(cuò)誤,往往在程序中并不處理。Exception類(lèi)表示異常,是所有異常類(lèi)的父類(lèi),是程序員所關(guān)心的。Exception類(lèi)有很多子類(lèi),這些子類(lèi)可以分為兩種類(lèi)型。1.運(yùn)行期異常Exception類(lèi)有一個(gè)子類(lèi)java.lang.RuntimeException,稱為運(yùn)行期異常。RuntimeException類(lèi)及其所有子類(lèi)都被稱為運(yùn)行期異常類(lèi)。顧名思義,運(yùn)行期異常是程序運(yùn)行期拋出的異常,這些異常都由Java虛擬機(jī)自動(dòng)拋出。如除數(shù)為0時(shí),在程序運(yùn)行期,Java虛擬機(jī)會(huì)拋出數(shù)學(xué)異常(ArithmeticException),數(shù)組索引越界時(shí)會(huì)拋出索引越界異常(ArrayIndexOutOfBoundsException),數(shù)字格式轉(zhuǎn)換出錯(cuò)時(shí)會(huì)拋出數(shù)字格式異常(NumberFormatException)等。2.檢測(cè)異常除了RuntimeException類(lèi)及其子類(lèi)外,其他的異常類(lèi)型都可以稱為檢測(cè)異常(CheckedException)。檢測(cè)異常是在程序中使用throw(相關(guān)內(nèi)容參考后續(xù)章節(jié))關(guān)鍵字拋出的異常,編譯器將強(qiáng)制處理這些異常。API中定義了大量的檢測(cè)異常,如IOException異常、SQLException異常等,java.io包中很多類(lèi)的方法都拋出了IOException異常或其子類(lèi)異常,標(biāo)記不同的異常事件。第13章Java應(yīng)用異常處理異常處理處理異常的作用是標(biāo)記不正常的事件,如果拋出了異常卻不被處理,程序?qū)⒅袛啵徽5赝顺?。所以異常發(fā)生后,必須處理異常,保證程序按照不同的流程正常運(yùn)行下去。Java中使用try、catch、finally語(yǔ)句處理異常。本節(jié)將詳細(xì)介紹異常處理語(yǔ)句的使用。1.trytry塊用來(lái)包含不正常的代碼,即可能發(fā)生異常的代碼塊。2.catchCatch塊必須緊跟在try塊之后,稱為捕獲異常,也就是異常處理函數(shù)。3.finallyfinally是異常處理中用來(lái)強(qiáng)制執(zhí)行某些代碼的語(yǔ)句。第13章Java應(yīng)用異常處理拋出異常運(yùn)行期異常在運(yùn)行時(shí)由Java虛擬機(jī)自動(dòng)拋出,檢測(cè)異常必須在編譯期拋出,前面章節(jié)中演示使用的異常都是運(yùn)行期異常,本節(jié)將介紹如何拋出檢測(cè)異常。Java語(yǔ)言使用throw關(guān)鍵字拋出異常,語(yǔ)法如下:只要是Throwable類(lèi)及其子類(lèi),都可以使用throw關(guān)鍵字拋出。而實(shí)際應(yīng)用中,往往拋出的是Exception類(lèi)及其子類(lèi),而不會(huì)拋出Error。運(yùn)行throw語(yǔ)句后,即拋出異常。如以下代碼:上述代碼拋出了Exception類(lèi)型的異常。拋出異常后如果不加以處理,程序?qū)⒅袛?。?3.5節(jié)將介紹為何在程序中使用throw關(guān)鍵字拋出異常。第13章Java應(yīng)用異常處理為何要拋出異常在程序中拋出異常,往往是因?yàn)闃I(yè)務(wù)邏輯中存在一些不正常事件流,而利用拋出異常來(lái)標(biāo)記這些事件流,可以對(duì)這些事件流進(jìn)行統(tǒng)一處理。如以下代碼:上述代碼中,Account類(lèi)的取款(withdraw)方法,可能存在因余額不足而無(wú)法取款的不正常事件流,那么就可以使用拋出異常的方式來(lái)標(biāo)記“余額不足”這個(gè)事件流。如果余額不足,使用throw語(yǔ)句拋出Exception類(lèi)型的異常。而在throw語(yǔ)句處,將出現(xiàn)編譯錯(cuò)誤,編譯器提醒,拋出異常后必須處理異常。這就是拋出異常的作用:能夠強(qiáng)制該異常被處理,因此異常所標(biāo)記的事件流一定會(huì)被處理。如果不使用拋出異常的方式,而為withdraw方法提供不同返回值來(lái)標(biāo)記不同事件流,那么程序員調(diào)用該方法時(shí),可能會(huì)忽略“余額不足”的事件流。而使用拋出異常來(lái)標(biāo)記“余額不足”后,編譯器將強(qiáng)制處理該異常,以保證該事件流不會(huì)被忽略。第13章Java應(yīng)用異常處理如何處理拋出的異常如果程序中使用throw語(yǔ)句拋出了異常,那么有兩種處理方式。1.將拋出異常的代碼封裝到try塊中要解決該編譯錯(cuò)誤,第一種方式就是把throw語(yǔ)句放到try塊中。2.使用throws關(guān)鍵字聲明異常拋出異常后,不使用try-catch語(yǔ)句處理,而是在方法聲明處使用throws關(guān)鍵字聲明異常。第13章Java應(yīng)用異常處理自定義異常類(lèi)從語(yǔ)法上來(lái)說(shuō),只要是Throwable及其子類(lèi)的對(duì)象均可拋出。然而,如果盲目地拋出API中的異常類(lèi)型,會(huì)使程序混亂。如以下代碼:上述代碼中調(diào)用了withdraw方法,由于該方法使用throws關(guān)鍵字聲明拋出了Exception類(lèi)型的異常,使用try-catch語(yǔ)句捕獲了Exception異常。代碼試圖從賬戶中取出1000元,賬戶余額為3000元,不會(huì)發(fā)生余額不足的情況,也不會(huì)發(fā)生異常。然而,由于在try塊中多了一條會(huì)發(fā)生數(shù)學(xué)異常的語(yǔ)句intx=100/0;,所以,運(yùn)行結(jié)果如下:第13章Java應(yīng)用異常處理throw與throws總結(jié)throw和throws是Java異常處理中兩個(gè)非常重要的關(guān)鍵字。雖然寫(xiě)法類(lèi)似,有著一定的聯(lián)系,但是作用及含義完全不同。本節(jié)將對(duì)這兩個(gè)關(guān)鍵字進(jìn)行比較及總結(jié)。1.throw關(guān)鍵字在方法體中使用throw關(guān)鍵字是在方法體中使用的,用來(lái)拋出異常對(duì)象。2.throw關(guān)鍵字拋出異常后的處理一個(gè)方法中若使用throw關(guān)鍵字拋出了某個(gè)類(lèi)型的異常,如果是運(yùn)行期異常,那么可以不加任何處理。如果是檢測(cè)異常,那么有兩種選擇:使用try-catch語(yǔ)句捕獲異?;蛘呤褂胻hrows關(guān)鍵字聲明拋出異常,一般多選用throws關(guān)鍵字聲明拋出異常的方式處理。3.throws關(guān)鍵字在方法聲明處使用throws關(guān)鍵字用在方法聲明處,聲明該方法可能拋出某些異常。throws關(guān)鍵字后面聲明的是異常類(lèi)型。4.throws關(guān)鍵字后可聲明多種異常throws關(guān)鍵字后可以聲明多種異常類(lèi)型,用逗號(hào)隔開(kāi)即可。5.throws關(guān)鍵字聲明異常后如何處理如果一個(gè)方法使用了throws關(guān)鍵字聲明拋出異常,那么調(diào)用該方法時(shí)必須處理聲明的所有異常??梢允褂胻ry-catch語(yǔ)句逐一進(jìn)行捕獲,或者繼續(xù)使用throws關(guān)鍵字進(jìn)行聲明。6.任何方法都可使用throws關(guān)鍵字任何方法都可以無(wú)條件地使用throws關(guān)鍵字聲明拋出任意類(lèi)型的異常,抽象方法也可以??梢哉f(shuō),方法使用throws關(guān)鍵字聲明異常,在語(yǔ)法上沒(méi)有任何要求。7.方法覆蓋時(shí)對(duì)throws關(guān)鍵字的要求如果子類(lèi)覆蓋父類(lèi)的方法,子類(lèi)的方法不能聲明拋出比父類(lèi)方法更多的異常類(lèi)型。第13章Java應(yīng)用異常處理try-finally的作用在前面章節(jié)中,曾提到try塊后可以沒(méi)有catch語(yǔ)句,只有finally語(yǔ)句。這種方式一定不能捕獲拋出的異常,程序會(huì)中斷,但是程序退出前finally語(yǔ)句會(huì)被強(qiáng)制執(zhí)行。往往try-finally語(yǔ)句會(huì)在以下場(chǎng)合使用:第13章Java應(yīng)用異常處理上述代碼中,try塊中使用throw關(guān)鍵字拋出異常后,并沒(méi)有馬上進(jìn)行捕獲,而是使用throws關(guān)鍵字進(jìn)行聲明,同時(shí)在try塊后聲明了finally語(yǔ)句。不管余額是否足夠,finally語(yǔ)句總是會(huì)被執(zhí)行??偟膩?lái)說(shuō),try-finally語(yǔ)句可以結(jié)合throws關(guān)鍵字一起使用,用來(lái)強(qiáng)制執(zhí)行那些不管是否發(fā)生異常,都要執(zhí)行的處理。再次拋出異常在很多實(shí)際應(yīng)用代碼中,可以看到一些代碼在catch語(yǔ)句中捕獲了異常后,再次將異常使用throw關(guān)鍵字進(jìn)行拋出。如以下代碼:上述代碼中的try塊拋出異常后,使用catch語(yǔ)句進(jìn)行了捕獲,捕獲異常后進(jìn)行了一些必要處理,然后再次使用throw關(guān)鍵字把捕獲的異常拋出,同時(shí)使用throws關(guān)鍵字聲明異常。這種用法往往結(jié)合throws關(guān)鍵字一起使用。在異常發(fā)生的第一時(shí)間,先進(jìn)行核心的統(tǒng)一處理,然后重新將異常拋出,使得在調(diào)用該方法時(shí)可以根據(jù)實(shí)際需要再次捕獲異常、處理異常。第13章Java應(yīng)用異常處理第四部分核心API的使用第15章集合框架泛型快速入門(mén)泛型(GenericType)是JDK5.0版本增加的特性。泛型對(duì)學(xué)習(xí)Java集合是非常重要的知識(shí)點(diǎn),Java類(lèi)的屬性、方法參數(shù)及方法返回值都需要指定數(shù)據(jù)類(lèi)型。泛型的本質(zhì)是參數(shù)化類(lèi)型,也就是將數(shù)據(jù)類(lèi)型作為一個(gè)參數(shù)來(lái)處理。具體來(lái)說(shuō),泛型就是在Java類(lèi)中需要指定數(shù)據(jù)類(lèi)型的地方不指定具體的類(lèi)型,而是用一個(gè)參數(shù)替代,具體使用時(shí)再指定其具體類(lèi)型。集合對(duì)象可以持有其他對(duì)象,作為數(shù)據(jù)容器使用,與數(shù)組的功能類(lèi)似。JavaAPI中的集合框架都位于java.util包中,實(shí)現(xiàn)了很多常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),如鏈表、隊(duì)列、哈希表等。本章將介紹Java語(yǔ)言的集合框架。Java集合框架概述Java集合框架是由很多接口、抽象類(lèi)、具體類(lèi)組成的,都位于java.util包中。集合接口定義了具體集合類(lèi)的規(guī)范。1.Collection<E>接口Collection接口是所有集合類(lèi)的根接口,是一個(gè)泛型接口。Collection對(duì)象可以持有任何類(lèi)型的對(duì)象,其持有的對(duì)象稱為集合元素。Collection接口中定義了add(Eo)方法,可以將對(duì)象存儲(chǔ)到Collection對(duì)象中。Collection接口還有很多子接口,每個(gè)子接口有不同的特征。2.Map<K,V>接口Map接口是Java集合框架中的另一個(gè)關(guān)鍵類(lèi)型,即映射接口,也是一個(gè)泛型接口。Map對(duì)象中映射了key值和value值,key值不允許重復(fù)。Collection對(duì)象只能持有單個(gè)對(duì)象;而Map對(duì)象持有的是兩個(gè)對(duì)象的映射關(guān)系,提供了put(Kkey,Vvalue)方法來(lái)存儲(chǔ)鍵值對(duì)。例如,在Map對(duì)象中存儲(chǔ)員工與部門(mén)的映射關(guān)系,那么員工將作為Map的key,對(duì)應(yīng)的部門(mén)作為Map的value。3.Iterator<E>接口集合對(duì)象作為數(shù)據(jù)容器使用,用來(lái)持有其他對(duì)象,很多時(shí)候需要對(duì)集合元素進(jìn)行遍歷。Iterator接口提供了遍歷Collection對(duì)象的功能,也是一個(gè)泛型接口。對(duì)于Map對(duì)象,不能直接使用Iterator遍歷,但是Map接口中提供了將key與value分別轉(zhuǎn)變成Collection對(duì)象的方法,然后就可以使用Iterator接口分別遍歷Map的key與value。第15章集合框架Iterator接口實(shí)際應(yīng)用中,常常需要對(duì)集合元素進(jìn)行迭代。Iterator接口提供了迭代集合對(duì)象中元素的功能。Iterator接口的主要方法如下。1.booleanhasNext()此方法用來(lái)判斷被迭代的集合中是否存在元素,若集合中存在至少一個(gè)元素,則返回true,否則返回false。該方法的返回值往往用來(lái)作為while循環(huán)的條件來(lái)迭代集合。2.Enext()此方法用來(lái)返回集合中的當(dāng)前元素,E是泛型,具體類(lèi)型根據(jù)集合的泛型類(lèi)型決定。要使用Iterator接口迭代集合對(duì)象,首先必須把集合對(duì)象轉(zhuǎn)換成Iterator對(duì)象。第15章集合框架Collection接口及其子接口Collection接口定義了集合類(lèi)型的基本規(guī)范。Collection接口中常用的方法如下。(1)booleanadd(Eo):可以向Collection對(duì)象中存儲(chǔ)對(duì)象o,o的類(lèi)型是泛型E。(2)Iterator<E>iterator():生成迭代器對(duì)象,進(jìn)而可以迭代集合中的元素。(3)intsize():返回集合對(duì)象中元素的個(gè)數(shù)。其中,size指的是有效長(zhǎng)度,即添加到集合中的元素個(gè)數(shù)。集合中還有一個(gè)概念是容量(capacity),容量與數(shù)組的長(zhǎng)度類(lèi)似,指的是集合當(dāng)前能夠容納的元素的個(gè)數(shù)。集合的容量是可變的,而數(shù)組的長(zhǎng)度是不可變的。Collection接口定義了集合類(lèi)型的基本規(guī)范,集合框架中基于Collection接口衍生了3個(gè)主要的子接口,每個(gè)子接口規(guī)范一種具體的集合類(lèi)型,分別是列表(List)、集合(Set)和隊(duì)列(Queue)。1.ListList稱為列表,是有序的(ordered)集合,其中的元素都是有索引的。List接口是Collection接口的子接口,所以具有Collection接口中定義的所有功能。同時(shí),List接口擴(kuò)展了一些新的方法,新方法大多與索引有關(guān),作用如下。(1)voidadd(intindex,Eelement):將元素插入指定索引位置。(2)Eget(intindex):將集合中某索引位置的元素取出并返回。(3)Eset(intindex,Eelement):使用某元素替換集合中指定索引位置的元素。2.SetSet稱為集合,與List不同的是,Set是無(wú)序的,但是不允許存儲(chǔ)重復(fù)元素,而List中允許存儲(chǔ)重復(fù)元素。Set接口是Collection接口的子接口,所以具有Collection接口中定義的所有功能。Set接口幾乎沒(méi)有擴(kuò)展新方法。
3.QueueQueue稱為隊(duì)列,是JDK5.0版本增加的接口,實(shí)現(xiàn)了“先進(jìn)先出”(FIFO)的存儲(chǔ)結(jié)構(gòu)。Queue接口是Collection接口的子接口,具有Collection接口中定義的所有功能。此外,Queue接口還提供了一些新的插入、提取、查詢等方法。第15章集合框架List接口的實(shí)現(xiàn)類(lèi)List是有序的集合,實(shí)際開(kāi)發(fā)中使用較多。List是接口,無(wú)法直接創(chuàng)建對(duì)象。1.ArrayListArrayList稱為數(shù)組列表,數(shù)據(jù)采用數(shù)組的方式存儲(chǔ),使用連續(xù)內(nèi)存存儲(chǔ)。ArrayList類(lèi)是Java語(yǔ)言中可變長(zhǎng)度數(shù)組的實(shí)現(xiàn),是最常用的集合類(lèi)型之一。2.LinkedListLinkedList稱為鏈表,表示該集合類(lèi)型實(shí)現(xiàn)了“鏈表”的數(shù)據(jù)結(jié)構(gòu)。值得一提的是,LinkedList類(lèi)不僅實(shí)現(xiàn)了List接口,還實(shí)現(xiàn)了Queue接口,可以說(shuō)鏈表同時(shí)也可以作為一個(gè)隊(duì)列對(duì)象使用,使用方式與ArrayList類(lèi)類(lèi)似。3.VectorVector類(lèi)“歷史悠久”,是JDK1.0版本中的集合類(lèi),后來(lái)經(jīng)過(guò)修改實(shí)現(xiàn)了List接口。Vector類(lèi)的功能幾乎都可以被ArrayList類(lèi)替代,主要區(qū)別是Vector類(lèi)是線程同步的,而ArrayList類(lèi)不是同步的。第15章集合框架Set接口的實(shí)現(xiàn)類(lèi)Set接口是Collection另一個(gè)重要的子接口,主要特點(diǎn)是其中的元素不允許重復(fù),即Set中的元素都是唯一的。1.HashSetHashSet類(lèi)是Set接口的一個(gè)主要實(shí)現(xiàn)類(lèi),底層是哈希表結(jié)構(gòu)。2.TreeSetTreeSet類(lèi)是Set接口的另一個(gè)實(shí)現(xiàn)類(lèi)。實(shí)際上,TreeSet類(lèi)沒(méi)有直接實(shí)現(xiàn)Set接口,而是實(shí)現(xiàn)了Set接口的一個(gè)子接口SortedSet。TreeSet不但能夠保證其中的元素不重復(fù),而且能對(duì)元素進(jìn)行排序。TreeSet中的元素對(duì)象所屬的類(lèi)必須實(shí)現(xiàn)Comparable接口,否則默認(rèn)排序時(shí)將拋出運(yùn)行期異常ClassCastException。下面修改Department類(lèi),使其實(shí)現(xiàn)Comparable接口,覆蓋compareTo方法。第15章集合框架Map接口的實(shí)現(xiàn)類(lèi)Map與Collection不同,Map中保存的是鍵值對(duì),key值不允許重復(fù),而Collection中保存的是單個(gè)對(duì)象。Map接口中的主要方法如下。(1)Vput(Kkey,Vvalue)。該方法可以將key和value存到Map對(duì)象中。如果key已經(jīng)存在,則被覆蓋,返回被覆蓋前的value;如果key不存在,則返回null。(2)Vget(Objectkey)。該方法可以根據(jù)key返回對(duì)應(yīng)的value。(3)intsize()。該方法返回Map對(duì)象中鍵值對(duì)的數(shù)量。(4)Set<K>keySet()。該方法將Map對(duì)象中的key值取出,返回Set對(duì)象中。(5)Collection<V>values()。該方法將Map對(duì)象中的value值取出,返回Collection對(duì)象中。第15章集合框架第15章集合框架Collections類(lèi)java.util包中提供了一個(gè)集合框架的工具類(lèi):Collections類(lèi)。與Arrays類(lèi)(數(shù)組工具類(lèi))類(lèi)似,Collections類(lèi)中的所有方法都是靜態(tài)方法,都可以直接使用Collections類(lèi)名調(diào)用。1.同步集合對(duì)象的方法集合框架的具體實(shí)現(xiàn)類(lèi)中,Vector和Hashtable類(lèi)是線程同步的,而其他集合類(lèi)都不是線程同步的。如果需要將集合類(lèi)做成線程同步的類(lèi),可以調(diào)用Collections類(lèi)中相應(yīng)的synchronizedXxx方法實(shí)現(xiàn)。如publicstatic<T>List<T>synchronizedList(List<T>list)方法可以將List對(duì)象同步。2.對(duì)List排序的方法集合接口中的Set和Map接口都有可以排序的實(shí)現(xiàn)類(lèi),如TreeSet、TreeMap。而List接口沒(méi)有可以排序的實(shí)現(xiàn)類(lèi)。如果要對(duì)List進(jìn)行排序,可以使用Collections類(lèi)中的方法,代碼如下:Collections中還有很多其他方法,均是集合類(lèi)的工具方法,如二分查找、返回集合中的最大/最小值等。使用Collections中的方法時(shí)涉及大量的泛型語(yǔ)法,可參考泛型章節(jié)。集合與數(shù)組之間的轉(zhuǎn)換由于數(shù)組的性能和效率比集合高,所以在實(shí)際應(yīng)用中可能需要將集合對(duì)象轉(zhuǎn)換成數(shù)組對(duì)象進(jìn)行下一步操作。Collection接口中定義了集合與數(shù)組之間的轉(zhuǎn)換方法,代碼如下:其中,T是集合對(duì)象的泛型,a是一個(gè)已經(jīng)存在的數(shù)組,如果數(shù)組a的長(zhǎng)度小于集合的元素個(gè)數(shù),則重新創(chuàng)建一個(gè)新的數(shù)組來(lái)容納集合元素;如果數(shù)組a的長(zhǎng)度大于集合的元素個(gè)數(shù),則直接將集合元素復(fù)制到數(shù)組中。第15章集合框架File類(lèi)要對(duì)文件進(jìn)行輸入/輸出操作,首先需要將文件封裝為對(duì)象。API中定義了File類(lèi)來(lái)封裝文件。File類(lèi)是java.io包中一個(gè)非常重要的類(lèi),可以協(xié)助進(jìn)行輸入/輸出操作。File的字面含義為“文件”,但既可以表示“文件”,也可以表示“目錄”。API中沒(méi)有Directory類(lèi),文件和目錄都使用File類(lèi)進(jìn)行封裝。File類(lèi)中定義了操作文件和目錄的方法。如以下代碼:第16章輸入/輸出系統(tǒng)文件過(guò)濾器在實(shí)際應(yīng)用中,常常只需要返回符合某些條件的子目錄及文件,即對(duì)目錄下的子目錄及文件進(jìn)行過(guò)濾。java.io包中提供了文件名過(guò)濾器及文件過(guò)濾器,可以對(duì)目錄下的子目錄及文件進(jìn)行過(guò)濾,只返回符合過(guò)濾條件的子目錄及文件。1.文件名過(guò)濾器FilenameFilter文件名過(guò)濾器FilenameFilter是一個(gè)接口,定義了設(shè)置過(guò)濾條件的方法accept(Filedir,Stringname),其中dir是當(dāng)前目錄,name是當(dāng)前子目錄或文件名。File類(lèi)中提供了一個(gè)使用文件名過(guò)濾器遍歷目錄的方法publicString[]list(FilenameFilterfilter)。要想能夠使用指定的文件名過(guò)濾器過(guò)濾目錄,首先需要自定義一個(gè)文件名過(guò)濾器類(lèi),實(shí)現(xiàn)文件名過(guò)濾器接口FilenameFilter,覆蓋接口中的accept(Filedir,Stringname)方法,在該方法中定義過(guò)濾條件。File類(lèi)中的list方法將目錄下的File對(duì)象逐一傳遞給accept方法,如果accept方法的返回值為true,則當(dāng)前的File對(duì)象包含在返回值數(shù)組中;如果返回值為false,則該File對(duì)象不包含在返回值數(shù)組中。2.文件過(guò)濾器FileFilter除了可以使用FilenameFilter針對(duì)名稱進(jìn)行過(guò)濾,還可以使用FileFilter進(jìn)行更為靈活的過(guò)濾。File類(lèi)中提供了publicFile[]listFiles(FileFilterfilter)方法,可以使用FileFilter進(jìn)行過(guò)濾。使用FileFilter與使用FilenameFilter類(lèi)似,首先必須自定義文件過(guò)濾器類(lèi),實(shí)現(xiàn)文件過(guò)濾器接口FileFilter,覆蓋其中的accept方法,定義過(guò)濾條件。第16章輸入/輸出系統(tǒng)I/O流的分類(lèi)1.輸入流和輸出流I/O即輸入/輸出,輸入是對(duì)數(shù)據(jù)進(jìn)行“讀(read)”操作,從外存讀到內(nèi)存,稱為“入”;輸出是對(duì)數(shù)據(jù)進(jìn)行“寫(xiě)(write)”操作,從內(nèi)存寫(xiě)到外存,稱為“出”。從輸入/輸出這個(gè)角度,可以將I/O流類(lèi)分為兩
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題申報(bào)參考:教育發(fā)展質(zhì)量動(dòng)態(tài)監(jiān)測(cè)和評(píng)估研究
- 2025版土地儲(chǔ)備開(kāi)發(fā)投資合作協(xié)議3篇
- 二零二五版能源采購(gòu)合同風(fēng)險(xiǎn)控制與能源價(jià)格波動(dòng)應(yīng)對(duì)3篇
- 2025年度個(gè)人藝術(shù)品收藏鑒定合同3篇
- 2025年度個(gè)人股東股權(quán)轉(zhuǎn)讓協(xié)議范本詳盡規(guī)定股權(quán)轉(zhuǎn)讓費(fèi)用3篇
- 2025版委托人事代理及員工職業(yè)發(fā)展協(xié)議3篇
- 基于物聯(lián)網(wǎng)的智能穿戴設(shè)備2025年度研發(fā)合同
- 2025年個(gè)人魚(yú)塘智能養(yǎng)殖系統(tǒng)研發(fā)與應(yīng)用合同范本4篇
- 2025年度企業(yè)股權(quán)轉(zhuǎn)讓與知識(shí)產(chǎn)權(quán)許可合同
- 2025年度新型環(huán)保木質(zhì)防火門(mén)批發(fā)采購(gòu)合同
- 2025年上半年江蘇連云港灌云縣招聘“鄉(xiāng)村振興專(zhuān)干”16人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- DB3301T 0382-2022 公共資源交易開(kāi)評(píng)標(biāo)數(shù)字見(jiàn)證服務(wù)規(guī)范
- 人教版2024-2025學(xué)年八年級(jí)上學(xué)期數(shù)學(xué)期末壓軸題練習(xí)
- 江蘇省無(wú)錫市2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)試題(原卷版)
- 俄語(yǔ)版:中國(guó)文化概論之中國(guó)的傳統(tǒng)節(jié)日
- 2022年湖南省公務(wù)員錄用考試《申論》真題(縣鄉(xiāng)卷)及答案解析
- 婦科一病一品護(hù)理匯報(bào)
- 哪吒之魔童降世
- 2022年上海市各區(qū)中考一模語(yǔ)文試卷及答案
- 2024年全國(guó)統(tǒng)一高考數(shù)學(xué)試卷(新高考Ⅱ)含答案
- 地震工程學(xué)概論課件
評(píng)論
0/150
提交評(píng)論