Java程序設(shè)計(jì)教程課件 第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第1頁(yè)
Java程序設(shè)計(jì)教程課件 第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第2頁(yè)
Java程序設(shè)計(jì)教程課件 第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第3頁(yè)
Java程序設(shè)計(jì)教程課件 第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第4頁(yè)
Java程序設(shè)計(jì)教程課件 第5章 面向?qū)ο蟾呒?jí)程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第5章

面向?qū)ο蟾呒?jí)程序設(shè)計(jì)

教學(xué)導(dǎo)航教學(xué)目標(biāo)了解Java多繼承的實(shí)現(xiàn)方法了解Java的多線(xiàn)程技術(shù)及其應(yīng)用熟悉Java的泛型和泛型方法的正確使用方法掌握J(rèn)ava抽象類(lèi)的定義與使用方法掌握J(rèn)ava接口的定義與使用方法掌握J(rèn)ava的內(nèi)部類(lèi)和枚舉類(lèi)的定義與使用方法掌握J(rèn)ava集合的接口和類(lèi)的應(yīng)用教學(xué)重點(diǎn)Java抽象類(lèi)的定義與使用方法Java接口的定義與使用方法Java的泛型和泛型方法的正確使用

身臨其境

華為Mate60手機(jī)的參數(shù)如圖5-1所示,格力KFR-72LW/NhGm1BAj空調(diào)的參數(shù)如圖5-2所示,某教材的參數(shù)如圖5-3所示。手機(jī)、空調(diào)、筆記本電腦、音箱、教材都是購(gòu)物網(wǎng)站待出售的商品,具有一般商品的通用參數(shù),如商品名稱(chēng)、商品編碼、品牌等。手機(jī)隸屬于數(shù)碼產(chǎn)品子類(lèi),空調(diào)隸屬于電器子類(lèi),教材隸屬于圖書(shū)子類(lèi),這些商品子類(lèi)之間可能會(huì)有相同的參數(shù),但大部分參數(shù)不同。圖5-1

華為Mate60手機(jī)的參數(shù)圖5-2

格力KFR-72LW/NhGm1BAj空調(diào)的參數(shù)圖5-3

某教材的參數(shù)圖5-4

手機(jī)顏色類(lèi)型

前導(dǎo)知識(shí)【知識(shí)1-1】認(rèn)知Java面向?qū)ο蟮母呒?jí)特性

抽象類(lèi)和接口是Java面向?qū)ο蟮闹匾匦裕梢詫?shí)現(xiàn)面向?qū)ο蟮亩鄳B(tài)機(jī)制。內(nèi)部類(lèi)定義在其他類(lèi)的內(nèi)部,并隱藏在外部類(lèi)之內(nèi),同時(shí),不允許同一個(gè)包中的其他類(lèi)訪(fǎng)問(wèn)內(nèi)部類(lèi),從而對(duì)內(nèi)部類(lèi)提供了更好的封裝。枚舉類(lèi)提供了對(duì)枚舉類(lèi)型更好的描述和支持。泛型可以在存取對(duì)象時(shí)明確地指明對(duì)象的類(lèi)型,并將問(wèn)題暴露在編譯階段,由編譯器進(jìn)行檢測(cè),避免在運(yùn)行時(shí)出現(xiàn)轉(zhuǎn)型異常,從而增加程序的可讀性和穩(wěn)定性,提高程序的運(yùn)行效率。集合是能夠容納其他對(duì)象的對(duì)象,如模塊2中介紹的數(shù)組就是一種基本的集合對(duì)象。集合內(nèi)的元素與元素之間具有一定的數(shù)據(jù)結(jié)構(gòu),并提供了一些有用的算法,從而為程序組織和操縱批量數(shù)據(jù)提供強(qiáng)有力的支持。Java的一個(gè)重要特性就是在語(yǔ)言級(jí)層面支持多線(xiàn)程程序設(shè)計(jì)。多線(xiàn)程是指一個(gè)程序中包含多個(gè)執(zhí)行流,是實(shí)現(xiàn)并發(fā)的一種有效手段。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-1

定義并繼承商品抽象類(lèi)

【任務(wù)描述】創(chuàng)建package5包。創(chuàng)建商品抽象類(lèi)GoodsAbstractClass5_1,并在其中定義多個(gè)成員變量(包括商品編碼、商品名稱(chēng)、商品數(shù)量、商品價(jià)格和貨幣單位等)、多個(gè)構(gòu)造方法和成員方法。在商品抽象類(lèi)中定義2個(gè)抽象方法displayBaseInfo()、displaySizeInfo(),分別用于輸出商品基本信息和商品的尺寸。創(chuàng)建商品抽象類(lèi)GoodsAbstractClass5_1的抽象子類(lèi)GoodsAbstractClassSub1,該子類(lèi)只實(shí)現(xiàn)父類(lèi)的1個(gè)抽象方法displayBaseInfo()。創(chuàng)建商品抽象類(lèi)GoodsAbstractClass5_1的其他3個(gè)子類(lèi)BooksClassSub2、DigitalClassSub3、ElectricalClassSub4,這3個(gè)子類(lèi)實(shí)現(xiàn)其父類(lèi)所有的抽象方法,區(qū)別是構(gòu)造方法的參數(shù)個(gè)數(shù)不同。創(chuàng)建測(cè)試類(lèi)Test5_1和類(lèi)AbstractTest。分別調(diào)用類(lèi)GoodsAbstractClass5_1的displayAmount()方法,輸出商品總金額;調(diào)用類(lèi)GoodsAbstractClass5_1的displayBaseInfo()、displaySizeInfo()方法,輸出商品基本信息和商品的尺寸。任務(wù)5-1

定義并繼承商品抽象類(lèi)

【知識(shí)5-2】定義Java的抽象類(lèi)和抽象方法1.定義抽象類(lèi)定義類(lèi)時(shí),在class關(guān)鍵詞前面加上一個(gè)關(guān)鍵詞abstract,這樣的類(lèi)被定義為抽象類(lèi)。定義抽象類(lèi)的語(yǔ)法格式如下。[訪(fǎng)問(wèn)控制修飾符]abstractclass類(lèi)名其中,訪(fǎng)問(wèn)控制修飾符可以為public,或者沒(méi)有訪(fǎng)問(wèn)控制修飾符。如果訪(fǎng)問(wèn)控制修飾符為public,則要求類(lèi)的名稱(chēng)與文件名完全相同。abstract表示定義的類(lèi)為抽象類(lèi),類(lèi)名必須是合法的Java標(biāo)識(shí)符。2.定義抽象方法在抽象類(lèi)中可以定義抽象方法,抽象方法也使用關(guān)鍵詞abstract來(lái)標(biāo)識(shí)。定義抽象方法的語(yǔ)法格式如下。[訪(fǎng)問(wèn)控制修飾符]abstract返回類(lèi)型

