Scala进阶之路-面向对象编程之类的成员详解
Scala進階之路-面向對象編程之類的成員詳解
作者:尹正杰
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
?
?
?
?
一.Scala中的object對象及apply方法
1>.scala 單例對象
在Scala中,是沒有static這個東西的,但是它也為我們提供了單例模式的實現方法,那就是使用關鍵字object。注意: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 /** 9 * 1>.在scala中的object是一個單例對象,沒辦法new,因為它的構造方法被私有化了 10 * 2>.Object中定義的成員變量和方法都是靜態的 11 * 3>.可以通過"類名.方法"或者 "對象名.成員變量" 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 //注意:如果調用者沒有指定方法,默認會調用apply方法喲! 23 def apply(habby:String) = { 24 println(s"我的愛好是:${habby}") 25 } 26 }2>.接下來我們一起測試如何訪問一個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 //直接“類名.成員變量”就可以訪問非私有的變量 11 var res1 = ScalaStatic.age 12 print(s"res1=====> ${res1}\n") 13 //對單例模式的類中的非私有成員變量進行修改操作,但前提是這個變量需要用關鍵字var來聲明 14 ScalaStatic.age = 26 15 print(s"res1=====> ${res1}\n") 16 17 ScalaStatic.sayHello() 18 19 //如果沒有指定方法,默認會調用apply方法喲! 20 ScalaStatic.apply("籃球") 21 ScalaStatic("乒乓球") 22 } 23 }3>.驗證Object編譯后文件內容
?
二.Scala中類的定義及構造器的使用
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 * 關于構造器的注意事項: 10 * 11 * 1>.在Scala中定義類用class關鍵字修飾,這個類名稱后面的構造器叫主構造器。類的主構造器中的屬性會定義成類的成員變量。一個類 12 * 只能有一個主構造器,但是可以有多個輔助構造器; 13 * 2>.如果住構造器中成員屬性沒有val或者var修飾的話,該屬性不能被訪問,相當于對外沒有提供get方法; 14 * 3>.如果成員屬性使用var修飾的話,相當于對外提供了getter和setter方法; 15 * 4>.如果成員屬性使用val修飾的話,相當于對外只提供了getter方法,因為val用于修飾不可變數據類型,類似與Java中定義常量的關鍵字“final”; 16 * 5>.輔助構造器是完成賦值操作的,輔助構造器是內部需要調用主構造器或者其它輔助構造器; 17 */ 18 class Teacher(var name:String,val age:Int) { 19 20 //定義sex和blog成員變量,讓其默認值為null,我們可以用"_"表示為null。 21 var sex:String = _ 22 var blog:String = _ 23 24 //定義輔助構造器一,輔助構造器需要調用主構造器 25 def this(name:String,age :Int,sex:String)={ 26 //在輔助構造器中必須先調用主構造器 27 this(name,age) 28 this.sex = sex 29 } 30 31 //定義輔助構造器二,輔助構造器如果不調用主構造器那么必須得調用其它的輔助構造器 32 def this(name:String,age:Int,sex:String,blog:String)={ 33 //調用其它輔助構造器,在上面的一個輔助構造器中調用了主構造器 34 this(name,age,sex) 35 this.blog = blog 36 } 37 38 }2>.使用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 object Demo { 9 10 def main(args: Array[String]): Unit = { 11 //調用帶有兩個參數的主構造器 12 val t1 = new Teacher("尹正杰",18) 13 println(s"姓名:${t1.name},年齡:${t1.age}") 14 15 //調用帶有3個參數的輔助構造器 16 val t2 = new Teacher("尹正杰",20,"男") 17 println(s"姓名:${t2.name},年齡:${t2.age},性別:${t2.sex}") 18 19 //調用帶有4個參數的輔助構造器 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 以上代碼輸出幾個如下: 29 姓名:尹正杰,年齡:18 30 姓名:尹正杰,年齡:20,性別:男 31 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 32 */?
三.Scala類的訪問權限
1>.Scala類的構造器訪問權限
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 * 在構造器前加修飾權限就可以設置相應的相應的訪問權限,如果你想讓主構造器私有化,只需要在主構造器前加private修飾即可。當然這種方法也適用于輔助構造器 11 */ 12 class Teacher private (var name:String,val age:Int) { 13 14 //定義sex和blog成員變量,讓其默認值為null,我們可以用"_"表示為null。 15 var sex:String = _ 16 var blog:String = _ 17 18 //定義輔助構造器一,輔助構造器需要調用主構造器,我們想要將這個輔助構造器私有化,只需要在def前面加一個private修飾符即可。 19 private def this(name:String,age :Int,sex:String)={ 20 //在輔助構造器中必須先調用主構造器 21 this(name,age) 22 this.sex = sex 23 } 24 25 //定義輔助構造器二,輔助構造器如果不調用主構造器那么必須得調用其它的輔助構造器 26 def this(name:String,age:Int,sex:String,blog:String)={ 27 //調用其它輔助構造器,在上面的一個輔助構造器中調用了主構造器 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 //調用帶有4個參數的輔助構造器 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 以上代碼輸出幾個如下: 21 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 22 */ Demo.scala 文件內容(調用輔助構造方法案例展示)2>.Scala類的成員屬性訪問權限
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 * 如果類的主構造器中成員變量是private修飾的,它的setter和getter方法都是私有的,外部不能訪問 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 //調用帶有4個參數的輔助構造器 12 val t1 = new Teacher("尹正杰",26) 13 //由于主構造方法的age字段被私有化了,因此就沒法通過getter或者setter方法訪問啦!因此我們只可以訪問name字段! 14 println(s"姓名:${t1.name}") 15 } 16 } 17 18 19 20 /* 21 以上代碼輸出幾個如下: 22 姓名:尹正杰 23 */ Demo.scala 文件內容(調用主構造方法案例展示)3>.Scala中的類的訪問權限(可見性)
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 * 類的訪問權限 11 * 類的前面加上private[this] 標識這個類在當前包下都可見,當前包下的子包不可見 12 * 類的前面加上private[包名] 表示這個類在當前包及其子包下都可見 13 */ 14 private[scalaClass] class Teacher(var name:String,val age:Int) { 15 16 //定義sex和blog成員變量,讓其默認值為null,我們可以用"_"表示為null。 17 var sex:String = _ 18 var blog:String = _ 19 20 //定義輔助構造器一,輔助構造器需要調用主構造器,我們想要將這個輔助構造器私有化,只需要在def前面加一個private修飾符即可。 21 private def this(name:String,age :Int,sex:String)={ 22 //在輔助構造器中必須先調用主構造器 23 this(name,age) 24 this.sex = sex 25 } 26 27 //定義輔助構造器二,輔助構造器如果不調用主構造器那么必須得調用其它的輔助構造器 28 def this(name:String,age:Int,sex:String,blog:String)={ 29 //調用其它輔助構造器,在上面的一個輔助構造器中調用了主構造器 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 //調用帶有4個參數的輔助構造器 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 以上代碼輸出幾個如下: 23 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 24 */ Demo.scala 文件內容(調用輔助構造方法案例展示)?
四.Scala中的伴生對象
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中定義類用class關鍵字修飾,這個類名稱后面的構造器叫主構造器。類的主構造器中的屬性會定義成類的成員變量。一個類 11 * 只能有一個主構造器,但是可以有多個輔助構造器; 12 * 2>.如果住構造器中成員屬性沒有val或者var修飾的話,該屬性不能被訪問,相當于對外沒有提供get方法; 13 * 3>.如果成員屬性使用var修飾的話,相當于對外提供了getter和setter方法; 14 * 4>.如果成員屬性使用val修飾的話,相當于對外只提供了getter方法,因為val用于修飾不可變數據類型,類似與Java中定義常量的關鍵字“final”; 15 * 5>.輔助構造器是完成賦值操作的,輔助構造器是內部需要調用主構造器或者其它輔助構造器; 16 * 17 * 類的成員屬性訪問權限: 18 * 如果類的主構造器中成員屬性是private修飾的,它的set 和 get方法都是私有的,外部不能訪問 19 * 20 * 21 * 類的構造器訪問權限 22 * 在構造器前加修飾權限 23 * private 在主構造器之前,這說明該類的主構造器是私有的,外部類或者外部對象不能訪問 24 * 也適用于輔助構造器 25 * 26 * 類的訪問權限 27 * 類的前面加上private[this] 標識這個類在當前包下都可見,當前包下的子包不可見 28 * 類的前面加上private[包名] 表示這個類在當前包及其子包下都可見 29 */ 30 private[scalaClass] class Teacher(var name:String,val age:Int) { 31 //定義sex和blog成員變量,讓其默認值為null,我們可以用"_"表示為null。 32 var sex:String = _ 33 var blog:String = _ 34 //定義輔助構造器一,輔助構造器需要調用主構造器,我們想要將這個輔助構造器私有化,只需要在def前面加一個private修飾符即可。 35 private def this(name:String,age :Int,sex:String)={ 36 //在輔助構造器中必須先調用主構造器 37 this(name,age) 38 this.sex = sex 39 } 40 //定義輔助構造器二,輔助構造器如果不調用主構造器那么必須得調用其它的輔助構造器 41 def this(name:String,age:Int,sex:String,blog:String)={ 42 //調用其它輔助構造器,在上面的一個輔助構造器中調用了主構造器 43 this(name,age,sex) 44 this.blog = blog 45 } 46 } 47 48 /** 49 * 注意:“object Teacher”是“class Teacher”的伴生對象 50 */ 51 object Teacher{ 52 53 /** 54 * 定義apply方法幫我們創建出“class Teacher”的實例,如果調用者在沒有指明具體方法時,默認就會調用該方法。 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 //我們直接調用伴生對象的apply方法,當然apply方法我們可以省略不寫。 64 val t1 = Teacher("尹正杰",18) 65 println(s"姓名:${t1.name},年齡:${t1.age},性別:${t1.sex},博客:${t1.blog}") 66 67 //調用帶有4個參數的輔助構造器 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 以上代碼執行結果如下 : 76 姓名:尹正杰,年齡:26,性別:男,博客:https://www.cnblogs.com/yinzhengjie 77 */?
五.Scala特質Trait使用
1>.Scala特質Trait定義使用
? 特質(Trait)相當于Java中的Interface,只不過特質(Trait)要比Java中的interface要強大的多,因為特質(Trait)可以定義已經實現的方法,也可以定義沒有實現的方法。
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的中的接口叫做特質,關鍵字為trait。 11 * 在Scala中也沒有“implements”關鍵字,只有“extends”關鍵字 12 * 在Scala特質中可以定義有實現的方法,也可以定義沒有實現的方法 13 */ 14 trait ScalaTrait { 15 /** 16 * 定義有實現的方法 17 */ 18 def sayHello()={ 19 println("I'm Yinzhengjie!") 20 } 21 /** 22 * 定義沒有實現的方法 23 */ 24 def playGame(name:String) 25 } ScalaTrait.scala 文件內容 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 * 如果特質中playGame方法沒有實現的話,子類在實現的時候可以不加override關鍵字也可以加 12 */ 13 def playGame(name: String): Unit = { 14 println(s"${name} 正在玩游戲!") 15 } 16 17 /** 18 * 如果特質中某個方法有具體的實現,在子類繼承重寫的時候,必須使用override關鍵字 19 */ 20 override def sayHello(): Unit = { 21 //我們的重寫過程需要其實就是調用父類的方法 22 super.sayHello() 23 } 24 25 } 26 27 /** 28 * 注意:“object ScalaTraitImpl”是“class ScalaTraitImpl”的伴生對象 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 以上代碼執行結果如下: 41 I'm Yinzhengjie! 42 尹正杰 正在玩游戲! 43 */2>.Scala中混入特質的兩種方式
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的中的接口叫做特質,關鍵字為trait。 11 * 在Scala中也沒有“implements”關鍵字,只有“extends”關鍵字 12 * 在Scala特質中可以定義有實現的方法,也可以定義沒有實現的方法 13 */ 14 trait ScalaTrait { 15 /** 16 * 定義有實現的方法 17 */ 18 def sayHello()={ 19 println("I'm Yinzhengjie!") 20 } 21 /** 22 * 定義沒有實現的方法 23 */ 24 def playGame(name:String) 25 } ScalaTrait.scala 文件內容 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 * 定義有實現的方法 11 */ 12 def fly(name:String): Unit ={ 13 println(s"${name} 正在天上飛......") 14 } 15 /** 16 * 定義沒有實現的方法 17 */ 18 def sing() 19 } Bird.scala 文件內容 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 * 在定義類時,我們可以用將多個特質混在一起,第一個特質使用extends連接,后續的特質依次使用with連接即可。 10 */ 11 class ScalaTraitImpl extends ScalaTrait with Bird { 12 13 /** 14 * 如果特質中playGame方法沒有實現的話,子類在實現的時候可以不加override關鍵字也可以加 15 */ 16 def playGame(name: String): Unit = { 17 println(s"${name} 正在玩游戲!") 18 } 19 20 /** 21 * 如果特質中某個方法有具體的實現,在子類繼承重寫的時候,必須使用override關鍵字 22 */ 23 override def sayHello(): Unit = { 24 //我們的重寫過程需要其實就是調用父類的方法 25 super.sayHello() 26 } 27 28 /** 29 * 定義有實現的方法 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”的伴生對象 41 */ 42 object ScalaTraitImpl{ 43 def main(args: Array[String]): Unit = { 44 /** 45 * 在Scala中可以動態混入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 以上代碼執行結果如下: 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>.使用關鍵字abstract定義一個抽象類 10 * 2>.抽象類可以具體實現方法 11 * 3>.也可以有具體實現的方法 12 */ 13 abstract class AbstractClass { 14 def eat(food:String):String 15 16 def sayHello() = { 17 println("I'm yinzhengjie!") 18 } 19 } AbstractClass.scala 文件內容 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} 正在教學生!") 13 } 14 } Teacher.scala 文件內容 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中第一個繼承抽象類或者特質,只能使用關鍵字extends 11 * 2>.如果想繼承多個獨特的話,可以在extends之后使用with關鍵字。 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關鍵字定義一個自定義類型Yinzhengjie,這個類型并沒有被確定,而是讓繼承者自己去指定。 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方法被我加了關鍵字final,因此這個方法沒法重寫(override)! 24 */ 25 final def teaching(name:String): Unit ={ 26 println(s"${name} 正在教學生!") 27 } 28 } Teacher.scala 文件內容 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>.使用關鍵字abstract定義一個抽象類 10 * 2>.抽象類可以具體實現方法 11 * 3>.也可以有具體實現的方法 12 */ 13 abstract class AbstractClass { 14 def eat(food:String):String 15 16 /** 17 * 由于sayHello方法被我加了關鍵字final,因此這個方法沒法重寫(override)! 18 */ 19 final def sayHello() = { 20 println("I'm yinzhengjie!") 21 } 22 } AbstractClass.scala 文件內容 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關鍵字: 11 * 1>.在Scala中,final修飾的類或者方法或者成員變量,不能被重寫 12 * 2>.如果使用final關鍵字修飾類,則該類不能被繼承 13 * 3>.如果使用final關鍵字修飾方法,則該方法不能被重寫(override) 14 * 4>.如果使用final關鍵字修飾成員變量,則該成員變量不能被重新修改(無法再次賦值) 15 * type關鍵字: 16 * 我們可以理解type的功能就是一個別名。 17 */ 18 final object AbstractClassImpl extends AbstractClass with Teacher { 19 20 /** 21 * 我們在繼承的時候,需要指定“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 以上代碼執行結果如下: 45 I'm yinzhengjie! 46 res1 =====> 炒著吃臘肉 47 尹正杰 正在健身.... 48 */?
八.Scala中樣例類和樣例對象
樣例類是特殊類,經過了優化處理,經常用于模式匹配。好處是內置實現了眾多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>.在類前加關鍵字case就是一個樣例類 11 * 2>.它支持模式匹配,默認實現了Serializable接口 12 * 3>.具體格式為:case class Message(屬性......) 13 * 14 * 定義變量規則: 15 * 1>.類名的定義首字母大寫推薦使用駝峰式; 16 * 2>.屬性名稱第一個字母小寫; 17 * 一個標準的命名規則是一個資深開發的基礎。 18 */ 19 case class Message(name:String,countent:String) { 20 21 } 22 23 24 /** 25 * 樣例對象: 26 * 1>.用于模式匹配 27 * 2>.樣例對象不能封裝數據 28 * 3>.樣例對象格式:case opject 對象名 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 以上代碼輸出結果如下 : 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 文件內容(自定義類) 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 * 一旦一個case 匹配上了,就不會再往下匹配了 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 * 匹配對象 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, _) => "元組的第一個元素為0, 第二個元素為任意類型的數據,且只有2個元素" 45 case (a, b, c) => "擁有三個元素的元組" 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 => "只有一個0元素的List" 57 case 7::9::Nil => "只有7和9元素的List" 58 case x::y::z::Nil => "只有三個元素的List" 59 case m::n if n.length > 0 => "------" // 擁有head,和 tail的數組, “if n.length > 0” 是守衛條件 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) => "只有一個0元素的數組" 70 case Array(0, _) => "以0開頭的,擁有2個元素的數組" 71 case Array(1, _, 3) => "已1開頭,3結尾,中間為任意元素的三個元素的數組" 72 case Array(8, _*) => "已8開頭,N個元素的數組" // _*標識0個或者多個任意類型的數據 73 case _ => "匹配失敗!" 74 } 75 println(res) 76 } 77 /** 78 * 匹配數據類型 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 * 匹配字符串內容 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 _ => "匹配失敗!" // "_"用于任意內容 100 } 101 println(res) 102 } 103 /** 104 * 匹配常量 + 守衛條件 105 * 擴展常量問題:大寫會識別成常量,小寫是變量,如果讓小寫也是常量,使用``標出 106 */ 107 def matchingConstant(color: Color)={ 108 val res = color match { 109 case Color.RED => "紅色" //case Color.RED 匹配結果為 "紅色",下面兩行代碼類似。 110 case Color.GREEN => "綠色" 111 case Color.yellow => "黃色" 112 case _ if color == Color.orange => "恭喜你,中獎了!" //這里定義的就是守衛條件。 113 case _ => "匹配失敗!" //case _ 表示匹配任意類型。換句話說,這里定義的是默認匹配情況,即上面的3中匹配均無效。 114 } 115 println(res) 116 } 117 } 118 119 120 121 /* 122 以上代碼執行結果如下 : 123 恭喜你,中獎了! 124 尹正杰 125 Int 2018 126 boolean true 127 已8開頭,N個元素的數組 128 只有三個元素的List 129 元組的第一個元素為0, 第二個元素為任意類型的數據,且只有2個元素 130 1 2 131 姓名:尹正杰,年齡:26 132 */?
十.密封樣例類
? 必須將樣例子類和父類定義在一個scala文件中。
//必須將樣例子類和父類定義在一個scala文件中。 sealed abstract class Dog case class Jing8(var name:String) extends Dog case class HaShiQi(var name:String) extends Dog?
轉載于:https://www.cnblogs.com/yinzhengjie/p/9365342.html
總結
以上是生活随笔為你收集整理的Scala进阶之路-面向对象编程之类的成员详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux常用基础命令操作收集
- 下一篇: MySQL中删除重复数据