Scala類(lèi)和對(duì)象


類(lèi)

  • 類(lèi)是對(duì)象的模板,在scala中可以使用new關(guān)鍵字聲明同結(jié)構(gòu)的對(duì)象

    class Person {
      private val id = 1
      var name = "steven"
      
      def run  = "I'm runing"
      def eat(food: String) = "I'm eating" + food
    }
    
    • 類(lèi)成員主要包括字段(val跟var)、方法與函數(shù)(def),但Scala禁止使用同樣的名稱(chēng)命名字段和方法,即既聲明一個(gè)name字段,又聲明一個(gè)name方法是不允許的
    • 類(lèi)成員可見(jiàn)性有兩種,private(私有)跟public(公有),private需要聲明,public無(wú)需額外聲明
    • 調(diào)用無(wú)參方法時(shí)可以不帶()
    • 若類(lèi)中聲明無(wú)參方法時(shí)不帶(),實(shí)際調(diào)用也不可帶()
  • getter和setter
    • Scala對(duì)每個(gè)類(lèi)中的字段都提供getter和setter方法

    • 對(duì)于公有字段來(lái)說(shuō),其getter和setter方法同樣是共有的,對(duì)于私有字段來(lái)說(shuō),則是私有的

    • var聲明的字段帶有g(shù)etter和setter方法(讀寫(xiě)), val聲明的字段自帶有g(shù)etter方法(只讀)

      getter方法與setter方法的意義在于控制類(lèi)中私有對(duì)象的數(shù)據(jù)在類(lèi)中可以通過(guò)重定義getter和setter方法獲取、有限制的修改私有字段

  • 主構(gòu)造器
    • 每個(gè)類(lèi)都有主構(gòu)造器,主構(gòu)造器的參數(shù)直接放在類(lèi)名之后

      class TreeNode(val id: Int, val value: Int, var next: TreeNode)
      
      • 上面的代碼會(huì)聲明并初始化如下字段

        val id: Int
        val value: Int
        var next: TreeNode
        
  • 主構(gòu)造器的參數(shù)會(huì)被編譯成字段,在構(gòu)造對(duì)象時(shí)直接傳入

  • 如果類(lèi)中存在可以直接執(zhí)行的語(yǔ)句,例如:

    class TreeNode(val id: Int, val value: Int, var next: TreeNode){
      println("created a Node")
    }
    

    只要?jiǎng)?chuàng)建該類(lèi)對(duì)象,都會(huì)執(zhí)行println語(yǔ)句

  • 一個(gè)類(lèi)默認(rèn)都有一個(gè)無(wú)參主構(gòu)造器(類(lèi)似Java的默認(rèn)構(gòu)造方法)

  • 主構(gòu)造器的參數(shù)種類(lèi):

    id: Int  // 如果在類(lèi)方法中使用了id這個(gè)參數(shù),該參數(shù)就會(huì)變成對(duì)象的私有字段
    val/var id: Int // 初始化時(shí), 參數(shù)id會(huì)變?yōu)閷?duì)象的私有字段,擁有公有的setter/getter方法
    private val/var id: Int // 私有字段, 擁有私有的setter/getter方法
    @BeanPropert val/var id: Int // 私有字段,公有的Scala和JavaBeans的setter/getter方法
    
  • 私有主構(gòu)造器

    // 把主構(gòu)造器設(shè)為私有,只能通過(guò)輔助構(gòu)造器構(gòu)造對(duì)象
    class TreeNode private(val id: Int, val value: Int, var next: TreeNode)
    
  • 輔助構(gòu)造器
    • Scala類(lèi)能有任意多的輔助構(gòu)造器
    • 輔助構(gòu)造器的名稱(chēng)為this
    • 輔助構(gòu)造器必須以一個(gè)主構(gòu)造器或其他已定義的輔助構(gòu)造器調(diào)用開(kāi)始
    class Person{
      private var id: Int  = 1
      private var name: String = " "
      
      def this(id: Int){
        this()
        this.id = id
      }
      def this(id: Int, name: String){
        this(id)
        this.name = name
      }
    }
    

    ?

對(duì)象

  • 單例對(duì)象
    • object可以構(gòu)造單例對(duì)象
    • 對(duì)象的構(gòu)造器在該對(duì)象第一次被使用時(shí)調(diào)用
    • object可以擁有類(lèi)的所有特性,但是不能提供構(gòu)造器參數(shù)
  • 伴生對(duì)象
    • 在同一個(gè)源文件中,如果存在和單例對(duì)象同名的類(lèi),則該單例對(duì)象稱(chēng)為伴生對(duì)象

      class Hello(val name: String){
        println("Hello " + name + "!")
      }
      
      object Hello{       // 伴生對(duì)象
        val obj = new Hello("Steven")
      }
      
    • 類(lèi)和其伴生對(duì)象可以相互訪(fǎng)問(wèn)私有屬性

    • 類(lèi)在訪(fǎng)問(wèn)伴生對(duì)象成員時(shí),要通過(guò)類(lèi)名.的方式

  • apply方法
    • 如果想要構(gòu)造有參數(shù)需求的伴生對(duì)象,可以使用apply方法

      class Hello(val name: String){
        println("Hello " + name + "!")
      }
      
      object Hello{       // 伴生對(duì)象
        def apply(name: String) = new Hello(name)
      }
      
      // 使用方式
      val h = Hello("Steven")
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Scala與Java的關(guān)系 Scala與Java的關(guān)系是非常緊密的??! 因?yàn)镾cala是基于Java虛擬機(jī),也就是...
    燈火gg閱讀 3,610評(píng)論 1 24
  • 如果類(lèi)沒(méi)有內(nèi)容(body),可以省略空的花括號(hào),只寫(xiě)一行語(yǔ)句 類(lèi)可以帶參數(shù),類(lèi)名稱(chēng)C之后圓括號(hào)內(nèi)的參數(shù),x稱(chēng)為類(lèi)參...
    wangdy12閱讀 922評(píng)論 0 0
  • 前面提到Scala比Java更加面向?qū)ο螅@是因?yàn)镾cala不允許類(lèi)保護(hù)靜態(tài)元素(靜態(tài)變量或靜態(tài)方法)。在Scal...
    MaLiang閱讀 353評(píng)論 0 2
  • 剛看完神盾局特工第三季。 晚上又發(fā)瘋準(zhǔn)備給你發(fā)短信,消息刪了寫(xiě)寫(xiě)了刪,最后還是克制住了。 感覺(jué)又戰(zhàn)勝了自己。 買(mǎi)了...
    _滌心閱讀 177評(píng)論 0 0
  • 2018年2月總結(jié) 看著別人的文章有條理,邏輯清楚,自己卻沒(méi)有那么好的天分,那么,就老老實(shí)實(shí)的KOPY就行了,別人...
    奔跑的一夢(mèng)閱讀 234評(píng)論 0 0

友情鏈接更多精彩內(nèi)容