方法名([參數(shù)列表]);在抽象方法中只包含方法的聲明部分,不包含方法的實(shí)現(xiàn)部分,并直接以“;”結(jié)束。如果把抽象類(lèi)作為父類(lèi),則在父類(lèi)中聲明的抽象方法將在子類(lèi)中具體實(shí)現(xiàn)。因?yàn)槌橄箢?lèi)(父類(lèi))的引用可以指向具體的子類(lèi)對(duì)象,所以會(huì)執(zhí)行不同子類(lèi)重寫(xiě)后的方法,從而形成多態(tài)。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-2

定義并實(shí)現(xiàn)商品接口【任務(wù)描述】創(chuàng)建商品接口GoodsInterface5_2,在該接口中定義兩個(gè)靜態(tài)常量currencyUnit1和currencyUnit2,用來(lái)存儲(chǔ)兩種不同的貨幣單位。另外,在該接口中定義兩個(gè)抽象方法displayBaseInfo()、displayAmount(),分別用于輸出商品基本信息和商品總金額。創(chuàng)建實(shí)現(xiàn)GoodsInterface5_2的類(lèi)GoodsAbstractClass1和GoodsClass2,其中類(lèi)GoodsAbstractClass1定義成抽象類(lèi),只實(shí)現(xiàn)接口的displayAmount()方法;類(lèi)GoodsClass2定義成普通類(lèi),實(shí)現(xiàn)接口所有的抽象方法。創(chuàng)建測(cè)試類(lèi)Test5_2,在該類(lèi)中分別通過(guò)類(lèi)對(duì)象和接口對(duì)象訪(fǎng)問(wèn)類(lèi)的成員方法。任務(wù)5-2

定義并實(shí)現(xiàn)商品接口【知識(shí)5-3】定義并實(shí)現(xiàn)Java接口Java中的接口是一種引用數(shù)據(jù)類(lèi)型。通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類(lèi)的相同行為,且無(wú)須考慮這些類(lèi)的關(guān)系。接口只包含終態(tài)變量和方法的聲明,而沒(méi)有值可以變化的變量和方法的實(shí)現(xiàn),且其方法都是抽象方法。通過(guò)接口指明多個(gè)類(lèi)需要實(shí)現(xiàn)的方法,可以使得設(shè)計(jì)與實(shí)現(xiàn)相分離。1.定義接口定義接口的語(yǔ)法格式如下。[訪(fǎng)問(wèn)控制修飾符][abstract]interface接口名[extends父接口名,……]{[成員變量定義][成員方法定義]}(1)訪(fǎng)問(wèn)控制修飾符可以為public或默認(rèn)值。如果接口聲明為public,則接口名與文件名必須相同。因?yàn)榻涌诒旧硎浅橄蟮模越涌诓荒苡胒inal修飾。(2)關(guān)鍵詞abstract是可選項(xiàng),可以省略。(3)接口名必須符合Java標(biāo)識(shí)符命名規(guī)則。(4)接口與接口之間可以繼承,并且一個(gè)接口可以同時(shí)繼承多個(gè)接口,多個(gè)接口之間用逗號(hào)分隔。(5)在接口中可以定義成員變量和成員方法,但接口中的變量和方法有特定的要求。接口中定義的成員變量默認(rèn)具有public、static、final屬性,也就是說(shuō)接口中定義的變量為常量,即使沒(méi)有加final關(guān)鍵詞,也默認(rèn)為常量,這些常量在定義時(shí)必須賦值,賦值后其值不能改變。接口中定義的成員方法默認(rèn)具有public、abstract屬性,接口中的所有方法都是抽象的,抽象方法不能用static修飾。(6)如果沒(méi)有指定接口成員方法和成員變量的public訪(fǎng)問(wèn)權(quán)限,則Java將其隱式地聲明為public。任務(wù)5-2

定義并實(shí)現(xiàn)商品接口

【知識(shí)5-3】定義并實(shí)現(xiàn)Java接口Java中的接口是一種引用數(shù)據(jù)類(lèi)型。通過(guò)接口可以實(shí)現(xiàn)不相關(guān)類(lèi)的相同行為,且無(wú)須考慮這些類(lèi)的關(guān)系。接口只包含終態(tài)變量和方法的聲明,而沒(méi)有值可以變化的變量和方法的實(shí)現(xiàn),且其方法都是抽象方法。通過(guò)接口指明多個(gè)類(lèi)需要實(shí)現(xiàn)的方法,可以使得設(shè)計(jì)與實(shí)現(xiàn)相分離。1.定義接口定義接口的語(yǔ)法格式如下。[訪(fǎng)問(wèn)控制修飾符][abstract]interface接口名[extends父接口名,……]{[成員變量定義][成員方法定義]}(1)訪(fǎng)問(wèn)控制修飾符可以為public或默認(rèn)值。如果接口聲明為public,則接口名與文件名必須相同。因?yàn)榻涌诒旧硎浅橄蟮?,所以接口不能用final修飾。(2)關(guān)鍵詞abstract是可選項(xiàng),可以省略。(3)接口名必須符合Java標(biāo)識(shí)符命名規(guī)則。(4)接口與接口之間可以繼承,并且一個(gè)接口可以同時(shí)繼承多個(gè)接口,多個(gè)接口之間用逗號(hào)分隔。(5)在接口中可以定義成員變量和成員方法,但接口中的變量和方法有特定的要求。接口中定義的成員變量默認(rèn)具有public、static、final屬性,也就是說(shuō)接口中定義的變量為常量,即使沒(méi)有加final關(guān)鍵詞,也默認(rèn)為常量,這些常量在定義時(shí)必須賦值,賦值后其值不能改變。接口中定義的成員方法默認(rèn)具有public、abstract屬性,接口中的所有方法都是抽象的,抽象方法不能用static修飾。(6)如果沒(méi)有指定接口成員方法和成員變量的public訪(fǎng)問(wèn)權(quán)限,則Java將其隱式地聲明為public。任務(wù)5-2

定義并實(shí)現(xiàn)商品接口

