Scala學(xué)習(xí)筆記(五) 抽象類以及類中的一些語法糖

1. 抽象類

Scala 的抽象類跟Java的一樣侦镇,不能被實(shí)例化资锰。

1.1抽象字段

抽象類中谆棱,變量不使用就無需初始化,可以等到子類繼承時(shí)再進(jìn)行初始化拯田。

scala> abstract class Animal {
     |    val name:String // 抽象字段历造,沒有帶初始值
     | }
defined class Animal

scala> class Bull extends Animal {
     |   val name = "bull"
     | }
defined class Bull

scala> class Bull2 extends Animal {
     |   override val name = "bull2" // 加上override更符合標(biāo)準(zhǔn)
     | }
defined class Bull2

1.2抽象方法

在抽象類中,抽象方法無需使用(也不能)用abstract進(jìn)行修飾船庇。

一個(gè)方法只要是沒有它的實(shí)現(xiàn)(沒有等號(hào)或沒有方法體)吭产,它就是抽象的,在子類中覆寫或者覆寫接口中的非抽象方法(方法有具體實(shí)現(xiàn))要使用override關(guān)鍵字鸭轮。

scala> abstract class Teacher{
     |    var name:String
     |    var age:String
     |    def teach
     | }
defined class Teacher

scala> class TeacherForMath extends Teacher {
     |    var name = "Tony"
     |    var age = "30"
     |    override def teach = println("teaching Math")
     | }
defined class TeacherForMath

scala> val teacher = new TeacherForMath()
teacher: TeacherForMath = TeacherForMath@27ddd392

scala> teacher.teach
teaching Math

1.3抽象類型

Scala 中的類型成員也可以是抽象的臣淤。
比如,在Trait中窃爷,你可以讓類型成員保持抽象邑蒋。

scala> trait Foo {
     |   type T;
     |   val x:T;
     |   def getX:T = x
     | }
defined trait Foo

scala> (new Foo{type T = Int; val x = 123}).getX
res0: Int = 123

scala> (new Foo{type T = String;val x = "hello tony"}).getX
res1: String = hello tony 

2. 類中的apply()

在 Scala 的類中,apply() 可以看作是一個(gè)語法糖按厘,它分為兩種方式:object和class中的用法医吊。

2.1 常見的 apply() 用法

借用一個(gè)經(jīng)典的例子。

scala> class Foo{}
defined class Foo

scala> object FooMaker {
     |   def apply() = new Foo
     | }
defined object FooMaker

scala> val newFoo = FooMaker()
newFoo: Foo = Foo@39ba5a14

在調(diào)用 FooMaker() 時(shí)逮京,觸發(fā)了apply()卿堂,所以生成了一個(gè)新的Foo對(duì)象。

再來看一個(gè)例子。

scala> class Bar {
     |   def apply() = println("this is bar")
     | }
defined class Bar

scala> val bar = new Bar
bar: Bar = Bar@59e84876

scala> println(bar())
this is bar
()

scala> bar()
this is bar

這次是在調(diào)用bar()時(shí)草描,觸發(fā)了apply()览绿,打印了this is bar

由此,可以總結(jié):

  • object類是單例穗慕,不能進(jìn)行new的實(shí)例化饿敲。在調(diào)用類名()時(shí),便會(huì)觸發(fā)調(diào)用該object中的apply()逛绵。如果object類中沒有apply()诀蓉,這樣調(diào)用會(huì)報(bào)錯(cuò)。
scala> object FooMarker2 {
     |   def apply2() = new Foo
     | }
defined object FooMarker2

scala> val newFoo2 = FooMarker2()
<console>:13: error: FooMarker2.type does not take parameters
       val newFoo2 = FooMarker2()
                               ^
  • 在類中暑脆,創(chuàng)建 val bar = new Bar 之后,調(diào)用 bar() 便會(huì)觸發(fā)該類的apply()狐肢。同樣添吗,class中沒有定義apply(),這樣調(diào)用也是會(huì)報(bào)錯(cuò)的份名。
scala> class Bar2 {
     |   def apply2() = println("this is bar2")
     | }
defined class Bar2

scala> val bar2 = new Bar2
bar2: Bar2 = Bar2@7f416310

scala> bar2()
<console>:14: error: Bar2 does not take parameters
       bar2()
           ^

2.2 伴生類和伴生對(duì)象中的apply()

把剛才的內(nèi)容結(jié)合起來碟联,順便回憶一下上一篇中的伴生類和伴生對(duì)象。

/**
  * Created by tony on 2017/2/28.
  */
class ApplyTest {

  def apply() = println("This is called by class!")

  def haveATry: Unit = {
    println("have a try on apply")
  }
}

object ApplyTest {

  def apply() = {
    println("This is called by companion object")
    new ApplyTest
  }
}

object ApplyOperation {
  def main(args: Array[String]) {

    val a1 = ApplyTest()   //object 的 apply() 使用

    a1.haveATry
    a1() // class 中 apply()使用

    println("------------------")

    val a2 = new ApplyTest
    a2.haveATry
    a2() // class 中 apply()使用
  }
}

