Scala從入門到小工|02

類class

Scala中類的定義跟Java很相似,類是由屬和方法組成喘沿,同樣可以使用new的方式創(chuàng)建對象實例,進而調(diào)用類中定義好的方法與屬性。下面就是一個簡單的Scala類

class People {

  // 屬性的定義: val/var 名稱:類型 =  值
  var name:String = _  // _ 占位符  前提是一定要明確是什么數(shù)據(jù)類型
  var age:Int = 3

  // 私有屬性舅桩,外部不能直接調(diào)用
  private var gender = "M"

  // 定義方法
  def playBasketball(team:String) = {
    println(name + " is playing basketball of " + team)
  }

  def drink() = {
    name + " is drinking..."
  }
}


# 主方法中調(diào)用
def main(args: Array[String]): Unit = {
    val people = new People   // 實例化一個Class對象
    people.name = "周琦"  // 為對象賦值
    people.age = 30

//    people.gender  無法調(diào)用

    println(people.name + " : " + people.age )

    people.playBasketball("China")
    println(people.drink())  
  }
}

但是Scala中類的構(gòu)造器與Java完全不一樣,主要分為主構(gòu)造器和附屬構(gòu)造器凫岖。代碼示例如下:

/**
  * 主構(gòu)造器 類名(參數(shù)名:參數(shù)類型)
  * 如果你想在外面調(diào)用Person的name和age必須在之前加val或者var,默認(rèn)是私有的
  */
class Person(val name:String,val age:Int){
  println("進入Person主構(gòu)造器")

  var job:String = _  // _ 占位符  前提是一定要明確是什么數(shù)據(jù)類型
  val sex="男"

  /**
    * 附屬構(gòu)造器的名稱 this
    * 每個附屬構(gòu)造器的第一行必須調(diào)用主構(gòu)造器或者其他的附屬構(gòu)造器
    */
  def this(name:String,age:Int,job:String){
    this(name,age)
    this.job=job
  }

  println("執(zhí)行完P(guān)erson主構(gòu)造器")
}

無論你調(diào)用哪個構(gòu)造器來創(chuàng)造類實例江咳,一定會將類從頭到尾執(zhí)行一遍。同樣的子類創(chuàng)建時也會執(zhí)行父類主構(gòu)造器哥放。

/**
  * override是子類重寫父類中的屬性或者方法的修飾符
  * new 子類會調(diào)用父類的構(gòu)造
  * 子類構(gòu)造器只能在父類主構(gòu)造器上添加屬性
  */
class Student(name:String,age:Int,val major:String) extends Person(name,age){
  println("進入Student構(gòu)造器")

  override val sex="女"

  override def toString: String = {
      this.name+"\t"+this.age+"\t"+this.job+"\t"+this.sex+"\t"+this.major
  }

  println("執(zhí)行完Student構(gòu)造器")
}

抽象類

/**
  * 抽象類:
  * 1) 類中有一個或者多個方法/屬性的定義歼指,沒有實現(xiàn)
  * 2) 抽象類是不能直接new
  * 3) 使用時要有完全實現(xiàn)了抽象方法/屬性的子類才行
  * 4) 子類重寫父類方法或者屬性時不一定需要override
  */
object AbstractClassApp {

  def main(args: Array[String]): Unit = {
    val people = new People
    people.speak
    println(people.sum(1))
  }

}

abstract class action {
  def speak

  val word: String
  val a=1
  def sum(a:Int)=a+1
}

class People extends action {
  def speak: Unit = {
    println(word)
  }

  override val word: String = "hello"
}

對象Object

  • Object可以擁有屬性和方法,且默認(rèn)都是"static"類型甥雕,可以直接用object名直接調(diào)用屬性和方法踩身。
  • Object里的main函數(shù)式應(yīng)用程序的入口。

伴生對象和伴生類

object ApplyApp {

  def main(args: Array[String]): Unit = {
    val apply = ApplyTest()  //調(diào)用得是object的apply
    val test = new ApplyTest
    test()  //調(diào)用的是class的apply
  }

  /**
    * object是class的伴生對象
    * class是object的伴生類
    * 類名()=>object apply
    * 對象名()=>class apply
    */
  object ApplyTest{
    println("進入object ApplyTest")
    val name="name"

    def test()={
      println("test")
    }

    def apply(): Unit ={
      println("object apply")
      new ApplyTest
    }
    println("退出object ApplyTest")
  }

  class ApplyTest{
    def apply(): Unit ={
      println("class apply")
    }
  }
}

Trait

Scala的Trait相當(dāng)于Java里的Interface社露,但Trait不僅可以定義函數(shù)挟阻,還可以有函數(shù)體實現(xiàn)。實現(xiàn)關(guān)鍵詞是extends峭弟,實現(xiàn)多個Trait用with附鸽。當(dāng)extends的多個Trait里有相同函數(shù)時,子類必須重寫該函數(shù)瞒瘸。

  • 父trait里無函數(shù)體的函數(shù)坷备,子類必須override
  • 重寫父類里有函數(shù)體的函數(shù),必須有關(guān)鍵詞override
  • trait里的變量情臭,都是val類型
  • 在trait里定義的的變量省撑,必須是val類型赌蔑,如果變量沒初始化,子類必須override
  • 建議看看Spark源碼的Logging

case class/case object

  • case class必須要有參數(shù)列表竟秫,case object必須不能加參數(shù)列表
  • class 和 case class的區(qū)別:
    case class重寫了toString娃惯,equals,hashCode
    case class默認(rèn)實現(xiàn)了序列化
    case class不用new
object CaseClassApp {
  def main(args: Array[String]): Unit = {
    println(Dog("旺財").name)
  }
}
case class Dog(name:String)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肥败,一起剝皮案震驚了整個濱河市趾浅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馒稍,老刑警劉巖潮孽,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異筷黔,居然都是意外死亡往史,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門佛舱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椎例,“玉大人,你說我怎么就攤上這事请祖《┩幔” “怎么了?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵肆捕,是天一觀的道長刷晋。 經(jīng)常有香客問我,道長慎陵,這世上最難降的妖魔是什么眼虱? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮席纽,結(jié)果婚禮上捏悬,老公的妹妹穿的比我還像新娘。我一直安慰自己润梯,他們只是感情好过牙,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纺铭,像睡著了一般寇钉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舶赔,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天扫倡,我揣著相機與錄音,去河邊找鬼顿痪。 笑死镊辕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚁袭。 我是一名探鬼主播征懈,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼揩悄!你這毒婦竟也來了卖哎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤删性,失蹤者是張志新(化名)和其女友劉穎亏娜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹬挺,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡维贺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巴帮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯泣。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖榕茧,靈堂內(nèi)的尸體忽然破棺而出垃沦,到底是詐尸還是另有隱情,我是刑警寧澤用押,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布肢簿,位于F島的核電站,受9級特大地震影響蜻拨,放射性物質(zhì)發(fā)生泄漏池充。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一缎讼、第九天 我趴在偏房一處隱蔽的房頂上張望纵菌。 院中可真熱鬧,春花似錦休涤、人聲如沸咱圆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽序苏。三九已至,卻和暖如春捷凄,著一層夾襖步出監(jiān)牢的瞬間忱详,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工跺涤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匈睁,地道東北人监透。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像航唆,于是被迫代替她去往敵國和親胀蛮。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容