Scala學習筆記(四) 類的初步

Scala 類相關

終于來到面向?qū)ο蟮牡胤搅酥急穑m說函數(shù)式編程是 Scala 的特性患朱,讓人們覺得 Scala 是更好的 Java译蒂。但是在架構(gòu)層面上一直提倡著:小處用函數(shù)式編程牢酵,大處用面向?qū)ο缶幊獭?/p>

從這篇筆記開始荐类,會記錄類的相關內(nèi)容。由于類相關的內(nèi)容比較多茁帽,我可能會整理幾篇文章來寫玉罐。

1. 構(gòu)造器

在 java 中定義一個簡單的用戶類,以及構(gòu)造函數(shù)

public class User {

    private String name;
    private String password;
    
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

然而在 Scala 中潘拨,只需一代碼即可跟上面的 Java 代碼等價吊输。

scala> class User(var name:String,var password:String)
defined class User

然后創(chuàng)建一個 User 對象。

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

也可以用 case 類來推斷出構(gòu)造方法的參數(shù)都是val類型的

scala> case class ImmutableUser(name:String,password:String)
defined class ImmutableUser

scala> val user = ImmutableUser("tony","123456")
user: ImmutableUser = ImmutableUser(tony,123456)

稍后铁追,就會講到case class季蚂。

2. 單例對象、伴生對象、Case Class扭屁、Trait

2.1 單例對象

Scala學習筆記(二)中算谈,講述過Scala 中沒有靜態(tài)修飾符 static,在 object 下的成員全部都是靜態(tài)的料滥,而且 object 不能提供構(gòu)造器參數(shù)然眼。

那么,今天再補充一下葵腹,以 object 關鍵字定義的對象是一個單例對象高每。

先上一段代碼。

scala> object Singleton {
     |  def test() = println("test singleton")
     | }
defined object Singleton

scala> Singleton.test()
test singleton

經(jīng)過查看 class 文件獲取它的源碼践宴,Singleton 生成了一個懶漢模式的單例類鲸匿。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

import scala.Predef.;

public final class Singleton$ {
    public static final Singleton$ MODULE$;

    static {
        new Singleton$();
    }

    public void test() {
        .MODULE$.println("test singleton");
    }

    private Singleton$() {
        MODULE$ = this;
    }
}

2.2 伴生對象

如果在類中聲明了與該類相同的名字的 object 則該object 是該類的“伴生對象”。

相對于伴生對象阻肩,單獨的 object 對象是獨立對象(Standalone Object)带欢。他們的主要用途是可以用于工具類,或者定義 Scala 程序的入口等等烤惊。

來看一個伴生對象和伴生類使用的例子洪囤。

/**
  * Created by tony on 2017/2/20.
  */
class User(var name:String,var age:Int) {

  def greet: Unit = {
    println("hi, My name is "+name)
  }

  override def toString: String = {

    "name is "+ name + ", age is " + age
  }
}

object User {

  def addAge(u: User) = u.age +1
}

object Main extends App {

  //伴生對象可以引用類的私有變量
  val user = new User("Tony",20)
  println(user.age)          //  20
  user.age = User.addAge(user)

  //類可以引用伴生對象的私有變量
  user.greet                 //  hi, My name is Ton

  println(user)              //  name is Tony, age is 20
}

2.3 Case Class

case class 跟普通 class 的區(qū)別在于

