Scala进阶之路-面向对象编程之类的成员详解
Scala進(jìn)階之路-面向?qū)ο缶幊讨惖某蓡T詳解
作者:尹正杰
版權(quán)聲明:原創(chuàng)作品,謝絕轉(zhuǎn)載!否則將追究法律責(zé)任。
?
?
?
?
一.Scala中的object對(duì)象及apply方法
1>.scala 單例對(duì)象
在Scala中,是沒(méi)有static這個(gè)東西的,但是它也為我們提供了單例模式的實(shí)現(xiàn)方法,那就是使用關(guān)鍵字object。注意:object 對(duì)象是不能帶參數(shù)的。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 1>.在scala中的object是一個(gè)單例對(duì)象,沒(méi)辦法new,因?yàn)樗臉?gòu)造方法被私有化了 10 * 2>.Object中定義的成員變量和方法都是靜態(tài)的 11 * 3>.可以通過(guò)"類名.方法"或者 "對(duì)象名.成員變量" 12 * 13 */ 14 object ScalaStatic { 15 val name:String = "尹正杰" 16 var age:Int = 18 17 18 def sayHello(): Unit ={ 19 println("Hi,I'm yinzhengjie !") 20 } 21 22 //注意:如果調(diào)用者沒(méi)有指定方法,默認(rèn)會(huì)調(diào)用apply方法喲! 23 def apply(habby:String) = { 24 println(s"我的愛(ài)好是:${habby}") 25 } 26 }2>.接下來(lái)我們一起測(cè)試如何訪問(wèn)一個(gè)Object的成員變量和方法,具體代碼如下:
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 def main(args: Array[String]): Unit = { 10 //直接“類名.成員變量”就可以訪問(wèn)非私有的變量 11 var res1 = ScalaStatic.age 12 print(s"res1=====> ${res1}\n") 13 //對(duì)單例模式的類中的非私有成員變量進(jìn)行修改操作,但前提是這個(gè)變量需要用關(guān)鍵字var來(lái)聲明 14 ScalaStatic.age = 26 15 print(s"res1=====> ${res1}\n") 16 17 ScalaStatic.sayHello() 18 19 //如果沒(méi)有指定方法,默認(rèn)會(huì)調(diào)用apply方法喲! 20 ScalaStatic.apply("籃球") 21 ScalaStatic("乒乓球") 22 } 23 }3>.驗(yàn)證Object編譯后文件內(nèi)容
?
二.Scala中類的定義及構(gòu)造器的使用
1>.子定義Scala的Teacher類
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 關(guān)于構(gòu)造器的注意事項(xiàng): 10 * 11 * 1>.在Scala中定義類用class關(guān)鍵字修飾,這個(gè)類名稱后面的構(gòu)造器叫主構(gòu)造器。類的主構(gòu)造器中的屬性會(huì)定義成類的成員變量。一個(gè)類 12 * 只能有一個(gè)主構(gòu)造器,但是可以有多個(gè)輔助構(gòu)造器; 13 * 2>.如果住構(gòu)造器中成員屬性沒(méi)有val或者var修飾的話,該屬性不能被訪問(wèn),相當(dāng)于對(duì)外沒(méi)有提供get方法; 14 * 3>.如果成員屬性使用var修飾的話,相當(dāng)于對(duì)外提供了getter和setter方法; 15 * 4>.如果成員屬性使用val修飾的話,相當(dāng)于對(duì)外只提供了getter方法,因?yàn)関al用于修飾不可變數(shù)據(jù)類型,類似與Java中定義常量的關(guān)鍵字“final”; 16 * 5>.輔助構(gòu)造器是完成賦值操作的,輔助構(gòu)造器是內(nèi)部需要調(diào)用主構(gòu)造器或者其它輔助構(gòu)造器; 17 */ 18 class Teacher(var name:String,val age:Int) { 19 20 //定義sex和blog成員變量,讓其默認(rèn)值為null,我們可以用"_"表示為null。 21 var sex:String = _ 22 var blog:String = _ 23 24 //定義輔助構(gòu)造器一,輔助構(gòu)造器需要調(diào)用主構(gòu)造器 25 def this(name:String,age :Int,sex:String)={ 26 //在輔助構(gòu)造器中必須先調(diào)用主構(gòu)造器 27 this(name,age) 28 this.sex = sex 29 } 30 31 //定義輔助構(gòu)造器二,輔助構(gòu)造器如果不調(diào)用主構(gòu)造器那么必須得調(diào)用其它的輔助構(gòu)造器 32 def this(name:String,age:Int,sex:String,blog:String)={ 33 //調(diào)用其它輔助構(gòu)造器,在上面的一個(gè)輔助構(gòu)造器中調(diào)用了主構(gòu)造器 34 this(name,age,sex) 35 this.blog = blog 36 } 37 38 }2>.使用Scala的單列類調(diào)用自定義Teacher類
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //調(diào)用帶有兩個(gè)參數(shù)的主構(gòu)造器 12 val t1 = new Teacher("尹正杰",18) 13 println(s"姓名:${t1.name},年齡:${t1.age}") 14 15 //調(diào)用帶有3個(gè)參數(shù)的輔助構(gòu)造器 16 val t2 = new Teacher("尹正杰",20,"男") 17 println(s"姓名:${t2.name},年齡:${t2.age},性別:${t2.sex}") 18 19 //調(diào)用帶有4個(gè)參數(shù)的輔助構(gòu)造器 20 val t3 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 21 println(s"姓名:${t3.name},年齡:${t3.age},性別:${t3.sex},博客:${t3.blog}") 22 } 23 } 24 25 26 27 /* 28 以上代碼輸出幾個(gè)如下: 29 姓名:尹正杰,年齡:18 30 姓名:尹正杰,年齡:20,性別:男 31 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 32 */?
三.Scala類的訪問(wèn)權(quán)限
1>.Scala類的構(gòu)造器訪問(wèn)權(quán)限
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 關(guān)于構(gòu)造器的訪問(wèn)權(quán)限: 10 * 在構(gòu)造器前加修飾權(quán)限就可以設(shè)置相應(yīng)的相應(yīng)的訪問(wèn)權(quán)限,如果你想讓主構(gòu)造器私有化,只需要在主構(gòu)造器前加private修飾即可。當(dāng)然這種方法也適用于輔助構(gòu)造器 11 */ 12 class Teacher private (var name:String,val age:Int) { 13 14 //定義sex和blog成員變量,讓其默認(rèn)值為null,我們可以用"_"表示為null。 15 var sex:String = _ 16 var blog:String = _ 17 18 //定義輔助構(gòu)造器一,輔助構(gòu)造器需要調(diào)用主構(gòu)造器,我們想要將這個(gè)輔助構(gòu)造器私有化,只需要在def前面加一個(gè)private修飾符即可。 19 private def this(name:String,age :Int,sex:String)={ 20 //在輔助構(gòu)造器中必須先調(diào)用主構(gòu)造器 21 this(name,age) 22 this.sex = sex 23 } 24 25 //定義輔助構(gòu)造器二,輔助構(gòu)造器如果不調(diào)用主構(gòu)造器那么必須得調(diào)用其它的輔助構(gòu)造器 26 def this(name:String,age:Int,sex:String,blog:String)={ 27 //調(diào)用其它輔助構(gòu)造器,在上面的一個(gè)輔助構(gòu)造器中調(diào)用了主構(gòu)造器 28 this(name,age,sex) 29 this.blog = blog 30 } 31 } 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //調(diào)用帶有4個(gè)參數(shù)的輔助構(gòu)造器 12 val t3 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 13 println(s"姓名:${t3.name},年齡:${t3.age},性別:${t3.sex},博客:${t3.blog}") 14 } 15 } 16 17 18 19 /* 20 以上代碼輸出幾個(gè)如下: 21 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 22 */ Demo.scala 文件內(nèi)容(調(diào)用輔助構(gòu)造方法案例展示)2>.Scala類的成員屬性訪問(wèn)權(quán)限
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 關(guān)于類的成員屬性訪問(wèn)權(quán)限 : 10 * 如果類的主構(gòu)造器中成員變量是private修飾的,它的setter和getter方法都是私有的,外部不能訪問(wèn) 11 */ 12 class Teacher(var name:String,private val age:Int) { 13 14 } 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //調(diào)用帶有4個(gè)參數(shù)的輔助構(gòu)造器 12 val t1 = new Teacher("尹正杰",26) 13 //由于主構(gòu)造方法的age字段被私有化了,因此就沒(méi)法通過(guò)getter或者setter方法訪問(wèn)啦!因此我們只可以訪問(wèn)name字段! 14 println(s"姓名:${t1.name}") 15 } 16 } 17 18 19 20 /* 21 以上代碼輸出幾個(gè)如下: 22 姓名:尹正杰 23 */ Demo.scala 文件內(nèi)容(調(diào)用主構(gòu)造方法案例展示)3>.Scala中的類的訪問(wèn)權(quán)限(可見(jiàn)性)
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 10 * 類的訪問(wèn)權(quán)限 11 * 類的前面加上private[this] 標(biāo)識(shí)這個(gè)類在當(dāng)前包下都可見(jiàn),當(dāng)前包下的子包不可見(jiàn) 12 * 類的前面加上private[包名] 表示這個(gè)類在當(dāng)前包及其子包下都可見(jiàn) 13 */ 14 private[scalaClass] class Teacher(var name:String,val age:Int) { 15 16 //定義sex和blog成員變量,讓其默認(rèn)值為null,我們可以用"_"表示為null。 17 var sex:String = _ 18 var blog:String = _ 19 20 //定義輔助構(gòu)造器一,輔助構(gòu)造器需要調(diào)用主構(gòu)造器,我們想要將這個(gè)輔助構(gòu)造器私有化,只需要在def前面加一個(gè)private修飾符即可。 21 private def this(name:String,age :Int,sex:String)={ 22 //在輔助構(gòu)造器中必須先調(diào)用主構(gòu)造器 23 this(name,age) 24 this.sex = sex 25 } 26 27 //定義輔助構(gòu)造器二,輔助構(gòu)造器如果不調(diào)用主構(gòu)造器那么必須得調(diào)用其它的輔助構(gòu)造器 28 def this(name:String,age:Int,sex:String,blog:String)={ 29 //調(diào)用其它輔助構(gòu)造器,在上面的一個(gè)輔助構(gòu)造器中調(diào)用了主構(gòu)造器 30 this(name,age,sex) 31 this.blog = blog 32 } 33 } 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass.scala 7 8 import cn.org.yinzhengjie.scalaClass.Teacher 9 10 object Demo { 11 12 def main(args: Array[String]): Unit = { 13 //調(diào)用帶有4個(gè)參數(shù)的輔助構(gòu)造器 14 val t1 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 15 println(s"姓名:${t1.name},年齡:${t1.age},性別:${t1.sex},博客:${t1.blog}") 16 } 17 } 18 19 20 21 /* 22 以上代碼輸出幾個(gè)如下: 23 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 24 */ Demo.scala 文件內(nèi)容(調(diào)用輔助構(gòu)造方法案例展示)?
四.Scala中的伴生對(duì)象
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass; 7 8 /** 9 * 關(guān)于構(gòu)造器的注意事項(xiàng): 10 * 1>.在Scala中定義類用class關(guān)鍵字修飾,這個(gè)類名稱后面的構(gòu)造器叫主構(gòu)造器。類的主構(gòu)造器中的屬性會(huì)定義成類的成員變量。一個(gè)類 11 * 只能有一個(gè)主構(gòu)造器,但是可以有多個(gè)輔助構(gòu)造器; 12 * 2>.如果住構(gòu)造器中成員屬性沒(méi)有val或者var修飾的話,該屬性不能被訪問(wèn),相當(dāng)于對(duì)外沒(méi)有提供get方法; 13 * 3>.如果成員屬性使用var修飾的話,相當(dāng)于對(duì)外提供了getter和setter方法; 14 * 4>.如果成員屬性使用val修飾的話,相當(dāng)于對(duì)外只提供了getter方法,因?yàn)関al用于修飾不可變數(shù)據(jù)類型,類似與Java中定義常量的關(guān)鍵字“final”; 15 * 5>.輔助構(gòu)造器是完成賦值操作的,輔助構(gòu)造器是內(nèi)部需要調(diào)用主構(gòu)造器或者其它輔助構(gòu)造器; 16 * 17 * 類的成員屬性訪問(wèn)權(quán)限: 18 * 如果類的主構(gòu)造器中成員屬性是private修飾的,它的set 和 get方法都是私有的,外部不能訪問(wèn) 19 * 20 * 21 * 類的構(gòu)造器訪問(wèn)權(quán)限 22 * 在構(gòu)造器前加修飾權(quán)限 23 * private 在主構(gòu)造器之前,這說(shuō)明該類的主構(gòu)造器是私有的,外部類或者外部對(duì)象不能訪問(wèn) 24 * 也適用于輔助構(gòu)造器 25 * 26 * 類的訪問(wèn)權(quán)限 27 * 類的前面加上private[this] 標(biāo)識(shí)這個(gè)類在當(dāng)前包下都可見(jiàn),當(dāng)前包下的子包不可見(jiàn) 28 * 類的前面加上private[包名] 表示這個(gè)類在當(dāng)前包及其子包下都可見(jiàn) 29 */ 30 private[scalaClass] class Teacher(var name:String,val age:Int) { 31 //定義sex和blog成員變量,讓其默認(rèn)值為null,我們可以用"_"表示為null。 32 var sex:String = _ 33 var blog:String = _ 34 //定義輔助構(gòu)造器一,輔助構(gòu)造器需要調(diào)用主構(gòu)造器,我們想要將這個(gè)輔助構(gòu)造器私有化,只需要在def前面加一個(gè)private修飾符即可。 35 private def this(name:String,age :Int,sex:String)={ 36 //在輔助構(gòu)造器中必須先調(diào)用主構(gòu)造器 37 this(name,age) 38 this.sex = sex 39 } 40 //定義輔助構(gòu)造器二,輔助構(gòu)造器如果不調(diào)用主構(gòu)造器那么必須得調(diào)用其它的輔助構(gòu)造器 41 def this(name:String,age:Int,sex:String,blog:String)={ 42 //調(diào)用其它輔助構(gòu)造器,在上面的一個(gè)輔助構(gòu)造器中調(diào)用了主構(gòu)造器 43 this(name,age,sex) 44 this.blog = blog 45 } 46 } 47 48 /** 49 * 注意:“object Teacher”是“class Teacher”的伴生對(duì)象 50 */ 51 object Teacher{ 52 53 /** 54 * 定義apply方法幫我們創(chuàng)建出“class Teacher”的實(shí)例,如果調(diào)用者在沒(méi)有指明具體方法時(shí),默認(rèn)就會(huì)調(diào)用該方法。 55 */ 56 def apply(name: String, age: Int): Teacher = { 57 // 初始化工作 58 new Teacher(name, age, "男", "http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/") 59 } 60 61 62 def main(args: Array[String]): Unit = { 63 //我們直接調(diào)用伴生對(duì)象的apply方法,當(dāng)然apply方法我們可以省略不寫(xiě)。 64 val t1 = Teacher("尹正杰",18) 65 println(s"姓名:${t1.name},年齡:${t1.age},性別:${t1.sex},博客:${t1.blog}") 66 67 //調(diào)用帶有4個(gè)參數(shù)的輔助構(gòu)造器 68 val t2 = new Teacher("尹正杰",26,"男","https://www.cnblogs.com/yinzhengjie") 69 println(s"姓名:${t2.name},年齡:${t2.age},性別:${t2.sex},博客:${t2.blog}") 70 } 71 } 72 73 74 /* 75 以上代碼執(zhí)行結(jié)果如下 : 76 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 77 */?
五.Scala特質(zhì)Trait使用
1>.Scala特質(zhì)Trait定義使用
? 特質(zhì)(Trait)相當(dāng)于Java中的Interface,只不過(guò)特質(zhì)(Trait)要比Java中的interface要強(qiáng)大的多,因?yàn)樘刭|(zhì)(Trait)可以定義已經(jīng)實(shí)現(xiàn)的方法,也可以定義沒(méi)有實(shí)現(xiàn)的方法。
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 9 /** 10 * Scala的中的接口叫做特質(zhì),關(guān)鍵字為trait。 11 * 在Scala中也沒(méi)有“implements”關(guān)鍵字,只有“extends”關(guān)鍵字 12 * 在Scala特質(zhì)中可以定義有實(shí)現(xiàn)的方法,也可以定義沒(méi)有實(shí)現(xiàn)的方法 13 */ 14 trait ScalaTrait { 15 /** 16 * 定義有實(shí)現(xiàn)的方法 17 */ 18 def sayHello()={ 19 println("I'm Yinzhengjie!") 20 } 21 /** 22 * 定義沒(méi)有實(shí)現(xiàn)的方法 23 */ 24 def playGame(name:String) 25 } ScalaTrait.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 class ScalaTraitImpl extends ScalaTrait { 9 10 /** 11 * 如果特質(zhì)中playGame方法沒(méi)有實(shí)現(xiàn)的話,子類在實(shí)現(xiàn)的時(shí)候可以不加override關(guān)鍵字也可以加 12 */ 13 def playGame(name: String): Unit = { 14 println(s"${name} 正在玩游戲!") 15 } 16 17 /** 18 * 如果特質(zhì)中某個(gè)方法有具體的實(shí)現(xiàn),在子類繼承重寫(xiě)的時(shí)候,必須使用override關(guān)鍵字 19 */ 20 override def sayHello(): Unit = { 21 //我們的重寫(xiě)過(guò)程需要其實(shí)就是調(diào)用父類的方法 22 super.sayHello() 23 } 24 25 } 26 27 /** 28 * 注意:“object ScalaTraitImpl”是“class ScalaTraitImpl”的伴生對(duì)象 29 */ 30 object ScalaTraitImpl{ 31 def main(args: Array[String]): Unit = { 32 val s1 = new ScalaTraitImpl() 33 s1.sayHello() 34 s1.playGame("尹正杰") 35 } 36 } 37 38 39 /* 40 以上代碼執(zhí)行結(jié)果如下: 41 I'm Yinzhengjie! 42 尹正杰 正在玩游戲! 43 */2>.Scala中混入特質(zhì)的兩種方式
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 9 /** 10 * Scala的中的接口叫做特質(zhì),關(guān)鍵字為trait。 11 * 在Scala中也沒(méi)有“implements”關(guān)鍵字,只有“extends”關(guān)鍵字 12 * 在Scala特質(zhì)中可以定義有實(shí)現(xiàn)的方法,也可以定義沒(méi)有實(shí)現(xiàn)的方法 13 */ 14 trait ScalaTrait { 15 /** 16 * 定義有實(shí)現(xiàn)的方法 17 */ 18 def sayHello()={ 19 println("I'm Yinzhengjie!") 20 } 21 /** 22 * 定義沒(méi)有實(shí)現(xiàn)的方法 23 */ 24 def playGame(name:String) 25 } ScalaTrait.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 trait Bird { 9 /** 10 * 定義有實(shí)現(xiàn)的方法 11 */ 12 def fly(name:String): Unit ={ 13 println(s"${name} 正在天上飛......") 14 } 15 /** 16 * 定義沒(méi)有實(shí)現(xiàn)的方法 17 */ 18 def sing() 19 } Bird.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 在定義類時(shí),我們可以用將多個(gè)特質(zhì)混在一起,第一個(gè)特質(zhì)使用extends連接,后續(xù)的特質(zhì)依次使用with連接即可。 10 */ 11 class ScalaTraitImpl extends ScalaTrait with Bird { 12 13 /** 14 * 如果特質(zhì)中playGame方法沒(méi)有實(shí)現(xiàn)的話,子類在實(shí)現(xiàn)的時(shí)候可以不加override關(guān)鍵字也可以加 15 */ 16 def playGame(name: String): Unit = { 17 println(s"${name} 正在玩游戲!") 18 } 19 20 /** 21 * 如果特質(zhì)中某個(gè)方法有具體的實(shí)現(xiàn),在子類繼承重寫(xiě)的時(shí)候,必須使用override關(guān)鍵字 22 */ 23 override def sayHello(): Unit = { 24 //我們的重寫(xiě)過(guò)程需要其實(shí)就是調(diào)用父類的方法 25 super.sayHello() 26 } 27 28 /** 29 * 定義有實(shí)現(xiàn)的方法 30 */ 31 override def fly(name: String): Unit = super.fly(name) 32 33 def sing(): Unit = { 34 println("Sing a song!") 35 } 36 } 37 38 39 /** 40 * 注意:“object ScalaTraitImpl”是“class ScalaTraitImpl”的伴生對(duì)象 41 */ 42 object ScalaTraitImpl{ 43 def main(args: Array[String]): Unit = { 44 /** 45 * 在Scala中可以動(dòng)態(tài)混入N個(gè)特質(zhì),各個(gè)特質(zhì)之間使用關(guān)鍵字with連接即可 46 */ 47 val s1 = new ScalaTraitImpl with Bird with ScalaTrait 48 s1.sayHello() 49 s1.playGame("尹正杰") 50 s1.sing() 51 s1.fly("貓頭鷹") 52 } 53 } 54 55 56 /* 57 以上代碼執(zhí)行結(jié)果如下: 58 I'm Yinzhengjie! 59 尹正杰 正在玩游戲! 60 Sing a song! 61 貓頭鷹 正在天上飛...... 62 */?
六.Scala中得抽象類abstract
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 1>.使用關(guān)鍵字abstract定義一個(gè)抽象類 10 * 2>.抽象類可以具體實(shí)現(xiàn)方法 11 * 3>.也可以有具體實(shí)現(xiàn)的方法 12 */ 13 abstract class AbstractClass { 14 def eat(food:String):String 15 16 def sayHello() = { 17 println("I'm yinzhengjie!") 18 } 19 } AbstractClass.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 trait Teacher { 9 def palyGame(name:String):String 10 11 def teaching(name:String): Unit ={ 12 println(s"${name} 正在教學(xué)生!") 13 } 14 } Teacher.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 9 /** 10 * 1>.在Scala中第一個(gè)繼承抽象類或者特質(zhì),只能使用關(guān)鍵字extends 11 * 2>.如果想繼承多個(gè)獨(dú)特的話,可以在extends之后使用with關(guān)鍵字。 12 */ 13 object AbstractClassImpl extends AbstractClass with Teacher { 14 override def sayHello(): Unit = { 15 super.sayHello() 16 } 17 18 def eat(food: String): String = { 19 "炒著吃" + food 20 } 21 22 override def palyGame(name: String): String = { 23 s"$name 正在打王者榮耀喲......." 24 } 25 26 def main(args: Array[String]): Unit = { 27 AbstractClassImpl.sayHello() 28 val res1 = AbstractClassImpl.eat("臘肉") 29 println(s"res1 =====> ${res1}") 30 } 31 }?
七.Scala中得final和type
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 trait Teacher { 9 10 /** 11 * 使用type關(guān)鍵字定義一個(gè)自定義類型Yinzhengjie,這個(gè)類型并沒(méi)有被確定,而是讓繼承者自己去指定。 12 */ 13 type Yinzhengjie 14 15 final def Bodybuilding(s:Yinzhengjie)={ 16 println(s"${s} 正在健身....") 17 } 18 19 20 def palyGame(name:String):String 21 22 /** 23 * 由于teaching方法被我加了關(guān)鍵字final,因此這個(gè)方法沒(méi)法重寫(xiě)(override)! 24 */ 25 final def teaching(name:String): Unit ={ 26 println(s"${name} 正在教學(xué)生!") 27 } 28 } Teacher.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 1>.使用關(guān)鍵字abstract定義一個(gè)抽象類 10 * 2>.抽象類可以具體實(shí)現(xiàn)方法 11 * 3>.也可以有具體實(shí)現(xiàn)的方法 12 */ 13 abstract class AbstractClass { 14 def eat(food:String):String 15 16 /** 17 * 由于sayHello方法被我加了關(guān)鍵字final,因此這個(gè)方法沒(méi)法重寫(xiě)(override)! 18 */ 19 final def sayHello() = { 20 println("I'm yinzhengjie!") 21 } 22 } AbstractClass.scala 文件內(nèi)容 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 9 /** 10 * final關(guān)鍵字: 11 * 1>.在Scala中,final修飾的類或者方法或者成員變量,不能被重寫(xiě) 12 * 2>.如果使用final關(guān)鍵字修飾類,則該類不能被繼承 13 * 3>.如果使用final關(guān)鍵字修飾方法,則該方法不能被重寫(xiě)(override) 14 * 4>.如果使用final關(guān)鍵字修飾成員變量,則該成員變量不能被重新修改(無(wú)法再次賦值) 15 * type關(guān)鍵字: 16 * 我們可以理解type的功能就是一個(gè)別名。 17 */ 18 final object AbstractClassImpl extends AbstractClass with Teacher { 19 20 /** 21 * 我們?cè)诶^承的時(shí)候,需要指定“Yinzhengjie”的類型,比如我們此處指定其類型為String。 22 */ 23 type Yinzhengjie = String 24 25 def eat(food: String): String = { 26 "炒著吃" + food 27 } 28 29 override def palyGame(name: String): String = { 30 s"$name 正在打王者榮耀喲......." 31 } 32 33 def main(args: Array[String]): Unit = { 34 AbstractClassImpl.sayHello() 35 val res1 = AbstractClassImpl.eat("臘肉") 36 println(s"res1 =====> ${res1}") 37 AbstractClassImpl.Bodybuilding("尹正杰") 38 39 } 40 } 41 42 43 /* 44 以上代碼執(zhí)行結(jié)果如下: 45 I'm yinzhengjie! 46 res1 =====> 炒著吃臘肉 47 尹正杰 正在健身.... 48 */?
八.Scala中樣例類和樣例對(duì)象
樣例類是特殊類,經(jīng)過(guò)了優(yōu)化處理,經(jīng)常用于模式匹配。好處是內(nèi)置實(shí)現(xiàn)了眾多scala常用的功能,比如serializable、compare、apply、unapply
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.scalaClass 7 8 /** 9 * 樣例類: 10 * 1>.在類前加關(guān)鍵字case就是一個(gè)樣例類 11 * 2>.它支持模式匹配,默認(rèn)實(shí)現(xiàn)了Serializable接口 12 * 3>.具體格式為:case class Message(屬性......) 13 * 14 * 定義變量規(guī)則: 15 * 1>.類名的定義首字母大寫(xiě)推薦使用駝峰式; 16 * 2>.屬性名稱第一個(gè)字母小寫(xiě); 17 * 一個(gè)標(biāo)準(zhǔn)的命名規(guī)則是一個(gè)資深開(kāi)發(fā)的基礎(chǔ)。 18 */ 19 case class Message(name:String,countent:String) { 20 21 } 22 23 24 /** 25 * 樣例對(duì)象: 26 * 1>.用于模式匹配 27 * 2>.樣例對(duì)象不能封裝數(shù)據(jù) 28 * 3>.樣例對(duì)象格式:case opject 對(duì)象名 29 */ 30 case object MonitorServer 31 32 object CaseDemo{ 33 def main(args: Array[String]): Unit = { 34 val message = new Message("楊冪","今天晚上要拍戲......") 35 println(message.name) 36 println(message.countent) 37 } 38 } 39 40 /* 41 以上代碼輸出結(jié)果如下 : 42 楊冪 43 今天晚上要拍戲...... 44 */?
九.Scala中得模式匹配---match case
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.function 7 8 object People { 9 10 val (name,age) = ("尹正杰",26) 11 12 def sayHello(): Unit ={ 13 println("I'm yinzhengjie!") 14 } 15 16 def init(): String ={ 17 s"姓名:$name,年齡:${age}" 18 } 19 } People.scala 文件內(nèi)容(自定義類) 1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Scala%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/ 4 EMAIL:y1053419035@qq.com 5 */ 6 package cn.org.yinzhengjie.function 7 8 import java.awt.Color 9 10 11 /** 12 * 模式匹配 match case 13 * 一旦一個(gè)case 匹配上了,就不會(huì)再往下匹配了 14 */ 15 object PatternMatching { 16 def main(args: Array[String]): Unit={ 17 matchingConstant(Color.orange) 18 contentMatch("yinzhengjie") 19 typeMatch(2018) 20 typeMatch(true) 21 arrayMatch(Array(8)) 22 listMatch(1::2::3::Nil) 23 tupleMatch((0, 1)) 24 objMatch(1,2) 25 objMatch(People) 26 } 27 /** 28 * 匹配對(duì)象 29 */ 30 def objMatch(obj: Any) = { 31 val res = obj match { 32 case (x, y) =>s"$x $y" 33 case Int => "int" 34 case People => People.init() 35 case _ => "匹配失敗!" 36 } 37 println(res) 38 } 39 /** 40 * 匹配元組 41 */ 42 def tupleMatch(tuple: Any) = { 43 val res = tuple match{ 44 case (0, _) => "元組的第一個(gè)元素為0, 第二個(gè)元素為任意類型的數(shù)據(jù),且只有2個(gè)元素" 45 case (a, b, c) => "擁有三個(gè)元素的元組" 46 case (_, "98K + 八倍鏡") => "[98K + 八倍鏡] 套裝" 47 case _ => "匹配失敗!" 48 } 49 println(res) 50 } 51 /** 52 * 匹配List 53 */ 54 def listMatch(list: Any) = { 55 val res = list match{ 56 case 0::Nil => "只有一個(gè)0元素的List" 57 case 7::9::Nil => "只有7和9元素的List" 58 case x::y::z::Nil => "只有三個(gè)元素的List" 59 case m::n if n.length > 0 => "------" // 擁有head,和 tail的數(shù)組, “if n.length > 0” 是守衛(wèi)條件 60 case _ => "匹配失敗!" 61 } 62 println(res) 63 } 64 /** 65 * 匹配Array 66 */ 67 def arrayMatch(arr: Any) = { 68 val res = arr match { 69 case Array(0) => "只有一個(gè)0元素的數(shù)組" 70 case Array(0, _) => "以0開(kāi)頭的,擁有2個(gè)元素的數(shù)組" 71 case Array(1, _, 3) => "已1開(kāi)頭,3結(jié)尾,中間為任意元素的三個(gè)元素的數(shù)組" 72 case Array(8, _*) => "已8開(kāi)頭,N個(gè)元素的數(shù)組" // _*標(biāo)識(shí)0個(gè)或者多個(gè)任意類型的數(shù)據(jù) 73 case _ => "匹配失敗!" 74 } 75 println(res) 76 } 77 /** 78 * 匹配數(shù)據(jù)類型 79 */ 80 def typeMatch(tp: Any) = { 81 val res = tp match{ 82 case x: Int => s"Int $x" 83 case y: Long => s"Long $y" 84 case z: Boolean => s"boolean $z" 85 case _ => "匹配失敗!" 86 } 87 println(res) 88 } 89 /** 90 * 匹配字符串內(nèi)容 91 */ 92 def contentMatch(str: String) = { 93 val res = str match{ 94 case "yinzhengjie" => "尹正杰" 95 case "Python" => "Python" 96 case "Golang" => "Golang" 97 case "Java" => "Java" 98 case "2018" => "2018" 99 case _ => "匹配失敗!" // "_"用于任意內(nèi)容 100 } 101 println(res) 102 } 103 /** 104 * 匹配常量 + 守衛(wèi)條件 105 * 擴(kuò)展常量問(wèn)題:大寫(xiě)會(huì)識(shí)別成常量,小寫(xiě)是變量,如果讓小寫(xiě)也是常量,使用``標(biāo)出 106 */ 107 def matchingConstant(color: Color)={ 108 val res = color match { 109 case Color.RED => "紅色" //case Color.RED 匹配結(jié)果為 "紅色",下面兩行代碼類似。 110 case Color.GREEN => "綠色" 111 case Color.yellow => "黃色" 112 case _ if color == Color.orange => "恭喜你,中獎(jiǎng)了!" //這里定義的就是守衛(wèi)條件。 113 case _ => "匹配失敗!" //case _ 表示匹配任意類型。換句話說(shuō),這里定義的是默認(rèn)匹配情況,即上面的3中匹配均無(wú)效。 114 } 115 println(res) 116 } 117 } 118 119 120 121 /* 122 以上代碼執(zhí)行結(jié)果如下 : 123 恭喜你,中獎(jiǎng)了! 124 尹正杰 125 Int 2018 126 boolean true 127 已8開(kāi)頭,N個(gè)元素的數(shù)組 128 只有三個(gè)元素的List 129 元組的第一個(gè)元素為0, 第二個(gè)元素為任意類型的數(shù)據(jù),且只有2個(gè)元素 130 1 2 131 姓名:尹正杰,年齡:26 132 */?
十.密封樣例類
? 必須將樣例子類和父類定義在一個(gè)scala文件中。
//必須將樣例子類和父類定義在一個(gè)scala文件中。 sealed abstract class Dog case class Jing8(var name:String) extends Dog case class HaShiQi(var name:String) extends Dog?
轉(zhuǎn)載于:https://www.cnblogs.com/yinzhengjie/p/9365342.html
總結(jié)
以上是生活随笔為你收集整理的Scala进阶之路-面向对象编程之类的成员详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux常用基础命令操作收集
- 下一篇: webapi 返回类型