【知識(shí)5-3】定義并實(shí)現(xiàn)Java接口2.實(shí)現(xiàn)接口接口與接口之間可以有繼承關(guān)系,而類(lèi)與接口之間是實(shí)現(xiàn)(Implements)關(guān)系,即類(lèi)實(shí)現(xiàn)了接口。實(shí)現(xiàn)接口的語(yǔ)法格式如下。訪(fǎng)問(wèn)控制修飾符class類(lèi)名[extends父類(lèi)名][implements接口1,[接口2]……]{//類(lèi)體}實(shí)現(xiàn)接口的類(lèi)定義與一般類(lèi)定義基本相似,但存在以下方面的區(qū)別。(1)接口列表中可以有多個(gè)接口,多個(gè)接口之間用逗號(hào)分隔。(2)一個(gè)類(lèi)實(shí)現(xiàn)接口時(shí),要實(shí)現(xiàn)接口中所有的抽象方法,否則這個(gè)類(lèi)必須定義為抽象類(lèi)。(3)因?yàn)榻涌谥谐橄蠓椒ǖ脑L(fǎng)問(wèn)權(quán)限默認(rèn)為public,在類(lèi)中實(shí)現(xiàn)抽象方法時(shí)其訪(fǎng)問(wèn)權(quán)限不能降低,所以這些抽象方法在類(lèi)中重寫(xiě)后訪(fǎng)問(wèn)權(quán)限只能為public。任務(wù)5-2

定義并實(shí)現(xiàn)商品接口

【知識(shí)5-4】區(qū)分Java接口與抽象類(lèi)接口與抽象類(lèi)在本質(zhì)上是不同的。當(dāng)類(lèi)繼承抽象類(lèi)時(shí),子類(lèi)與抽象類(lèi)之間有繼承關(guān)系;當(dāng)類(lèi)實(shí)現(xiàn)接口時(shí),類(lèi)與接口之間沒(méi)有繼承關(guān)系。(1)接口與抽象類(lèi)的共同點(diǎn)①

兩者都包含抽象方法,且多個(gè)類(lèi)共用方法的參數(shù)列表和返回值。②

兩者都不能被實(shí)例化。③

兩者都是引用數(shù)據(jù)類(lèi)型,其變量可被賦值為子類(lèi)或?qū)崿F(xiàn)接口類(lèi)的對(duì)象。(2)接口與抽象類(lèi)的區(qū)別①

接口使用interface來(lái)聲明,抽象類(lèi)使用abstractclass來(lái)聲明。②

類(lèi)只能繼承一個(gè)抽象類(lèi),但可以同時(shí)實(shí)現(xiàn)多個(gè)接口。③

抽象類(lèi)中的成員變量定義與非抽象類(lèi)中的成員變量定義相同,子類(lèi)可以對(duì)成員變量賦值;但接口中的成員變量的默認(rèn)屬性為public、static、final,只能聲明為常量。④

抽象類(lèi)中可以定義抽象方法,也可以定義非抽象方法,還可以定義構(gòu)造方法;但接口中只能定義抽象方法,不能定義非抽象方法和構(gòu)造方法。⑤

抽象類(lèi)中的抽象方法前必須使用abstract來(lái)修飾,且訪(fǎng)問(wèn)控制修飾符可以是public、protected和默認(rèn)值這3種中的任意一種;而接口中的成員方法的默認(rèn)屬性為abstract和public。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-3

實(shí)現(xiàn)商品類(lèi)多繼承并訪(fǎng)問(wèn)成員方法【任務(wù)描述】(1)創(chuàng)建1個(gè)抽象類(lèi)AbstractClass5_3,在該類(lèi)中定義1個(gè)抽象方法displayBaseInfo(),用于輸出商品的基本信息。(2)創(chuàng)建2個(gè)接口Interface1和Interface2。在接口Interface1中定義1個(gè)抽象方法displayResolution(),用于輸出商品的分辨率;在接口Interface2中定義1個(gè)抽象方法displaySize(),用于輸出商品的機(jī)身尺寸。(3)創(chuàng)建繼承自AbstractClass5_3的子類(lèi)GoodsClassSub1。在該子類(lèi)中聲明3個(gè)成員變量(包括商品編碼、商品名稱(chēng)和商品價(jià)格)、1個(gè)構(gòu)造方法,以及1個(gè)成員方法displayGoodsType(),該成員方法用于輸出商品的類(lèi)別,實(shí)現(xiàn)其父類(lèi)的抽象方法displayBaseInfo()。(4)創(chuàng)建類(lèi)GoodsClassSub2,實(shí)現(xiàn)接口Interface1。在該類(lèi)中實(shí)現(xiàn)接口的抽象方法displayResolution(),并且聲明1個(gè)成員方法displayGoodsType(),用于輸出商品的類(lèi)別。(5)創(chuàng)建類(lèi)GoodsClassSub3,實(shí)現(xiàn)接口Interface2。在該類(lèi)中實(shí)現(xiàn)接口的抽象方法displaySize(),并且聲明1個(gè)成員方法displayGoodsType(),用于輸出商品的類(lèi)別。(6)創(chuàng)建繼承自抽象類(lèi)AbstractClass5_3的子類(lèi)GoodsMultiInherit5_3,該類(lèi)要求同時(shí)實(shí)現(xiàn)2個(gè)接口,并實(shí)現(xiàn)抽象類(lèi)和接口中所有的抽象方法。(7)創(chuàng)建測(cè)試類(lèi)Test5_3_1,測(cè)試類(lèi)AbstractClass5_3的對(duì)象對(duì)其自身的成員方法以及子類(lèi)的成員方法的可訪(fǎng)問(wèn)性;測(cè)試接口類(lèi)型的變量對(duì)其自身的成員方法以及實(shí)現(xiàn)類(lèi)的成員方法的可訪(fǎng)問(wèn)性;測(cè)試接口類(lèi)型引用強(qiáng)制轉(zhuǎn)換成具體對(duì)象類(lèi)型的引用后,接口類(lèi)型的變量對(duì)其實(shí)現(xiàn)類(lèi)的成員方法的可訪(fǎng)問(wèn)性。(8)創(chuàng)建測(cè)試類(lèi)Test5_3_2,測(cè)試多繼承的可訪(fǎng)問(wèn)性。通過(guò)子類(lèi)對(duì)象訪(fǎng)問(wèn)父類(lèi)的成員方法和接口的成員方法。通過(guò)接口類(lèi)型的變量引用類(lèi)對(duì)象,訪(fǎng)問(wèn)接口的成員方法,將接口類(lèi)型的引用強(qiáng)制轉(zhuǎn)換為具體對(duì)象類(lèi)型后訪(fǎng)問(wèn)類(lèi)AbstractClass5_3的成員方法。任務(wù)5-3

