Scala學(xué)習(xí)筆記(四) 類的初步

Scala 類相關(guān)

終于來(lái)到面向?qū)ο蟮牡胤搅耍m說(shuō)函數(shù)式編程是 Scala 的特性,讓人們覺(jué)得 Scala 是更好的 Java。但是在架構(gòu)層面上一直提倡著:小處用函數(shù)式編程,大處用面向?qū)ο缶幊獭?/p>

從這篇筆記開(kāi)始,會(huì)記錄類的相關(guān)內(nèi)容。由于類相關(guān)的內(nèi)容比較多,我可能會(huì)整理幾篇文章來(lái)寫(xiě)。

1. 構(gòu)造器

在 java 中定義一個(gè)簡(jiǎn)單的用戶類,以及構(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 代碼等價(jià)。

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

然后創(chuàng)建一個(gè) User 對(duì)象。

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

也可以用 case 類來(lái)推斷出構(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)

稍后,就會(huì)講到case class。

2. 單例對(duì)象、伴生對(duì)象、Case Class、Trait

2.1 單例對(duì)象

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

那么,今天再補(bǔ)充一下,以 object 關(guān)鍵字定義的對(duì)象是一個(gè)單例對(duì)象。

先上一段代碼。

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

scala> Singleton.test()
test singleton

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

//
// 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 伴生對(duì)象

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

相對(duì)于伴生對(duì)象,單獨(dú)的 object 對(duì)象是獨(dú)立對(duì)象(Standalone Object)。他們的主要用途是可以用于工具類,或者定義 Scala 程序的入口等等。

來(lái)看一個(gè)伴生對(duì)象和伴生類使用的例子。

/**
  * 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 {

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

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

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

2.3 Case Class

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

  • 初始化的時(shí)候不需要 new
  • 自動(dòng)創(chuàng)建伴生對(duì)象
  • 默認(rèn)是可以序列化的,實(shí)現(xiàn)了 Serializable
  • 構(gòu)造函數(shù)的參數(shù)都是 val 類型的
  • 支持模式匹配。
  • 實(shí)現(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
                ^

模式匹配,后面的文章會(huì)講到。

2.4 Trait

Scala 不提供接口,而提供類似接口的 Trait ,跟接口不同的是 Trait 可以寫(xiě)方法的實(shí)現(xiàn)。這一點(diǎn)跟 Java 8 接口的默認(rèn)方法很相似。

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> 

定義兩個(gè)Trait,“飛”和“游泳”。再定義兩個(gè)類,“鴨子”和“天鵝”。鴨子會(huì)游泳,而天鵝既會(huì)游泳,也會(huì)飛。

對(duì)于 Trait 不止一個(gè)的類的時(shí)候,可以用 with 關(guān)鍵字來(lái)添加額外的 Trait。

例如:

extends Trait1 with Trait2 with Trait3

3. 繼承

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

總結(jié)

本篇內(nèi)容只是 Scala 類相關(guān)內(nèi)容的開(kāi)頭,后續(xù)會(huì)陸續(xù)整理。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 大數(shù)據(jù)學(xué)院_騰訊大數(shù)據(jù)http://data.qq.com/academySpark是一個(gè)通用的并行計(jì)算框架,立足...
    葡萄喃喃囈語(yǔ)閱讀 634評(píng)論 0 1
  • 這篇講義只講scala的簡(jiǎn)單使用,目的是使各位新來(lái)的同事能夠首先看懂程序,因?yàn)?scala 有的語(yǔ)法對(duì)于之前使用習(xí)...
    MrRobot閱讀 2,942評(píng)論 0 10
  • Scala學(xué)習(xí)筆記: 1.1 scala的基礎(chǔ)語(yǔ)法 聲明與定義(賦值):聲明變量時(shí)可以指定類型,不指定也可以自動(dòng)識(shí)...
    哎喲喂嘍閱讀 574評(píng)論 0 2
  • 變量初始化可以用用 _ 作占位符,賦值為默認(rèn)值,字符串 null,F(xiàn)loat、Int、Double 等為 0var...
    FaDeo_O閱讀 943評(píng)論 0 0
  • 這是設(shè)么
    你們城里人真會(huì)玩閱讀 271評(píng)論 0 1