  • 初始化的時候不需要 new
  • 自動創(chuàng)建伴生對象
  • 默認是可以序列化的,實現(xiàn)了 Serializable
  • 構(gòu)造函數(shù)的參數(shù)都是 val 類型的
  • 支持模式匹配撕氧。
  • 實現(xiàn)自己的 toString瘤缩、hashCode、copy伦泥、equals 方法
scala> case class User(name:String,age:Int)
defined class User

scala> val tony = User("Tony",20)
tony: User = User(Tony,20)

scala> tony.age = 21
<console>:14: error: reassignment to val
       tony.age = 21
                ^

模式匹配剥啤,后面的文章會講到。

2.4 Trait

Scala 不提供接口不脯,而提供類似接口的 Trait 府怯,跟接口不同的是 Trait 可以寫方法的實現(xiàn)。這一點跟 Java 8 接口的默認方法很相似防楷。

scala> trait Fly {
     |  def fly()
     | }
defined trait Fly

scala> trait Swim {
     |   def swim()
     | }
defined trait Swim

scala> class Duck extends Swim {
     |    def swim() {
     |       println ("duck can swim")
     |    }
     | }
defined class Duck

scala> class Swan extends Swim with Fly {
     |   def swim() {
     |      println ("swam can swim")
     |  }
     | 
     |  def fly() {
     |      println ("swam can fly")
     |  }
     | }
defined class Swan

scala> val swam = new Swan()
swam: Swan = Swan@1d0d6318

scala> swam.swim()
swam can swim

scala> swam.fly()
swam can fly

scala> 

定義兩個Trait牺丙,“飛”和“游泳”。再定義兩個類复局,“鴨子”和“天鵝”冲簿。鴨子會游泳,而天鵝既會游泳亿昏,也會飛峦剔。

對于 Trait 不止一個的類的時候,可以用 with 關鍵字來添加額外的 Trait角钩。

例如:

extends Trait1 with Trait2 with Trait3

3. 繼承

像 Java 一樣吝沫,Scala 只支持單一繼承呻澜,而不是多重繼承。

總結(jié)

本篇內(nèi)容只是 Scala 類相關內(nèi)容的開頭惨险,后續(xù)會陸續(xù)整理羹幸。

先前的文章:
Scala學習筆記(三)
Scala學習筆記(二)
Scala學習筆記(一)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辫愉,隨后出現(xiàn)的幾起案子栅受,更是在濱河造成了極大的恐慌,老刑警劉巖一屋,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袋哼,居然都是意外死亡冀墨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門涛贯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诽嘉,“玉大人,你說我怎么就攤上這事弟翘〕嬉福” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵稀余,是天一觀的道長悦冀。 經(jīng)常有香客問我,道長睛琳,這世上最難降的妖魔是什么盒蟆? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮师骗,結(jié)果婚禮上历等,老公的妹妹穿的比我還像新娘。我一直安慰自己辟癌,他們只是感情好寒屯,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著黍少,像睡著了一般寡夹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厂置,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天要出,我揣著相機與錄音,去河邊找鬼农渊。 笑死患蹂,一個胖子當著我的面吹牛或颊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播传于,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼囱挑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了沼溜?” 一聲冷哼從身側(cè)響起平挑,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎系草,沒想到半個月后通熄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡找都,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年唇辨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能耻。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赏枚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出晓猛,到底是詐尸還是另有隱情饿幅,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布戒职,位于F島的核電站栗恩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洪燥。R本人自食惡果不足惜摄凡,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚓曼。 院中可真熱鬧亲澡,春花似錦、人聲如沸纫版。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽其弊。三九已至癞己,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梭伐,已是汗流浹背痹雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糊识,地道東北人绩社。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓摔蓝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親愉耙。 傳聞我的和親對象是個殘疾皇子贮尉,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • 大數(shù)據(jù)學院_騰訊大數(shù)據(jù)http://data.qq.com/academySpark是一個通用的并行計算框架,立足...
    葡萄喃喃囈語閱讀 575評論 0 1
  • 這篇講義只講scala的簡單使用朴沿,目的是使各位新來的同事能夠首先看懂程序猜谚,因為 scala 有的語法對于之前使用習...
    MrRobot閱讀 2,902評論 0 10
  • Scala學習筆記: 1.1 scala的基礎語法 聲明與定義(賦值):聲明變量時可以指定類型,不指定也可以自動識...
    哎喲喂嘍閱讀 557評論 0 2
  • 變量初始化可以用用 _ 作占位符赌渣,賦值為默認值魏铅,字符串 null,F(xiàn)loat坚芜、Int览芳、Double 等為 0var...
    FaDeo_O閱讀 897評論 0 0
  • 這是設么
    你們城里人真會玩閱讀 264評論 0 1