實(shí)現(xiàn)商品類(lèi)多繼承并訪(fǎng)問(wèn)成員方法由于接口中的所有方法都是抽象方法,當(dāng)類(lèi)實(shí)現(xiàn)多個(gè)接口時(shí),多個(gè)接口中的同名抽象方法在類(lèi)中只有一個(gè)實(shí)現(xiàn),從而避免了多繼承后語(yǔ)義上的復(fù)雜性。當(dāng)類(lèi)實(shí)現(xiàn)多個(gè)接口時(shí),該類(lèi)的對(duì)象可以被多個(gè)接口類(lèi)型的變量引用。通過(guò)接口類(lèi)型的變量引用類(lèi)對(duì)象時(shí),只能訪(fǎng)問(wèn)接口中定義的方法,如果要訪(fǎng)問(wèn)實(shí)現(xiàn)接口的類(lèi)中定義的方法,則需要將接口類(lèi)型引用強(qiáng)制轉(zhuǎn)換為類(lèi)對(duì)象的引用。在轉(zhuǎn)換之前可以使用instanceof測(cè)試引用指向?qū)ο蟮膶?shí)際類(lèi)型?!局R(shí)5-5】認(rèn)知Java多繼承與訪(fǎng)問(wèn)成員方法5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【任務(wù)描述】創(chuàng)建外部類(lèi)GoodsOuterClass5_4,在該外部類(lèi)中定義3個(gè)成員變量(商品編碼、商品名稱(chēng)、商品數(shù)量)、2個(gè)構(gòu)造方法、2個(gè)成員方法(displayBaseInfo()方法用于輸出商品基本信息,printOut()方法用于創(chuàng)建內(nèi)部類(lèi)的對(duì)象,并調(diào)用內(nèi)部類(lèi)對(duì)象的成員方法)。在外部類(lèi)的內(nèi)部定義內(nèi)部類(lèi)GoodsInnerClass,在該內(nèi)部類(lèi)方法中定義3個(gè)變量(商品數(shù)量、商品價(jià)格、貨幣單位)、2個(gè)構(gòu)造方法、3個(gè)成員方法(calAmount()方法用于計(jì)算商品總金額,displayAmount()方法用于輸出商品總金額,printVariable()方法用于訪(fǎng)問(wèn)局部變量、內(nèi)部類(lèi)和外部類(lèi)的同名私有成員變量)。創(chuàng)建測(cè)試類(lèi)Test5_4,在該測(cè)試類(lèi)中創(chuàng)建外部類(lèi)的對(duì)象,再通過(guò)外部類(lèi)對(duì)象創(chuàng)建內(nèi)部類(lèi)的對(duì)象,通過(guò)外部類(lèi)的構(gòu)造方法創(chuàng)建非靜態(tài)內(nèi)部類(lèi)對(duì)象,并調(diào)用內(nèi)部類(lèi)對(duì)象的方法。在測(cè)試類(lèi)Test5_4中創(chuàng)建外部類(lèi)的對(duì)象,測(cè)試是否可以通過(guò)內(nèi)部類(lèi)的成員方法printVariable()訪(fǎng)問(wèn)內(nèi)部類(lèi)成員方法的局部變量、外部類(lèi)和內(nèi)部類(lèi)的同名私有成員變量。任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【知識(shí)5-6】定義并使用Java內(nèi)部類(lèi)內(nèi)部類(lèi)的定義有兩種:作為外部類(lèi)的一個(gè)成員來(lái)定義;在外部類(lèi)的方法中定義。外部類(lèi)的成員可以是變量和方法,也可以是一個(gè)類(lèi)。作為外部類(lèi)成員的內(nèi)部類(lèi)與其他外部類(lèi)成員一樣,訪(fǎng)問(wèn)控制修飾符可以為public、protected、private或默認(rèn)值。非靜態(tài)內(nèi)部類(lèi)與外部類(lèi)中的其他非靜態(tài)成員一樣依賴(lài)外部類(lèi)對(duì)象,要在創(chuàng)建外部類(lèi)對(duì)象之后才能創(chuàng)建內(nèi)部類(lèi)對(duì)象。內(nèi)部類(lèi)對(duì)象既可以在外部類(lèi)的成員方法中創(chuàng)建,又可以在外部類(lèi)之外創(chuàng)建。在外部類(lèi)的成員方法中創(chuàng)建內(nèi)部類(lèi)對(duì)象的語(yǔ)法格式與創(chuàng)建外部類(lèi)對(duì)象的語(yǔ)法格式相同。在外部類(lèi)之外創(chuàng)建內(nèi)部類(lèi)對(duì)象的語(yǔ)法格式有以下兩種形式。外部類(lèi)類(lèi)名.內(nèi)部類(lèi)類(lèi)名引用變量=外部類(lèi)對(duì)象引用.new內(nèi)部類(lèi)構(gòu)造方法名();外部類(lèi)類(lèi)名.內(nèi)部類(lèi)類(lèi)名引用變量=new外部類(lèi)構(gòu)造方法名.new內(nèi)部類(lèi)構(gòu)造方法名();假設(shè)外部類(lèi)類(lèi)名為OutClass,內(nèi)部類(lèi)類(lèi)名為InClass,則在外部類(lèi)之外創(chuàng)建內(nèi)部類(lèi)對(duì)象的代碼如下。第一種方法:先創(chuàng)建外部類(lèi)對(duì)象,代碼為OutClassout=newOutClass();;再通過(guò)外部類(lèi)對(duì)象out創(chuàng)建內(nèi)部類(lèi)對(duì)象,代碼為OutClass.InClassin=out.newInClass();。第二種方法:直接創(chuàng)建非靜態(tài)內(nèi)部類(lèi)對(duì)象,代碼為OutClass.InClassin=newOutClass().newInClass();。非靜態(tài)內(nèi)部類(lèi)作為外部類(lèi)的一個(gè)成員,可以訪(fǎng)問(wèn)外部類(lèi)中的所有成員,包括外部類(lèi)中的private成員。在外部類(lèi)的成員也可以訪(fǎng)問(wèn)內(nèi)部類(lèi)的所有成員(包括private成員),但訪(fǎng)問(wèn)之前要?jiǎng)?chuàng)建內(nèi)部類(lèi)對(duì)象。在定義內(nèi)部類(lèi)時(shí),內(nèi)部類(lèi)的類(lèi)名不能與外部類(lèi)的類(lèi)名相同,但內(nèi)部類(lèi)成員的名稱(chēng)可以與外部類(lèi)成員的名稱(chēng)相同。當(dāng)內(nèi)部類(lèi)成員方法中的局部變量、內(nèi)部類(lèi)成員變量、外部類(lèi)成員變量的名稱(chēng)相同時(shí),有效的是局部變量名。內(nèi)部類(lèi)成員變量的訪(fǎng)問(wèn)形式:this.內(nèi)部類(lèi)成員變量名。外部類(lèi)成員變量的訪(fǎng)問(wèn)形式:外部類(lèi)類(lèi)名.this.外部類(lèi)成員變量名。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-5

