




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1.面向?qū)ο缶幊袒A(chǔ)——類學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解類的定義,學(xué)會(huì)類的屬性和方法,類的封裝,掌握面向?qū)ο缶幊痰幕A(chǔ)知識(shí)。通過本節(jié)學(xué)習(xí)可以:掌握類的定義
掌握類的屬性掌握類的封裝掌握類的方法目錄01類的定義03類的封裝02類的屬性04類的方法類是OOP中最基本的概念,類是具有共同屬性和行為的對(duì)象的抽象類可以定義為數(shù)據(jù)和方法的集合類也稱為模板,因?yàn)樗鼈兲峁┝藢?duì)象的基本框架類的概念在Java中,類的定義需遵循以下規(guī)則:如果類是public,則必須和文件名一致。一般一個(gè).java文件中有一個(gè)public類注意:Scala中沒有public,一個(gè).scala中可以寫多個(gè)類。1、回顧:Java類的定義[修飾符]class類名{
類體}說明(1)Scala語法中,類并不聲明為public,所有這些類都具有公有可見性(即默認(rèn)就是public)(2)一個(gè)Scala源文件可以包含多個(gè)類2、基本語法在一個(gè).scala中定義兩個(gè)類:packagecom.test.chapter03//(1)Scala語法中,類并不聲明為public,所有這些類都具有公有可見性(即默認(rèn)就是public)classPerson{}//(2)一個(gè)Scala源文件可以包含多個(gè)類classTeacher{}3、案例實(shí)操1、基本語法[修飾符]var|val屬性名稱[:類型]=屬性值注:Bean屬性(@BeanPropetry),可以自動(dòng)生成規(guī)范的setXxx/getXxx方法屬性是類的一個(gè)組成部分屬性是類的一個(gè)組成部分2、案例實(shí)操Java的封裝操作如下,(1)將屬性進(jìn)行私有化(2)提供一個(gè)公共的set方法,用于對(duì)屬性賦值(3)提供一個(gè)公共的get方法,用于獲取屬性的值封裝就是把抽象出的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其它部分只有通過被授權(quán)的操作(成員方法),才能對(duì)數(shù)據(jù)進(jìn)行操作。Scala中的public屬性,底層實(shí)際為private,并通過get方法(obj.field())和set方法(obj.field_=(value))對(duì)其進(jìn)行操作。所以Scala并不推薦將屬性設(shè)為private,再為其設(shè)置public的get和set方法的做法。但由于很多Java框架都利用反射調(diào)用getXXX和setXXX方法,有時(shí)候?yàn)榱撕瓦@些框架兼容,也會(huì)為Scala的屬性設(shè)置getXXX和setXXX方法(通過@BeanProperty注解實(shí)現(xiàn))。def方法名(參數(shù)列表)[:返回值類型]={方法體}1、基本語法2、實(shí)操案例2.面向?qū)ο缶幊袒A(chǔ)——抽象類前言Scala的抽象類是一種特殊的類,它可以包含未具體實(shí)現(xiàn)的方法和字段。它們的主要用途是為其他類提供一個(gè)基礎(chǔ)框架。本章將對(duì)這部分相關(guān)內(nèi)容進(jìn)行詳細(xì)介紹。Scala抽象類:學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解抽象類的定義,掌握抽象類的用途。通過本節(jié)學(xué)習(xí)可以:掌握抽象類的定義掌握抽象類的使用方式掌握抽象類的用途目錄01抽象類的定義02抽象類的子類實(shí)現(xiàn)03抽象類的用途抽象類的定義Scala的抽象類是一種特殊的類,它可以包含未具體實(shí)現(xiàn)的方法和字段。抽象類的定義使用關(guān)鍵詞abstract。抽象類可以包含:抽象方法(沒有實(shí)現(xiàn)的方法)具體方法(有實(shí)現(xiàn)的方法)字段和屬性即在Scala中一個(gè)被abstract修飾的類,
類中包含沒有實(shí)現(xiàn)的成員,即對(duì)象沒有初始值,定義的方法沒有方法體,則該類就是抽象類。抽象類的子類實(shí)現(xiàn)abstractclassAnimal{defsound:String//抽象方法,子類需要實(shí)現(xiàn)
defeat():Unit={//具體方法
println("Eating...")}}抽象類的子類實(shí)現(xiàn)抽象類的子類必須實(shí)現(xiàn)抽象類中定義的抽象方法,否則子類也將成為抽象類。classDogextendsAnimal{defsound:String="Bark"http://實(shí)現(xiàn)抽象方法}classCatextendsAnimal{defsound:String="Meow"http://實(shí)現(xiàn)抽象方法}抽象類無法直接實(shí)例化抽象類。但可以實(shí)例化實(shí)現(xiàn)了抽象類的子類。valdog=newDog()println(dog.sound)//輸出"Bark"dog.eat()//輸出"Eating..."抽象類的用途抽象類的用途有兩個(gè):1.定義通用的接口和行為,允許邏輯重用。2.強(qiáng)制子類提供特定實(shí)現(xiàn),從而確保某些功能的一致性。3.面向?qū)ο缶幊袒A(chǔ)——多態(tài)Scala語言入門:學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解多態(tài)的定義和類型。通過本節(jié)學(xué)習(xí)可以:掌握多態(tài)的定義
掌握多態(tài)的類型掌握多態(tài)的實(shí)現(xiàn)機(jī)制目錄01多態(tài)的定義02多態(tài)的類型03多態(tài)的實(shí)現(xiàn)機(jī)制多態(tài):多態(tài)的定義多態(tài)的概念多態(tài)(Polymorphic)也稱動(dòng)態(tài)綁定(DynamicBinding)或延遲綁定(LateBinding),指在執(zhí)行期間而非編譯期間確定所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際類型調(diào)用其相應(yīng)的方法,也就是說子類的引用可以賦給父類,程序在運(yùn)行時(shí)根據(jù)實(shí)際類型調(diào)用對(duì)應(yīng)的方法。多態(tài):多態(tài)的類型Scala提供了兩種主要類型的多態(tài):子類型多態(tài)(SubtypePolymorphism):1)子類型多態(tài)是指可以使用父類型的變量來引用子類型的對(duì)象。2)在Scala中,子類型多態(tài)通過繼承和實(shí)現(xiàn)接口來實(shí)現(xiàn)。3)使用子類型多態(tài)時(shí),可以通過父類型的變量來調(diào)用子類型特有的方法。這允許在不知道具體對(duì)象類型的情況下,對(duì)不同類型的對(duì)象進(jìn)行通用操作。參數(shù)多態(tài)(ParametricPolymorphism):1)參數(shù)多態(tài)是指可以使用一個(gè)通用的類型來代表不同類型的參數(shù)。2)在Scala中,參數(shù)多態(tài)通過使用泛型來實(shí)現(xiàn)。泛型允許在定義方法或類時(shí),使用一個(gè)通用的類型來處理不同類型的數(shù)據(jù)。3)這使得開發(fā)者可以在不同的上下文中,使用相同的代碼處理不同類型的數(shù)據(jù)。Scala面向?qū)ο缶幊袒A(chǔ)---多態(tài):多態(tài)的實(shí)現(xiàn)機(jī)制Scala中的多態(tài)主要通過兩種機(jī)制實(shí)現(xiàn):動(dòng)態(tài)綁定:動(dòng)態(tài)綁定也稱為運(yùn)行時(shí)多態(tài)。在運(yùn)行時(shí),程序會(huì)根據(jù)對(duì)象的實(shí)際類型來調(diào)用相應(yīng)的方法。這允許通過父類引用指向子類對(duì)象,然后根據(jù)實(shí)際對(duì)象的類型來調(diào)用方法。類型參數(shù)化:類型參數(shù)化是通過泛型來實(shí)現(xiàn)的。泛型允許在定義方法或類時(shí)指定類型參數(shù),這些參數(shù)在方法或類被調(diào)用或?qū)嵗瘯r(shí)被具體的類型所替代。類型參數(shù)化使得代碼更加通用和靈活,能夠處理不同類型的數(shù)據(jù)。4.面向?qū)ο缶幊袒A(chǔ)——特質(zhì)通過學(xué)習(xí)本節(jié)將能夠了解特質(zhì)定義,掌握特質(zhì)聲明方法,了解和掌握特質(zhì)的基本語法,理解特質(zhì)疊加。通過本節(jié)學(xué)習(xí)可以:理解特質(zhì)含義掌握特質(zhì)聲明方法了解和掌握特質(zhì)的基本語法理解特質(zhì)疊加了解特質(zhì)疊加順序?qū)W習(xí)目標(biāo)目錄01特質(zhì)含義03特質(zhì)基本語法02特質(zhì)聲明04特質(zhì)疊加05特質(zhì)疊加執(zhí)行順序06特質(zhì)自身類型1、簡(jiǎn)介Scala語言中,采用特質(zhì)trait(特征)來代替接口的概念,也就是說,多個(gè)類具有相同的特質(zhì)(特征)時(shí),就可以將這個(gè)特質(zhì)(特征)獨(dú)立出來,采用關(guān)鍵字trait聲明。Scala中的trait中即可以有抽象屬性和方法,也可以有具體的屬性和方法,一個(gè)類可以混入(mixin)多個(gè)特質(zhì)。這種感覺類似于Java中的抽象類。Scala引入trait特征,第一可以替代Java的接口,第二個(gè)也是對(duì)單繼承機(jī)制的一種補(bǔ)充。特質(zhì)2、特質(zhì)聲明基本語法及實(shí)操基本語法trait特質(zhì)名{trait主體}traitPersonTrait{//聲明屬性varname:String=_//聲明方法defeat():Unit={}//抽象屬性varage:Int//抽象方法defsay():Unit}通過查看字節(jié)碼,可以看到特質(zhì)=抽象類+接口特質(zhì)聲明1、特質(zhì)簡(jiǎn)介一個(gè)類具有某種特質(zhì)(特征),就意味著這個(gè)類滿足了這個(gè)特質(zhì)(特征)的所有要素,所以在使用時(shí),也采用了extends關(guān)鍵字,如果有多個(gè)特質(zhì)或存在父類,那么需要采用with關(guān)鍵字連接。特質(zhì)基本語法2、特質(zhì)基本語法沒有父類:class類名extends特質(zhì)1with特質(zhì)2with特質(zhì)3…有父類:class類名extends父類with特質(zhì)1with特質(zhì)2with特質(zhì)3…說明:(1)類和特質(zhì)的關(guān)系:使用繼承的關(guān)系。(2)當(dāng)一個(gè)類去繼承特質(zhì)時(shí),第一個(gè)連接詞是extends,后面是with。(3)如果一個(gè)類在同時(shí)繼承特質(zhì)和父類時(shí),應(yīng)當(dāng)把父類寫在extends后。特質(zhì)基本語法3、特質(zhì)案例實(shí)操(1)特質(zhì)可以同時(shí)擁有抽象方法和具體方法(2)一個(gè)類可以混入(mixin)多個(gè)特質(zhì)(3)所有的Java接口都可以當(dāng)做Scala特質(zhì)使用(4)動(dòng)態(tài)混入:可靈活的擴(kuò)展類的功能動(dòng)態(tài)混入:創(chuàng)建對(duì)象時(shí)混入trait,而無需使類混入該trait如果混入的trait中有未實(shí)現(xiàn)的方法,則需要實(shí)現(xiàn)特質(zhì)基本語法3、特質(zhì)案例實(shí)操traitPersonTrait{//(1)特質(zhì)可以同時(shí)擁有抽象方法和具體方法//聲明屬性varname:String=_//抽象屬性varage:Int//聲明方法defeat():Unit={println("eat")}//抽象方法defsay():Unit}traitSexTrait{varsex:String}//(2)一個(gè)類可以實(shí)現(xiàn)/繼承多個(gè)特質(zhì)//(3)所有的Java接口都可以當(dāng)做Scala特質(zhì)使用classTeacherextendsPersonTraitwithjava.io.Serializable{overridedefsay():Unit={println("say")}overridevarage:Int=_}objectTestTrait{defmain(args:Array[String]):Unit={valteacher=newTeacherteacher.say()teacher.eat()//(4)動(dòng)態(tài)混入:可靈活的擴(kuò)展類的功能valt2=newTeacherwithSexTrait{overridevarsex:String="男"}//調(diào)用混入trait的屬性println(t2.sex)}}特質(zhì)基本語法1、簡(jiǎn)介由于一個(gè)類可以混入(mixin)多個(gè)trait,且trait中可以有具體的屬性和方法,若混入的特質(zhì)中具有相同的方法(方法名,參數(shù)列表,返回值均相同),必然會(huì)出現(xiàn)繼承沖突問題。特質(zhì)疊加1、簡(jiǎn)介沖突分為以下兩種第一種:一個(gè)類(Sub)混入的兩個(gè)trait(TraitA,TraitB)中具有相同的具體方法,且兩個(gè)trait之間沒有任何關(guān)系,解決這類沖突問題,直接在類(Sub)中重寫沖突方法。第二種:一個(gè)類(Sub)混入的兩個(gè)trait(TraitA,TraitB)中具有相同的具體方法,且兩個(gè)trait繼承自相同的trait(TraitC),及所謂的“鉆石問題”,解決這類沖突問題,Scala采用了特質(zhì)疊加的策略。特質(zhì)疊加所謂的特質(zhì)疊加,就是將混入的多個(gè)trait中的沖突方法疊加起來,案例如下:traitBall{defdescribe():String={"ball"}}traitColorextendsBall{overridedefdescribe():String={"blue-"+super.describe()}}traitCategoryextendsBall{overridedefdescribe():String={"foot-"+super.describe()}}classMyBallextendsCategorywithColor{overridedefdescribe():String={"myballisa"+super.describe()}}objectTestTrait{defmain(args:Array[String]):Unit={println(newMyBall().describe())}}結(jié)果如圖所示:特質(zhì)疊加1、特質(zhì)疊加順序思考:上述案例中的super.describe()調(diào)用的是父trait中的方法嗎?當(dāng)一個(gè)類混入多個(gè)特質(zhì)的時(shí)候,scala會(huì)對(duì)所有的特質(zhì)及其父特質(zhì)按照一定的順序進(jìn)行排序,而此案例中super.describe()調(diào)用的實(shí)際上是排好序后的下一個(gè)特質(zhì)中的describe()方法。特質(zhì)疊加順序1、特質(zhì)疊加順序排序規(guī)則如下:特質(zhì)疊加順序結(jié)論:(1)案例中的super,不是表示其父特質(zhì)對(duì)象,而是表示上述疊加順序中的下一個(gè)特質(zhì),即,MyClass中的super指代Color,Color中的super指代Category,Category中的super指代Ball。(2)如果想要調(diào)用某個(gè)指定的混入特質(zhì)中的方法,可以增加約束:super[],例如super[Category].describe()。1、特質(zhì)疊加順序特質(zhì)疊加順序1、特質(zhì)自身類型說明和案例說明:自身類型可實(shí)現(xiàn)依賴注入的功能。classUser(valname:String,valage:Int)traitDao{definsert(user:User)={println("insertintodatabase:"+)}}traitAPP{_:Dao=>deflogin(user:User):Unit={println("login:"+)insert(user)}}objectMyAppextendsAPPwithDao{defmain(args:Array[String]):Unit={login(newUser("bobo",11))}}特質(zhì)自身類型1、特質(zhì)和抽象類的區(qū)別優(yōu)先使用特質(zhì)。一個(gè)類擴(kuò)展多個(gè)特質(zhì)是很方便的,但卻只能擴(kuò)展一個(gè)抽象類。如果你需要構(gòu)造函數(shù)參數(shù),使用抽象類。因?yàn)槌橄箢惪梢远x帶參數(shù)的構(gòu)造函數(shù),而特質(zhì)不行(有無參構(gòu)造)。特質(zhì)自身類型5.面向?qū)ο缶幊袒A(chǔ)——包前言Java語言中使用包來進(jìn)行大型工程代碼的組織,在Scala語言中也是如此,Scala包與Java包有著諸多相似之處,但Scala包提供了更靈活的訪問控制、定義與使用方式。本章將對(duì)這部分相關(guān)內(nèi)容進(jìn)行詳細(xì)介紹。通過學(xué)習(xí)本節(jié)將能夠了解包的定義,掌握包的使用和作用域,掌握包對(duì)象,學(xué)會(huì)import高級(jí)特性。通過本節(jié)學(xué)習(xí)可以:掌握包如何定義掌握包的作用學(xué)習(xí)目標(biāo)目錄01包的定義02包的使用同Java中的包、C++中的命名空間一樣,Scala中的包主要用于大型工程代碼的組織,同時(shí)也解決命名沖突的問題。Scala中的包與Java有著諸多相似之處,但Scala語言中的包更加靈活。下面的代碼給出了Scala包的定義:包的定義圖中左邊是代碼文件結(jié)構(gòu),右邊是編譯生成的字節(jié)碼文件結(jié)構(gòu)圖包的定義可以看出,Scala包的這種組織方式與Java包的組織方式?jīng)]有明顯區(qū)別。不過Scala包組織方式可以更靈活,例如:包的定義上述代碼可以在Scala程序中的任何地方出現(xiàn),它表示在cn.scala.chapter08包中定義了一個(gè)類Teacher,定義完成后可以通過cn.scala.chapter08.Teacher在程序中其他任何地方使用該類。上述代碼保存為Teacher.scala文件,放在Scala源文件的根目錄下,編譯完成如圖:包的定義從上面的代碼不難看出,Scala可以靈活定義包并在該包中定義程序所需的類,幫我們自動(dòng)組織生成的字節(jié)碼文件。將上述Teacher.scala文件內(nèi)容修改如下:包的定義編譯后生成的字節(jié)碼文件結(jié)構(gòu)如圖:包的定義包的定義相信通過前面的例子我們已經(jīng)能夠掌握如何定義Scala包及理解Scala包是如何進(jìn)行代碼組織的。雖然Scala包的定義與代碼組織非常靈活,在程序的任何地方都可以新定義包及在該包中定義程序需要的類,但這種方式會(huì)使代碼非常分散,不便于進(jìn)行代碼集中管理,在實(shí)際使用時(shí)還是推薦使用類似Java包的組織方式。6.面向?qū)ο缶幊袒A(chǔ)——泛型通過學(xué)習(xí)本節(jié)將能夠了解泛型基本語法,理解泛型協(xié)變和逆變含義,掌握泛型的基本使用方法,理解泛型上下限的作用。通過本節(jié)學(xué)習(xí)可以:理解協(xié)變和逆變含義掌握協(xié)變和逆變代碼語法了解泛型上下限作用掌握泛型上下限語法了解掌握上下文限定基本語法學(xué)習(xí)目標(biāo)目錄01泛型03泛型上下限02協(xié)變和逆變04上下文限定1、泛型簡(jiǎn)介Scala泛型與Java泛型基本相同,只是Java泛型語法格式為<>,而Scala泛型使用方括號(hào)[]來接受類型參數(shù)。classStack[A]{privatevarelements:List[A]=Nildefpush(x:A):Unit=elements=x::elementsdefpeek:A=elements.headdefpop():A={valcurrentTop=peekelements=elements.tailcurrentTop}}上面的Stack類的實(shí)現(xiàn)中接受類型參數(shù)A。這表示其內(nèi)部的列表,varelements:List[A]=Nil,只能夠存儲(chǔ)類型A的元素。方法defpush只接受類型A的實(shí)例對(duì)象作為參數(shù)(注意:elements=x::elements將elements放到了一個(gè)將元素x添加到elements的頭部而生成的新列表中)。泛型2、泛型使用要使用一個(gè)泛型類,將一個(gè)具體類型放到方括號(hào)中來代替A。valstack=newStack[Int]stack.push(1)stack.push(2)println(stack.pop)//prints2println(stack.pop)//prints1實(shí)例對(duì)象stack只能接受整型值。然而,如果類型參數(shù)有子類型,子類型可以被傳入:classFruitclassAppleextendsFruitclassBananaextendsFruitvalstack=newStack[Fruit]valapple=newApplevalbanana=newBananastack.push(apple)stack.push(banana)類Apple和類Banana都繼承自類Fruit,所以我們可以把實(shí)例對(duì)象apple和banana壓入棧Fruit中泛型1、逆變與協(xié)變簡(jiǎn)介及其語法協(xié)變ClassMyList[+T]{//協(xié)變}逆變ClassMyList[-T]{//逆變}不變ClassMyList[T]{//不變}型變是復(fù)雜類型的子類型關(guān)系與其組件類型的子類型關(guān)系的相關(guān)性。Scala支持泛型類的類型參數(shù)的型變注釋,允許它們是協(xié)變的,逆變的,或在沒有使用注釋的情況下是不變的。
逆變與協(xié)變2、說明Son是Father的子類,則MyList[Son]也作為MyList[Father]的“子類”協(xié)變Son是Father的子類,則MyList[Father]與MyList[Son]“無父子關(guān)系”不變Son是Father的子類,則MyList[Son]作為MyList[Father]的“父類”逆變逆變與協(xié)變3、實(shí)操//泛型模板//classMyList{}//不變//classMyList[T]{}//協(xié)變//classMyList[+T]{}//逆變//classMyList[-T]{}classParent{}classChildextendsParent{}classSubChildextendsChild{}objectScala_TestGeneric{defmain(args:Array[String]):Unit={//vars:MyList[Child]=newMyList[SubChild]}}逆變與協(xié)變實(shí)操1、泛型上下限簡(jiǎn)介及其語法泛型上限ClassPersonList[T<:Person]{//泛型上限}泛型下限ClassPersonList[T>:Person]{//泛型下限}說明:泛型的上下限的作用是對(duì)傳入的泛型進(jìn)行限定在Scala中,類型參數(shù)和抽象類型都可以有一個(gè)類型邊界約束。這種類型邊界在限制類型變量實(shí)際取值的同時(shí)還能展露類型成員的更多信息。泛型上下限2、實(shí)操classParent{}classChildextendsParent{}classSubChildextendsChild{}objectScala_TestGeneric{defmain(args:Array[String]):Unit={//test(classOf[SubChild])//test[Child](newSubChild)}//泛型通配符之上限//deftest[A<:Child](a:Class[A]):Unit={//println(a)//}//泛型通配符之下限//deftest[A>:Child](a:Class[A]):Unit={//println(a)//}//泛型通配符之下限形式擴(kuò)展deftest[A>:Child](a:A):Unit={println(a.getClass.getName)}}泛型上下限實(shí)操1、上下文限定簡(jiǎn)介及其語法deff[A:B](a:A)=println(a)//等同于deff[A](a:A)(implicitarg:B[A])=println(a)上下文限定是Scala2.8以后引入的一個(gè)新的語法特性,類型變量限定<:描述的是”isa”的關(guān)系,視圖界定<%描述的是”canbeseenas”的關(guān)系,而上下文界定描述的是某種類型”hasa”的關(guān)系。上下文界定的語言格式為T:M,其中M是一個(gè)泛型,這種形式要求存在一個(gè)M[T]類型的隱式值上下文限定2、說明上下文限定是將泛型和隱式轉(zhuǎn)換的結(jié)合產(chǎn)物,以下兩者功能相同,使用上下文限[A:Ordering]之后,方法內(nèi)無法使用隱式參數(shù)名調(diào)用隱式參數(shù),需要通過implicitly[Ordering[A]]獲取隱式變量,如果此時(shí)無法查找到對(duì)應(yīng)類型的隱式變量,會(huì)發(fā)生出錯(cuò)誤。implicitvalx=1valy=implicitly[Int]valz=implicitly[Double]上下文限定3、實(shí)操//定義一個(gè)類型類Ordering[T]traitOrdering[T]{defcompare(x:T,y:T):Int}//定義一個(gè)隱式參數(shù)來提供Ordering[Int]類型的實(shí)現(xiàn)implicitvalintOrdering:Ordering[Int]=newOrdering[Int]{overridedefcompare(x:Int,y:Int):Int=pareTo(y)}//定義一個(gè)泛型函數(shù),使用上下文界定來要求T類型必須有一個(gè)Ordering[T]的隱式參數(shù)defmax[T:Ordering](x:T,y:T):T={valord=implicitly[Ordering[T]]if(pare(x,y)>0)xelsey}//調(diào)用max函數(shù)valresult=max(2,5)println(result)//輸出:5上下文限定7.面向?qū)ο缶幊袒A(chǔ)——模式匹配前言模式匹配是學(xué)習(xí)Scala語言必備的語法技能之一,它靈活的程序結(jié)構(gòu)更符合人腦的思維處理方式,是使用Scala語言進(jìn)行實(shí)際編程的利器。本章將詳細(xì)介紹Scala語言中的模式匹配、模式匹配的7大類型、模式匹配原理、正則表達(dá)式與模式匹配、for循環(huán)中的模式匹配及模式匹配與樣例類、樣例對(duì)象。通過學(xué)習(xí)本節(jié)將能夠了解模式匹配的使用,模式匹配7大類型,模式匹配原理,正則表達(dá)式與模式匹配,for循環(huán)中使用模式匹配,模式匹配與樣例類、樣例對(duì)象。通過本節(jié)學(xué)習(xí)可以:掌握模式匹配的使用掌握可以進(jìn)行模式匹配的7大類型掌握模式匹配原理掌握正則表達(dá)式與模式匹配熟練在for循環(huán)中使用模式匹配熟練模式匹配與樣例類、樣例對(duì)象的使用學(xué)習(xí)目標(biāo)目錄01模式匹配簡(jiǎn)介03模式匹配原理02模式匹配的7大類型04正則表達(dá)式與模式匹配05for循環(huán)中的模式匹配06模式匹配與樣例類、樣例對(duì)象模式匹配是Scala提供的最重要的語言特性,在實(shí)際開發(fā)過程中應(yīng)用非常廣泛,可以說模式匹配在Scala語言中無處不在,如下:在給變量賦值時(shí),上面的賦值語法經(jīng)常會(huì)被使用,但實(shí)際上其背后的原理便是模式匹配。為了弄清楚什么是模式匹配,先來看一下Java語言的switch語句。模式匹配簡(jiǎn)介模式匹配是Scala提供的最重要的語言特性,在實(shí)際開發(fā)過程中應(yīng)用非常廣泛,可以說模式匹配在Scala語言中無處不在,如下:代碼運(yùn)行結(jié)果如下:模式匹配簡(jiǎn)介在Java語言中,case語句后需要加上break語句,如case1:System.out.println("1");break;,如果沒有該break語句,則程序會(huì)意外陷入分支,如case2:System.out.println("2");后沒有break語句的話,執(zhí)行完該語句后還會(huì)接著執(zhí)行case3:System.out.println("3");break;,這可能與實(shí)際程序運(yùn)行要求相去甚遠(yuǎn),而Java開發(fā)人員在實(shí)際編程過程中很容易忽略break語句。Scala語句的模式匹配可以解決這一問題,例如:運(yùn)行結(jié)果如下:模式匹配簡(jiǎn)介可以看到,首先Scala語言中的模式匹配可以有效地避免Javaswitch語句意外陷入另外一個(gè)分支的情況。其次,Scala模式匹配代碼更簡(jiǎn)潔,更符合人腦的思維方式。第三,Scala語言中的模式匹配比Java語言更強(qiáng)大的地方在于模式匹配中的case語句還可以加入表達(dá)式,例如:
運(yùn)行結(jié)果如下:模式匹配簡(jiǎn)介可以看到,casexif(x%2==0)=>println(s"$x能夠被2整除")語句能夠匹配所有能夠被2整除的整數(shù),case語句跟的是一個(gè)變量x,然后緊接著加入表達(dá)式if(x%2==0)判斷變量x能否被2整除,如果能的話,則執(zhí)行后面的語句。Scala模式匹配除了可以在一般程序中使用,還可以作為函數(shù)體,模式匹配結(jié)果作為函數(shù)返回值,如下:
模式匹配簡(jiǎn)介
代碼運(yùn)行結(jié)果如下:可以看到,模式匹配作為函數(shù)patternMatching的函數(shù)體,模式匹配結(jié)果為函數(shù)的返回值,這種使用方式在實(shí)際應(yīng)用中非常普遍。模式匹配簡(jiǎn)介8.多態(tài)Scala語言入門:學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解多態(tài)的使用,掌握多態(tài)如何應(yīng)用在實(shí)際場(chǎng)景中。通過本節(jié)學(xué)習(xí)可以:掌握多態(tài)的案例多態(tài)的案例定義Person類:多態(tài):多態(tài)的實(shí)操案例定義Student和Teacher類:多態(tài):多態(tài)的實(shí)操案例多態(tài):多態(tài)的實(shí)操案例運(yùn)行結(jié)果如下:多態(tài):多態(tài)的實(shí)操案例9.特質(zhì)案例應(yīng)用Scala特質(zhì):學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解特質(zhì)的使用,掌握特質(zhì)如何應(yīng)用在實(shí)際場(chǎng)景中。通過本節(jié)學(xué)習(xí)可以:了解特質(zhì)的使用實(shí)際場(chǎng)景中的使用方式
案例應(yīng)用案例應(yīng)用//定義一個(gè)特質(zhì)
traitLogger{deflog(message:String):Unit//抽象方法
//具體方法,提供默認(rèn)實(shí)現(xiàn)
definfo(msg:String):Unit={log(s"INFO:$msg")}
deferror(msg:String):Unit={log(s"ERROR:$msg")}}案例應(yīng)用//實(shí)現(xiàn)特質(zhì)的類
classConsoleLoggerextendsLogger{deflog(message:String):Unit={println(message)//輸出到控制臺(tái)
}}//另一實(shí)現(xiàn)特質(zhì)的類
classFileLoggerextendsLogger{deflog(message:String):Unit={//假設(shè)這里將示例輸出到文件(實(shí)際操作可用文件I/O實(shí)現(xiàn))
println(s"Loggingtofile:$message")}}案例應(yīng)用objectMainextendsApp{valconsoleLogger=newConsoleLogger()consoleL("Thisisaninformationmessage.")consoleLogger.error("Thisisanerrormessage.")valfileLogger=newFileLogger()fileL("Thismessageisloggedtoafile.")fileLogger.error("Fileerrormessage.")}10.泛型案例應(yīng)用Scala泛型:學(xué)習(xí)目標(biāo)通過學(xué)習(xí)本節(jié)將能夠了解泛型的使用,掌握泛型如何應(yīng)用在實(shí)際場(chǎng)景中。通過本節(jié)學(xué)習(xí)可以:掌握泛型的使用方式實(shí)際場(chǎng)景中的使用方式
案例應(yīng)用Scala泛型:案例應(yīng)用//定義一個(gè)泛型類BoxclassBox[T](varvalue:T){
//設(shè)置值
defsetValue(newValue:T):Unit={value=newValue}//獲取值
defgetValue:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 民宿短租平臺(tái)用戶入住及退房流程管理協(xié)議
- 國際法律顧問團(tuán)隊(duì)派遣服務(wù)協(xié)議
- 專業(yè)美容美發(fā)技術(shù)培訓(xùn)與創(chuàng)業(yè)支持合同
- 互聯(lián)網(wǎng)支付貨幣合規(guī)管理補(bǔ)充協(xié)議
- 藝術(shù)展覽館運(yùn)營與管理委托合同
- 俄羅斯能源輸送管道監(jiān)理與維護(hù)補(bǔ)充協(xié)議
- 電力設(shè)施租賃補(bǔ)充協(xié)議(儲(chǔ)能電站建設(shè))
- 房產(chǎn)抵押貸款與互聯(lián)網(wǎng)金融創(chuàng)新服務(wù)合同
- 快餐連鎖品牌加盟及綠色有機(jī)食材供應(yīng)協(xié)議
- 倉庫租賃補(bǔ)充協(xié)議(含消防)
- 中國低空經(jīng)濟(jì)發(fā)展指數(shù)報(bào)告(2025版)
- 2025年鄉(xiāng)村振興戰(zhàn)略相關(guān)考試試題及答案
- 2024-2025學(xué)年全國版圖知識(shí)競(jìng)賽(小學(xué)組)考試題庫(含答案)
- JJF1033-2023計(jì)量標(biāo)準(zhǔn)考核規(guī)范
- MOOC 營銷管理-電子科技大學(xué) 中國大學(xué)慕課答案
- 語文五年級(jí) 【知識(shí)精講】7.閱讀(2)文言文閱讀
- 社會(huì)心理學(xué)8-人際關(guān)系課件
- QC-R 596-2017高速鐵路板式無砟軌道自密實(shí)混凝土高清-無水印
- 2023高中學(xué)業(yè)水平合格性考試歷史重點(diǎn)知識(shí)點(diǎn)歸納總結(jié)(復(fù)習(xí)必背)
- 鄰補(bǔ)角、對(duì)頂角、同位角、內(nèi)錯(cuò)角、同旁內(nèi)角經(jīng)典習(xí)題-一對(duì)一專用
- 常見病媒生物分類鑒定
評(píng)論
0/150
提交評(píng)論