調(diào)用的結(jié)果如下:

This is called by companion object
have a try on apply
This is called by class!
------------------
have a try on apply
This is called by class!

Process finished with exit code 0

最后僵腺,除了在類中可以使用apply()鲤孵,在function中也可以使用apply(),因?yàn)樵?Scala 中函數(shù)即對(duì)象辰如,后面的筆記會(huì)進(jìn)行總結(jié)普监。

3. 類中的update()

update() 也可以看作是 Scala 的語法糖。
使用 update() 時(shí)琉兜,等號(hào)右邊的值會(huì)作為 update 方法的最后一個(gè)參數(shù)凯正。

scala> class User(var name:String,var password:String) {
     |    def update(name:String,password:String) = {
     |       println(s"changing use of $name and $password")
     |       this.name = name
     |       this.password = password
     |    }
     | }
defined class User

scala> val tony = new User("tony","123456")
tony: User = User@6d868997

scala> tony.password
res17: String = 123456

scala> tony.update("tony","abcdefg")
changing use of tony and abcdefg

scala> tony.password
res19: String = abcdefg

scala> tony("tony") = "abcdefg"
changing use of tony and abcdefg

scala> tony.password
res21: String = abcdefg

在這里,tony.update("tony","abcdefg") 和 tony("tony") = "abcdefg" 這兩句話是等價(jià)的豌蟋。前一種方法比較中規(guī)中矩廊散,后一種方法更加簡(jiǎn)潔。

總結(jié)

本篇筆記仍然是整理類相關(guān)的內(nèi)容梧疲,主要是抽象類允睹、類中的apply()和update()。apply()和update()都是語法糖幌氮,加以合適的應(yīng)用缭受,能得到可讀性極強(qiáng)的代碼。

下一篇筆記會(huì)整理 Scala 的模式匹配浩销。

先前的文章:
Scala學(xué)習(xí)筆記(四) 類的初步
Scala學(xué)習(xí)筆記(三)
Scala學(xué)習(xí)筆記(二)
Scala學(xué)習(xí)筆記(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贯涎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子慢洋,更是在濱河造成了極大的恐慌塘雳,老刑警劉巖陆盘,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異败明,居然都是意外死亡隘马,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門妻顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酸员,“玉大人,你說我怎么就攤上這事讳嘱♂`拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沥潭,是天一觀的道長(zhǎng)邀泉。 經(jīng)常有香客問我,道長(zhǎng)钝鸽,這世上最難降的妖魔是什么汇恤? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮拔恰,結(jié)果婚禮上因谎,老公的妹妹穿的比我還像新娘。我一直安慰自己颜懊,他們只是感情好财岔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饭冬,像睡著了一般使鹅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昌抠,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天患朱,我揣著相機(jī)與錄音,去河邊找鬼炊苫。 笑死裁厅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侨艾。 我是一名探鬼主播执虹,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唠梨!你這毒婦竟也來了袋励?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茬故,沒想到半個(gè)月后盖灸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磺芭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年赁炎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钾腺。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徙垫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出放棒,到底是詐尸還是另有隱情姻报,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布间螟,位于F島的核電站逗抑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏寒亥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一荧关、第九天 我趴在偏房一處隱蔽的房頂上張望溉奕。 院中可真熱鬧,春花似錦忍啤、人聲如沸加勤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳄梅。三九已至,卻和暖如春未檩,著一層夾襖步出監(jiān)牢的瞬間戴尸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工冤狡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孙蒙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓悲雳,卻偏偏與公主長(zhǎng)得像挎峦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子合瓢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • Scala學(xué)習(xí)筆記: 1.1 scala的基礎(chǔ)語法 聲明與定義(賦值):聲明變量時(shí)可以指定類型坦胶,不指定也可以自動(dòng)識(shí)...
    哎喲喂嘍閱讀 565評(píng)論 0 2
  • scala文檔 包含內(nèi)容 1基礎(chǔ) 2控制結(jié)構(gòu)和函數(shù) 3數(shù)組相關(guān)操作 4映射和元組 5類 6對(duì)象 7.包和引入(x)...
    zlcook閱讀 1,005評(píng)論 0 3
  • scala學(xué)習(xí)筆記 第2章 變量和數(shù)據(jù)類型 基本數(shù)據(jù) scala的核心數(shù)據(jù)為四種 :字面量、值、變量顿苇、類型 值使...
    485b1aca799e閱讀 2,130評(píng)論 0 1
  • 這篇講義只講scala的簡(jiǎn)單使用峭咒,目的是使各位新來的同事能夠首先看懂程序,因?yàn)?scala 有的語法對(duì)于之前使用習(xí)...
    MrRobot閱讀 2,917評(píng)論 0 10
  • 成長(zhǎng)的路上,你我都像被打了一針的查理蜂科。突然間對(duì)事物有了自己的理解顽决,懂得質(zhì)疑老師和權(quán)威做出自己的判斷。 有一天导匣,當(dāng)你...
    小v木閱讀 666評(píng)論 0 0