定義并使用商品顏色枚舉類(lèi)【任務(wù)描述】創(chuàng)建枚舉類(lèi)GoodsColor,該枚舉類(lèi)包括6個(gè)枚舉值:白色、黑色、紫色、藍(lán)色、灰色、紅色。創(chuàng)建類(lèi)GoodsColorEnum5_5,在該類(lèi)的main()方法中定義枚舉類(lèi)型變量并正確賦值,然后輸出枚舉類(lèi)型變量的值。在類(lèi)GoodsColorEnum5_5的main()方法中創(chuàng)建枚舉類(lèi)型的一維數(shù)組,并通過(guò)枚舉類(lèi)中的靜態(tài)方法values()為數(shù)組賦值,然后通過(guò)for語(yǔ)句輸出全部枚舉值,最后使用switch語(yǔ)句判斷商品顏色。任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【知識(shí)5-7】定義并使用Java枚舉類(lèi)定義枚舉類(lèi)的語(yǔ)法格式如下。訪(fǎng)問(wèn)控制修飾符enum枚舉類(lèi)型名稱(chēng){枚舉選項(xiàng)列表}枚舉類(lèi)本質(zhì)上就是類(lèi),使用關(guān)鍵詞enum定義的枚舉類(lèi)型繼承自Enum類(lèi),而不是Object類(lèi),通過(guò)枚舉類(lèi)型對(duì)象可以調(diào)用其繼承的方法。定義枚舉類(lèi)型以后,枚舉類(lèi)型變量的取值只能為相應(yīng)枚舉類(lèi)中定義的值。Enum類(lèi)中的方法publicStringtoString()可以返回枚舉常量的名稱(chēng),靜態(tài)方法values()可以返回包含全部枚舉值的一維數(shù)組。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-6

定義泛型商品類(lèi)【任務(wù)描述】創(chuàng)建泛型類(lèi)GenericClass5_6,聲明類(lèi)型參數(shù)U,使用U定義泛型類(lèi)GenericClass5_6的成員變量、方法的參數(shù)及方法返回值的類(lèi)型。在該類(lèi)中,聲明setUnit()方法用于設(shè)置成員變量的值,聲明getUnit()方法用于返回成員變量的值。創(chuàng)建受限泛型類(lèi)GoodsGenericClass,聲明類(lèi)型參數(shù)N、P、U,并且N和P必須為類(lèi)Number的子類(lèi)。在該類(lèi)中聲明printAmount()方法,用于計(jì)算并輸出商品總金額。在main()方法中聲明泛型類(lèi)GenericClass5_6的第1個(gè)對(duì)象currencyUnit1,U的類(lèi)型為Character;聲明泛型類(lèi)GenericClass5_6的第2個(gè)對(duì)象currencyUnit2,U的類(lèi)型為String;調(diào)用泛型類(lèi)GenericClass5_6的方法輸出相應(yīng)的值。在main()方法中聲明受限泛型類(lèi)的第1個(gè)對(duì)象objGeneric1,N、P、U的類(lèi)型分別為Integer、Double和Character;聲明受限泛型類(lèi)的第2個(gè)對(duì)象objGeneric2,N、P、U的類(lèi)型分別為Integer、Double和String;調(diào)用受限泛型類(lèi)GoodsGenericClass的方法輸出相應(yīng)的值。任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【知識(shí)5-8】Java的泛型Java泛型的本質(zhì)是類(lèi)型參數(shù)化,也就是說(shuō)操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù)。定義泛型類(lèi)或接口時(shí),通過(guò)類(lèi)型參數(shù)來(lái)抽象數(shù)據(jù)類(lèi)型,而不是將變量的類(lèi)型聲明為Object,這樣做的好處是使泛型類(lèi)或接口的類(lèi)型安全檢查在編譯階段進(jìn)行,并且所有的類(lèi)型轉(zhuǎn)換都是自動(dòng)和隱式的,從而保證了類(lèi)型的安全性。1.定義泛型類(lèi)定義泛型類(lèi)的語(yǔ)法格式如下。類(lèi)的訪(fǎng)問(wèn)控制修飾符class類(lèi)名<類(lèi)型參數(shù)>{

類(lèi)體}在泛型類(lèi)的定義中,類(lèi)型參數(shù)的定義寫(xiě)在類(lèi)名后面,并用尖括號(hào)“<>”括起來(lái),類(lèi)型參數(shù)可以使用任何符合Java命名規(guī)則的標(biāo)識(shí)符,但為了方便通常采用單個(gè)大寫(xiě)字母。例如,使用E表示集合元素類(lèi)型,使用K與V分別表示鍵值對(duì)中的鍵類(lèi)型與值類(lèi)型,使用T、U、S表示任意類(lèi)型等。使用泛型類(lèi)可以使程序具有更強(qiáng)的靈活性,通過(guò)定義泛型類(lèi),可以將變量的類(lèi)型看作參數(shù)來(lái)定義,而變量的具體類(lèi)型是在創(chuàng)建泛型類(lèi)的對(duì)象時(shí)確定的。泛型類(lèi)的類(lèi)型參數(shù)可以用來(lái)定義類(lèi)的成員變量、方法的參數(shù)以及方法返回值的類(lèi)型。當(dāng)創(chuàng)建泛型類(lèi)的對(duì)象時(shí),類(lèi)型參數(shù)只能為引用類(lèi)型(如Integer、Character、Double),而不能為基本類(lèi)型(如int、char、double)。任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【知識(shí)5-8】Java的泛型2.定義泛型接口定義泛型接口的語(yǔ)法格式如下。接口的訪(fǎng)問(wèn)控制修飾符interface接口名<類(lèi)型參數(shù)>{

接口體}3.定義受限泛型在定義泛型類(lèi)或泛型接口時(shí),類(lèi)名和接口名后面的類(lèi)型參數(shù)可以為任意類(lèi)型。如果要限制類(lèi)型參數(shù)為某個(gè)子類(lèi)型,則把這種泛型稱(chēng)為受限泛型。在受限泛型中,類(lèi)型參數(shù)的定義如下。類(lèi)型參數(shù)extends父類(lèi)型例如,NextendsNumber表示類(lèi)型參數(shù)N繼承了抽象類(lèi)Number,則在創(chuàng)建泛型類(lèi)的對(duì)象時(shí),N必須為抽象類(lèi)Number的子類(lèi),如Integer,否則會(huì)出現(xiàn)編譯錯(cuò)誤。使用受限泛型有以下優(yōu)點(diǎn):編譯時(shí)的類(lèi)型檢查可以保證類(lèi)型參數(shù)的每次實(shí)例化都符合所設(shè)定的標(biāo)準(zhǔn);因?yàn)轭?lèi)型參數(shù)的每次實(shí)例化都是受限父類(lèi)型或其子類(lèi)型,所以通過(guò)類(lèi)型參數(shù)可以調(diào)用受限父類(lèi)型中的方法。任務(wù)5-4

定義并使用商品內(nèi)部類(lèi)

