/** * Created by Administrator on 2018/9/27. * 在Scala中的Object是一個單例對象,沒辦法new * object中定義的成員變量和方法都是靜態的 */ object ScalaStatic { val name: String = "liyitian" var age: Int = 22 def saySomething(msg: String) = { println(msg) } def apply(food: String) = { println("米飯 " + food) } }
調用objectapp
object TestMain { def main(args: Array[String]): Unit = { println(ScalaStatic.name) ScalaStatic.age = 18 println(ScalaStatic.age) ScalaStatic.saySomething("你好") ScalaStatic.apply("西紅柿") ScalaStatic("雞蛋") //語法糖 suger } }
輸出ide
liyitian
18
你好
米飯 西紅柿
米飯 雞蛋this
/** * Created by Administrator on 2018/9/27. * 在Scala中定義類用class關鍵字修飾 * 這個類默認有一個空參構造器 * 定義在類名稱後面的構造器叫主構造器 * 類的主構造器中的屬性會定義成類的成員變量 * 若是主構造器中的成員屬性沒有val|var修飾的話,該屬性不能被訪問,至關於對外沒有提供get方法 * 若是成員屬性使用var修飾的話,至關於對外提供了get和set方法 * 若是成員屬性使用val修飾的話,至關於對外提供了get方法 */ class Teacher(var name: String,val age: Int) { var sex: String = _ var prov: String = _ //定義個輔助構造器,def this() def this(name: String,age: Int,sex: String) = { //在輔助構造器中必須先調用主構造器 this(name,age) this.sex = sex } def this(name: String,age: Int,sex: String,prov: String) = { this(name,age,sex) //在上面一個構造器中調用了主構造器 this.prov = prov } }
object TestApp extends App{ private val techer = new Teacher("每天",23) techer.name = "花花" println(techer.name,techer.age) private val teacher1 = new Teacher("大大",45,"男","湖南") println(teacher1.name,teacher1.age,teacher1.sex,teacher1.prov) }
輸出scala
(花花,23)
(大大,45,男,湖南)對象
/** * Created by Administrator on 2018/9/27. * 在Scala中定義類用class關鍵字修飾 * 這個類默認有一個空參構造器 * 定義在類名稱後面的構造器叫主構造器 * 類的主構造器中的屬性會定義成類的成員變量 * 若是主構造器中的成員屬性沒有val|var修飾的話,該屬性不能被訪問,至關於對外沒有提供get方法 * 若是成員屬性使用var修飾的話,至關於對外提供了get和set方法 * 若是成員屬性使用val修飾的話,至關於對外提供了get方法 * 類的構造器訪問權限,在構造器前加修飾權限 * private在主構造器以前,這說明該類的主構造器是私有的,外部類或者外部對象不能訪問 * 也適用於輔助構造器 */ class Teacher private (var name: String,val age: Int) { var sex: String = _ var prov: String = _ //定義個輔助構造器,def this() def this(name: String,age: Int,sex: String) = { //在輔助構造器中必須先調用主構造器 this(name,age) this.sex = sex } private def this(name: String,age: Int,sex: String,prov: String) = { this(name,age,sex) //在上面一個構造器中調用了主構造器 this.prov = prov } }
object TestApp extends App{ // private val techer = new Teacher("每天",23) // techer.name = "花花" // println(techer.name,techer.age) //此時只能訪問3參數的構造器 private val teacher1 = new Teacher("大大",45,"男") println(teacher1.name,teacher1.age,teacher1.sex) }
輸出繼承
(大大,45,男)接口
/** * Created by Administrator on 2018/9/27. * 在Scala中定義類用class關鍵字修飾 * 這個類默認有一個空參構造器 * 定義在類名稱後面的構造器叫主構造器 * 類的主構造器中的屬性會定義成類的成員變量 * 若是主構造器中的成員屬性沒有val|var修飾的話,該屬性不能被訪問,至關於對外沒有提供get方法 * 若是成員屬性使用var修飾的話,至關於對外提供了get和set方法 * 若是成員屬性使用val修飾的話,至關於對外提供了get方法 * 類的構造器訪問權限,在構造器前加修飾權限 * private在主構造器以前,這說明該類的主構造器是私有的,外部類或者外部對象不能訪問 * 也適用於輔助構造器 * 類的成員屬性訪問權限,若是類的主構造器中成員屬性是private修飾的,它的set和get方法是私有的,外部不能訪問 */ class Teacher (private var name: String,val age: Int) { var sex: String = _ var prov: String = _ //定義個輔助構造器,def this() def this(name: String,age: Int,sex: String) = { //在輔助構造器中必須先調用主構造器 this(name,age) this.sex = sex } private def this(name: String,age: Int,sex: String,prov: String) = { this(name,age,sex) //在上面一個構造器中調用了主構造器 this.prov = prov } }
package test /** * Created by Administrator on 2018/9/27. * 在Scala中定義類用class關鍵字修飾 * 這個類默認有一個空參構造器 * 定義在類名稱後面的構造器叫主構造器 * 類的主構造器中的屬性會定義成類的成員變量 * 若是主構造器中的成員屬性沒有val|var修飾的話,該屬性不能被訪問,至關於對外沒有提供get方法 * 若是成員屬性使用var修飾的話,至關於對外提供了get和set方法 * 若是成員屬性使用val修飾的話,至關於對外提供了get方法 * 類的構造器訪問權限,在構造器前加修飾權限 * private在主構造器以前,這說明該類的主構造器是私有的,外部類或者外部對象不能訪問 * 也適用於輔助構造器 * 類的成員屬性訪問權限,若是類的主構造器中成員屬性是private修飾的,它的set和get方法是私有的,外部不能訪問 * 類的訪問權限,類的前面加上private[this]標識這個類在當前包下均可見,當前包下的子包不可見 * 類的前面加上private[包名]表示這個類在當前包及其子包下均可見 */ private[test] class Teacher (var name: String,val age: Int) { var sex: String = _ var prov: String = _ //定義個輔助構造器,def this() def this(name: String,age: Int,sex: String) = { //在輔助構造器中必須先調用主構造器 this(name,age) this.sex = sex } private def this(name: String,age: Int,sex: String,prov: String) = { this(name,age,sex) //在上面一個構造器中調用了主構造器 this.prov = prov } }
package test /** * Created by Administrator on 2018/9/27. * 在Scala中定義類用class關鍵字修飾 * 這個類默認有一個空參構造器 * 定義在類名稱後面的構造器叫主構造器 * 類的主構造器中的屬性會定義成類的成員變量 * 若是主構造器中的成員屬性沒有val|var修飾的話,該屬性不能被訪問,至關於對外沒有提供get方法 * 若是成員屬性使用var修飾的話,至關於對外提供了get和set方法 * 若是成員屬性使用val修飾的話,至關於對外提供了get方法 * 類的構造器訪問權限,在構造器前加修飾權限 * private在主構造器以前,這說明該類的主構造器是私有的,外部類或者外部對象不能訪問 * 也適用於輔助構造器 * 類的成員屬性訪問權限,若是類的主構造器中成員屬性是private修飾的,它的set和get方法是私有的,外部不能訪問 * 類的訪問權限,類的前面加上private[this]標識這個類在當前包下均可見,當前包下的子包不可見 * 類的前面加上private[包名]表示這個類在當前包及其子包下均可見 */ private[test] class Teacher (private var name: String,val age: Int) { var sex: String = _ var prov: String = _ //定義個輔助構造器,def this() def this(name: String,age: Int,sex: String) = { //在輔助構造器中必須先調用主構造器 this(name,age) this.sex = sex } private def this(name: String,age: Int,sex: String,prov: String) = { this(name,age,sex) //在上面一個構造器中調用了主構造器 this.prov = prov } } /**object Teacher叫類的伴生對象 * 在伴生對象中能夠訪問類的私有成員方法和屬性 */ object Teacher { def apply(name: String,age: Int): Teacher = { //初始化工做 new Teacher(name,age,"女","山東") } def main(args: Array[String]): Unit = { val teacher = new Teacher("大海",33) println(teacher.name) val halen = Teacher("海倫",23) println(halen.sex,halen.prov) } }
輸出:get
大海
(女,山東)it
/** * Created by Administrator on 2018/9/28. * 特質(interface) * 在Scala中特質能夠定義有實現的方法,也能夠定義沒有實現的方法 */ trait ScalaTrait { //沒有任何實現的方法 def hello(name: String) def small(name: String) = { println(s"對$name 笑") } }
object ScalaTraitImpl extends ScalaTrait{ override def hello(name: String): Unit = { println(s"hello $name") } def main(args: Array[String]): Unit = { ScalaTraitImpl.hello("hanmeini") ScalaTraitImpl.small("haoga") } }
trait ScalaTrait { def hello(name: String) = { println(s"$name") } def small(name: String) = { println(s"對$name 笑") } }
trait Fly { def fly(name: String) ={ println(s"$name 在飛") } }
class Student { } object Person { def main(args: Array[String]): Unit = { /** * 在scala中能夠動態混入N個特質 */ val student = new Student with ScalaTrait with Fly student.hello("大東") student.fly("牛牛") } }
輸出:class
大東
牛牛 在飛
object ScalaTraitImpl extends ScalaTrait with Fly{ override def hello(name: String): Unit = { println(s"hello $name") } def main(args: Array[String]): Unit = { ScalaTraitImpl.hello("hanmeini") ScalaTraitImpl.small("haoga") ScalaTraitImpl.fly("liuda") } }
輸出:
hello hanmeini
對haoga 笑
liuda 在飛
/** * Created by Administrator on 2018/9/28. * 使用abstract定義一個抽象類 * 能夠沒有具體實現的方法 * 也能夠有具體實現的方法 */ abstract class AbsClass { def eat(food: String): String def swimming(style: String) = { println(s"$style 遊") } }
/** * Created by Administrator on 2018/9/28. * 在scala中第一個繼承抽象類或者特質,只能使用關鍵字extends * 若是想繼承多個特質的話,能夠在extends以後使用with關鍵字 */ object AbsClassImpl extends AbsClass with Fly{ override def eat(food: String): String = { s"$food 炸着吃" } def main(args: Array[String]): Unit = { println(AbsClassImpl.eat("牛雜")) AbsClassImpl.swimming("自由") AbsClassImpl.fly("高斯") } }
輸出:
牛雜 炸着吃
自由 遊
高斯 在飛
/** * Created by Administrator on 2018/9/28. * 在scala中,final修飾的類不能被繼承 * 方法不能被重寫 * 成員變量不能被從新修改(賦值) */ trait Fly { final def fly(name: String) ={ println(s"$name 在飛") } }
type
scala> type S = String
defined type alias S
scala> val name: S = "gak"
name: S = gak
trait Bird { type T def learn(s: T) ={ println(s) } }
object FireBird extends Bird{ override type T = String def main(args: Array[String]): Unit = { FireBird.learn("火鳥") WaterBird.learn(34) } } object WaterBird extends Bird { override type T = Int }
輸出
火鳥
34
/** * Created by Administrator on 2018/9/28. * 支持模式匹配,默認實現了Serializable接口 * 樣例類:case class 類名(屬性...) */ case class Message(sender: String,messageContent: String) /** * 默認實現了Serializable接口 * 樣例對象:case object 對象名 * 模式匹配 * 樣例對象不能封裝數據 */ case object CheckHeartBeat