scala面向對象基礎

scala面向對象

  • 1、類的定義

    • class 類名{
        //變量
        val …
        var …
        //定義方法
        def 方法名(參數) : 返回類型 = {函數體}
      }
  • 2、getter和setter

    • 對於類中有var聲明的變量(var name:String),scala編譯器會直接自動生成其getter和setter方法;val(val name:String)聲明的變量,只聲明getter方法;無聲明的參數爲局部變量(name:String),無getter無setter,只能在類內部訪問。

    • class Counter(var name1:String,val name2:String,name3:String){
        private name4:String = _ //也無getter和setter
        //自定義個getter和setter
        def name3 = name3 //getter
        def name3_=(newName:String){newName}
      }
  • 3、構造器

    • 主構造器 class Counter(var name:String)
    • 輔構造器 class Counter(var name:String){
       //輔助構造器有關鍵詞this實現,作用是用於實現實例時可以使用不同的參數
        def this(name:String,age:Int){
          this(name) //必須得先調用之前的某個構造器
          this.age = age
      }
        def this(){
          this(“add”) //調用主構造器
          或者 this(“aaa”,12) //調用之前的輔構造器

    }
    }

    • 說明
      • 所有構造器的參數個數和參數類型必須不一致,因爲這樣在實例化的時候才能唯一識別到某個構造器
      • 輔構造器在第一行都必須直接或間接(調用其他輔構造器)調用主構造器
      • 輔構造器的調用過程:假設實例化 val c = new Counter(),則輔構造器this()被調用,this()被調用的過程中會先執行this(“add”)(之後又會去調用主構造器),生成一個具有name屬性的實例,因此this()沒有新增屬性,所以到此就結束了。如果是 val c = new Counter(“mike”,12),則輔構造器this(name:String,age:Int)會被調用(之後又會去調用主構造器),在這個過程 中會先執行this(name),生成一個具有name屬性的實例,然後再將給該實例添加age屬性。
  • 4、單例對象(包括伴生對象和孤立對象)

    • 類似靜態對象,無需實例化即可去調用其內部不的方法
      object person{def hahaha(){println(“hahahahahha”)}}
      person.hahaha()即可調用
    • 伴生對象
      class A{} 伴生類
      object A{} 伴生對象
      伴生類和伴生對象可互相調用內部成員
    • 孤立對象
      只有 object A{}
  • 5、apply方法

    • 實例化後,給該實例傳入apply方法的參數,apply方法會被自動調用
      class person{
      def apply(s:String){ println(“hahahahhahaha”)
      }
      val p = new person
      p(“123”) 則apply方法會被調用

      如果apply方法是在object中,object中的方法無需實例化也可被調用,調用更加簡便。
      class person{
      def apply(s:String){ println(“hahahahhahaha”)
      }
      person(“123”) apply方法即被調用

      val arr = new Array[Int](5) 此爲正常調用
      val arr = Array(1,2,3) 此爲調用Array的apply方法

    • 工廠
      class Car(name:String){def info() {println(“aaaaaa”)}
      object Car { def apply(name:String) = new Car(name) }
      val mycar = Car(“TESLA”) //直接調用伴生對象的apply,無需new

  • 6、update方法

    • 用於修改對象的某個值
    • 當對帶有括號幷包括一到若干參數的對象進行賦值時,編譯器將調用對象的update方法,並將括號裏的參數和等號右邊的值一起作爲update方法的輸入參數來執行調用
    • val arr = Array(1,2,3)
      arr(0) = 123 //調用了update方法 arr.update(0,123),這也是Array的索引用的是() ,這是函數式編程的特點。
  • 7、upapply方法

    • apply的反向操作,給定一個對象,返回對象的屬性值
      def unapply(c:Car):Option[(String,Int)]={Some((c.brand,c.price))}
  • 8、abstract抽象類

    • 抽象:字段沒有給初始值、方法沒給定義
      abstract class Car{
      val name:String //沒有給初始值
      def printInfo() / 沒有給函數定義
      }
    • 抽象類的作用:用於程序的設計階段
  • 9、extends繼承(只能繼承一個類)

    • 重寫父類方法或字段(var)用 override修飾(父類爲抽象時可以不加)
  • 10、case class

    • 自動生成apply方法、unapply方法
  • 11、Option類

  • 12、trait特質

    • 給類提供組件?
    • scala只能繼承一個超類,可混入多個特質
    • trait Flyable {
          var maxFlyHeight:Int
          def fly()
          def breathe() {println(“huhuhuhuhu”)
      }
      trait HasLegs{
          val legs:Int
          def move() {println(“moveeeeee”)}
      }
      class Animal(val category:String){
          def info(){println("This is a " + category)}
      }
      class Bird(category:String,flyHeight:Int) extends Animal(category) with Flyable with HasLegs{
          var maxFlyHeight = flyHeight
          val legs = 2 //重載特質的抽象字段
          def fly(){ println(“I can fly”)} //重載特質的抽象方法
      }
發佈了58 篇原創文章 · 獲贊 18 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章