【知識(shí)5-8】Java的泛型4.泛型類(lèi)的擴(kuò)充Java中,類(lèi)通過(guò)繼承可以實(shí)現(xiàn)類(lèi)的擴(kuò)充,泛型類(lèi)也可以通過(guò)繼承實(shí)現(xiàn)泛型類(lèi)的擴(kuò)充。在泛型類(lèi)的子類(lèi)中可以保留父類(lèi)的類(lèi)型參數(shù),還可以增加新的類(lèi)型參數(shù)。如果在定義子類(lèi)時(shí)沒(méi)有保留父類(lèi)中的類(lèi)型參數(shù),則父類(lèi)中的類(lèi)型參數(shù)的類(lèi)型為Object。5.定義泛型方法與類(lèi)和接口一樣,方法的聲明也可以被泛型化,即在定義方法時(shí)帶有一個(gè)或多個(gè)類(lèi)型參數(shù)。定義泛型方法的語(yǔ)法格式如下。<類(lèi)型參數(shù)>方法返回值類(lèi)型

方法名(參數(shù)列表){

方法體代碼}使用泛型方法可以將方法的參數(shù)以及返回值的類(lèi)型參數(shù)化,在實(shí)際調(diào)用該方法時(shí)再確定其具體類(lèi)型。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-7

應(yīng)用ArrayList類(lèi)及其方法創(chuàng)建手機(jī)品牌集合并遍歷輸出集合中的元素

【任務(wù)描述】創(chuàng)建ArrayList類(lèi)的集合對(duì)象實(shí)現(xiàn)List接口,向該集合中添加5個(gè)手機(jī)品牌元素,并隨機(jī)改變集合中元素的排列順序。輸出手機(jī)品牌集合中的所有元素。逐個(gè)輸出手機(jī)品牌集合中的元素?!局R(shí)5-9】探析Java的集合類(lèi)在Java中,集合類(lèi)和接口共同構(gòu)成了Java集合框架的基礎(chǔ)。Java集合框架主要用于處理對(duì)象的集合,這些集合可以是有序的、無(wú)序的,允許或不允許重復(fù)元素,或者是基于鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)。Java的集合類(lèi)都定義在java.util包中,該包及其子包為Java編程提供了一系列有用的工具。Java集合類(lèi)分為兩種:一種稱(chēng)為集合類(lèi)型(Collection),使用接口Collection描述其操作,其存放的基本單位是單個(gè)對(duì)象,以L(fǎng)ist和集合(Set)為代表;另一種稱(chēng)為映射類(lèi)型(Map),用接口Map描述其操作,其存放的基本單位是鍵值對(duì),映射中存儲(chǔ)的每個(gè)對(duì)象都是通過(guò)一個(gè)鍵(Key)對(duì)象來(lái)獲取一個(gè)值(Value)對(duì)象,鍵的作用相當(dāng)于數(shù)組中的索引,即每個(gè)鍵都是唯一的,可以利用鍵存取數(shù)據(jù)結(jié)構(gòu)中指定位置的數(shù)據(jù)。Java集合框架定義了一系列接口,如Collection、Set、List、Iterator、Map,具體介紹如下。publicinterfaceSetextendsCollectionpublicinterfaceListextendsCollectionpublicinterfaceMappublicinterfaceIterator任務(wù)5-7

應(yīng)用ArrayList類(lèi)及其方法創(chuàng)建手機(jī)品牌集合并遍歷輸出集合中的元素

【知識(shí)5-9】探析Java的集合類(lèi)(1)Collection接口Collection接口定義了一些通用方法,通過(guò)它們可以實(shí)現(xiàn)集合元素的添加、刪除等基本操作,是Set接口和List接口的父接口,通常情況下不直接使用。JDK沒(méi)有提供Collection接口的任何直接實(shí)現(xiàn),而是通過(guò)專(zhuān)門(mén)的子接口實(shí)現(xiàn),如Set接口和List接口。Collection接口中定義的常用方法如表5-23所示。(2)Set接口Set集合包括Set接口及其所有實(shí)現(xiàn)類(lèi),是一種不包含重復(fù)元素的、無(wú)序的集合。Set接口繼承自Collection接口,其擁有Collection接口提供的所有方法。Set集合中的對(duì)象是無(wú)序的,但這種無(wú)序并非完全無(wú)序,只是不像列表那樣按照對(duì)象的插入順序保存對(duì)象。JDK提供了實(shí)現(xiàn)Set接口的多個(gè)類(lèi),包括HashSet類(lèi)和TreeSet類(lèi)。方法名稱(chēng)功能說(shuō)明add(Eobj)將指定對(duì)象添加到集合中remove(Objectobj)將指定對(duì)象從集合中刪除,返回值為boolean型contains(Objectobj)判斷在集合中是否存在指定對(duì)象,返回值為boolean型isEmpty()判斷集合是否為空,返回值為boolean型size()獲取集合中存儲(chǔ)對(duì)象的個(gè)數(shù),返回值為int型clear()移除集合中的所有對(duì)象,即清空該集合iterator()序列化集合中的所有對(duì)象,返回值為Iterator<E>型toArray()獲取一個(gè)包含所有對(duì)象的指定類(lèi)型的數(shù)組equals(Objectobj)判斷指定對(duì)象與該對(duì)象是否為同一個(gè)對(duì)象,返回值為boolean型表5-23

Collection接口中定義的常用方法任務(wù)5-7

應(yīng)用ArrayList類(lèi)及其方法創(chuàng)建手機(jī)品牌集合并遍歷輸出集合中的元素

