Scala入門之面向對象

/**
  * 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
相關文章
相關標籤/搜索