【知識(shí)5-9】探析Java的集合類(lèi)(3)List接口List接口繼承了Collection接口,除繼承了Collection接口聲明的方法外,還增加了一些按位置存取元素、查找元素、建立List視圖等操作的方法,它是一種可含有重復(fù)元素的、有序的集合,也稱(chēng)為列表或序列。List接口可以控制向列表中插入元素的位置,并可以按元素的插入順序(從0開(kāi)始)來(lái)訪(fǎng)問(wèn)元素。java.util包提供了實(shí)現(xiàn)List接口的ArrayList類(lèi)(向量表)、Vector類(lèi)(向量)和LinkedList類(lèi)。ArrayList類(lèi)用可變大小的數(shù)組實(shí)現(xiàn)List接口,它的對(duì)象會(huì)隨著元素的增多而自動(dòng)擴(kuò)大容量。ArrayList類(lèi)是非同步的,當(dāng)有多個(gè)線(xiàn)程對(duì)它的同一個(gè)對(duì)象并發(fā)訪(fǎng)問(wèn)時(shí),為保證數(shù)據(jù)的一致性,必須通過(guò)synchronized關(guān)鍵詞進(jìn)行同步控制。List接口中定義的常用方法如表5-24所示。方法名稱(chēng)功能說(shuō)明voidadd(intindex,Objectobj)向集合的指定索引位置添加對(duì)象,其他對(duì)象的索引位置相對(duì)后移一位,索引位置從0開(kāi)始abstractbooleanaddAll(intindex,Collectionc)向集合的指定索引位置添加指定集合中的所有對(duì)象Objectremove(intindex)刪除集合中指定索引位置的對(duì)象Objectset(intindex,Objectobj)將集合中指定索引位置的對(duì)象修改為指定的對(duì)象Objectget(intindex)獲得指定索引位置的對(duì)象方法名稱(chēng)功能說(shuō)明intindexOf(Objectobj)獲得指定對(duì)象的索引位置。當(dāng)存在多個(gè)索引位置時(shí),返回第一個(gè)索引位置intlastIndexOf(Objectobj)獲得指定對(duì)象的索引位置。當(dāng)存在多個(gè)索引位置時(shí),返回最后一個(gè)索引位置ListIteratorlistIterator()獲得一個(gè)包含所有對(duì)象的ListIterator型實(shí)例對(duì)象ListIteratorlistIterator(intindex)獲得一個(gè)包含從指定索引位置到最后的ListIterator型實(shí)例對(duì)象ListsubList(intformIndex,inttoIndex通過(guò)截取從起始位置fromIndex(包含)到終止位置toIndex(不包含)的對(duì)象,重新生成并返回一個(gè)列表表5-24

List接口中定義的常用方法任務(wù)5-7

應(yīng)用ArrayList類(lèi)及其方法創(chuàng)建手機(jī)品牌集合并遍歷輸出集合中的元素

【知識(shí)5-9】探析Java的集合類(lèi)(4)Iterator接口JavaCollectionAPI為集合對(duì)象提供了重復(fù)器(Iterator)接口,該接口用來(lái)遍歷集合中的元素。Set接口實(shí)現(xiàn)類(lèi)對(duì)象對(duì)元素的遍歷順序是不確定的,List接口實(shí)現(xiàn)類(lèi)對(duì)象對(duì)元素的遍歷順序是從前往后。(5)Map接口Map接口以鍵值對(duì)的形式存放對(duì)象,實(shí)現(xiàn)鍵到值的映射,其中鍵對(duì)象不可以重復(fù),值對(duì)象可以重復(fù),即每個(gè)鍵只能映射到一個(gè)值上,并按照自身內(nèi)部的排序規(guī)則進(jìn)行排列。Map接口的實(shí)現(xiàn)類(lèi)有HashMap、TreeMap、Hashtable等。Java的集合類(lèi)中定義的方法很多,限于本書(shū)篇幅,這里只列出了一些常用方法,未列出的方法請(qǐng)讀者參考相關(guān)書(shū)籍或網(wǎng)絡(luò)資源。由ArrayList類(lèi)實(shí)現(xiàn)的列表使用數(shù)組結(jié)構(gòu)保存對(duì)象。數(shù)組結(jié)構(gòu)的優(yōu)點(diǎn)是便于對(duì)集合進(jìn)行快速地隨機(jī)訪(fǎng)問(wèn),如果經(jīng)常根據(jù)索引位置訪(fǎng)問(wèn)集合中的對(duì)象,那么它的效率就較高。數(shù)組結(jié)構(gòu)的缺點(diǎn)是向指定索引位置插入對(duì)象和刪除對(duì)象的效率較低,且插入或刪除對(duì)象的索引越小效率就越低,原因是向指定的索引插入對(duì)象時(shí),會(huì)同時(shí)將指定索引位置以及后面的所有對(duì)象向后移動(dòng)。5.1定義并使用Java的抽象類(lèi)5.2定義并使用Java的接口5.4探析Java多繼承的實(shí)現(xiàn)方法學(xué)習(xí)要點(diǎn)5.3定義并使用Java的內(nèi)部類(lèi)5.5定義并使用Java的枚舉類(lèi)5.6探析Java的泛型5.7探析Java的集合應(yīng)用Java的多線(xiàn)程技術(shù)編程5.8任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【任務(wù)描述】開(kāi)啟多個(gè)購(gòu)物線(xiàn)程,保證多個(gè)購(gòu)物頁(yè)面能夠并行購(gòu)買(mǎi)同一種商品。創(chuàng)建一個(gè)類(lèi)GoodsSale,實(shí)現(xiàn)Runnable接口,在類(lèi)GoodsSale中定義2個(gè)成員變量(商品數(shù)量和商品名稱(chēng)),定義2個(gè)構(gòu)造方法(無(wú)參構(gòu)造方法和包含2個(gè)參數(shù)的構(gòu)造方法),重寫(xiě)Runnable接口的run()方法,在該方法中輸出商品庫(kù)存數(shù)量。創(chuàng)建另一個(gè)類(lèi)TestThread5_8,在該類(lèi)的main()方法中定義類(lèi)GoodsSale的對(duì)象objSale,創(chuàng)建Thread類(lèi)的3個(gè)對(duì)象t1、t2和t3,即3個(gè)線(xiàn)程,并將對(duì)象objSale作為參數(shù)傳遞給Thread類(lèi)的構(gòu)造方法,分別啟動(dòng)這3個(gè)線(xiàn)程,模擬購(gòu)物過(guò)程中商品庫(kù)存數(shù)量的變化。任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【知識(shí)5-10】認(rèn)知Java的多線(xiàn)程多任務(wù)操作系統(tǒng)能同時(shí)運(yùn)行多個(gè)進(jìn)程,在【W(wǎng)indows任務(wù)管理器】窗口的“進(jìn)程”選項(xiàng)卡中可以看到Windows操作系統(tǒng)同時(shí)運(yùn)行的多個(gè)進(jìn)程。人們?cè)谝贿呅蕾p美妙的音樂(lè)、一邊安裝圖像處理軟件的同時(shí),可以使用Word編輯文本,這里同時(shí)運(yùn)行了多個(gè)應(yīng)用程序,在【W(wǎng)indows任務(wù)管理器】窗口的【應(yīng)用程序】選項(xiàng)卡中可以看到這些“正在運(yùn)行”的應(yīng)用程序。多進(jìn)程實(shí)際是中央處理器(CentralProcessingUnit,CPU)的分時(shí)機(jī)制,使得每個(gè)進(jìn)程都能循環(huán)獲得自己的CPU時(shí)間片,由于這種機(jī)制的輪換速度非常快,因此所有程序就好像是在同時(shí)運(yùn)行一樣。1.程序、進(jìn)程與線(xiàn)程的關(guān)系程序是一段靜態(tài)代碼,是軟件執(zhí)行的對(duì)象。進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過(guò)程,每一個(gè)進(jìn)程都擁有自己的系統(tǒng)資源、內(nèi)存空間和地址空間,它對(duì)應(yīng)了代碼從加載、執(zhí)行到執(zhí)行完畢的一個(gè)完整過(guò)程,這個(gè)過(guò)程也是進(jìn)程的生命周期。線(xiàn)程是進(jìn)程的基本執(zhí)行單位,是比進(jìn)程更小的執(zhí)行單位,一個(gè)進(jìn)程在執(zhí)行過(guò)程中可以產(chǎn)生多個(gè)線(xiàn)程,形成多個(gè)執(zhí)行流,每個(gè)線(xiàn)程有自身的生命周期,可以負(fù)責(zé)不同的任務(wù)而互不干擾,線(xiàn)程是一個(gè)動(dòng)態(tài)的概念。多線(xiàn)程是實(shí)現(xiàn)并發(fā)和提高系統(tǒng)資源利用率的一種有效手段,Java支持多線(xiàn)程,允許多個(gè)線(xiàn)程同時(shí)處于運(yùn)行狀態(tài),每個(gè)線(xiàn)程執(zhí)行自己的任務(wù)。任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【知識(shí)5-10】認(rèn)知Java的多線(xiàn)程2.線(xiàn)程的生命周期及其狀態(tài)轉(zhuǎn)換線(xiàn)程在創(chuàng)建之后,就開(kāi)始了它的生命周期,一個(gè)線(xiàn)程在其整個(gè)生命周期中可處于不同的狀態(tài),線(xiàn)程在生命周期中有5種狀態(tài):新建(New)、就緒(Ready)、運(yùn)行(Running)、阻塞(Blocked)和終止(Terminated)。Java程序可以控制線(xiàn)程在這5種狀態(tài)之間轉(zhuǎn)換,線(xiàn)程狀態(tài)及狀態(tài)轉(zhuǎn)換說(shuō)明如下。(1)調(diào)用線(xiàn)程類(lèi)的構(gòu)造方法創(chuàng)建線(xiàn)程后,線(xiàn)程處于新建狀態(tài)。(2)線(xiàn)程調(diào)用start()方法后處于就緒狀態(tài)。此時(shí),如果CPU在運(yùn)行其他線(xiàn)程,則線(xiàn)程必須排隊(duì)等待,如果CPU空閑,則線(xiàn)程立即占用CPU并開(kāi)始運(yùn)行。(3)線(xiàn)程獲得CPU后處于運(yùn)行狀態(tài)。(4)運(yùn)行中的線(xiàn)程如果遇到讀寫(xiě)數(shù)據(jù)、調(diào)用sleep()方法或其他阻塞事件,則狀態(tài)轉(zhuǎn)換為阻塞狀態(tài)。(5)如果引起阻塞的事件結(jié)束,如數(shù)據(jù)讀寫(xiě)完畢或sleep()方法設(shè)定的時(shí)間已到,則處于阻塞狀態(tài)的線(xiàn)程回到就緒狀態(tài)。(6)線(xiàn)程遇到異常或線(xiàn)程代碼運(yùn)行完畢,不能繼續(xù)運(yùn)行時(shí),線(xiàn)程處于終止?fàn)顟B(tài)。任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【知識(shí)5-10】認(rèn)知Java的多線(xiàn)程3.Java的線(xiàn)程接口和線(xiàn)程類(lèi)Java應(yīng)用程序中可以定義線(xiàn)程類(lèi)。要使用Runnable接口或Thread類(lèi)定義線(xiàn)程類(lèi),它們都位于java.lang包中。在java.lang包中,Runnable接口定義如下。publicinterfaceRunnable{publicvoidrun();}Runnable接口提供了一種無(wú)須擴(kuò)展Thread類(lèi)就可以創(chuàng)建一個(gè)新線(xiàn)程的方式,從而克服了Java單繼承方式所帶來(lái)的各種限制。Runnable接口中只有一個(gè)方法run()。一個(gè)類(lèi)要實(shí)現(xiàn)Runnable接口,就必須重寫(xiě)run()方法。該方法負(fù)責(zé)完成線(xiàn)程所需執(zhí)行的任務(wù)。線(xiàn)程運(yùn)行后自動(dòng)執(zhí)行run()方法中的代碼,run()方法不需要調(diào)用。在java.lang包中,Thread類(lèi)定義如下。publicclassThreadextendsObjectimplementsRunnable{…privateRunnabletarget;…publicThread(){…}publicThread(Runnabletarget){…}…publicvoidrun(){…}}任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【知識(shí)5-10】認(rèn)知Java的多線(xiàn)程Thread類(lèi)本身實(shí)現(xiàn)了Runnable接口,但僅以空的方法體覆蓋了run()方法。繼承Thread類(lèi)定義線(xiàn)程時(shí),需要重寫(xiě)run()方法,并在run()方法的方法體中編寫(xiě)線(xiàn)程執(zhí)行的代碼。Thread類(lèi)常用的構(gòu)造方法如下。①Thread()。②Thread(Stringname)。③Thread(Runnabletarget)。④Thread(Runnabletarget,Stringname)。Thread類(lèi)常用的成員方法如下。繼承Thread類(lèi)也就繼承了這些方法,線(xiàn)程對(duì)象可以調(diào)用這些方法控制線(xiàn)程的行為。①publicvoidstart():使線(xiàn)程變?yōu)榫途w狀態(tài),占用CPU后運(yùn)行run()方法。②voidsetName(Stringname):設(shè)置線(xiàn)程名。③StringgetName():獲取線(xiàn)程名。④voidsetPriority(intnewPriority):設(shè)置線(xiàn)程優(yōu)先級(jí)。⑤intgetPriority():獲取線(xiàn)程優(yōu)先級(jí)。⑥staticvoidsleep(longmills):線(xiàn)程睡眠的毫秒數(shù)。⑦staticThreadcurrentThread():返回正在運(yùn)行的線(xiàn)程對(duì)象。任務(wù)5-8

應(yīng)用Java的多線(xiàn)程技術(shù)模擬購(gòu)物過(guò)程

【知識(shí)5-10】認(rèn)知Java的多線(xiàn)程4.創(chuàng)建線(xiàn)程對(duì)象創(chuàng)建線(xiàn)程對(duì)象有兩種方法:繼承Thread類(lèi)和實(shí)現(xiàn)Runnable接口。這兩種方法都要用到Thread類(lèi),不同點(diǎn)在于通過(guò)不同的途徑覆蓋run()方法。(1)通過(guò)繼承Thread類(lèi)創(chuàng)建線(xiàn)程對(duì)象①

創(chuàng)建繼承自Thread類(lèi)的線(xiàn)程類(lèi),并重寫(xiě)run()方法,在run()方

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論