8.Scala面向?qū)ο箝_發(fā)-2

8.1 對象

  • 單例對象
  • 伴生對象
  • 擴展類和特質(zhì)
    • 構(gòu)造一個擴展了指定類和特質(zhì)的類的對象,同時擁有對象定義中給出的所有特性
  • apply方法

8.1.1 單例對象

  • object語法定義了某個類的單個實例
  • 對象的構(gòu)造器在該對象第一次被使用時調(diào)用
  • object語法結(jié)構(gòu)與class大致相同,除了object不能提供構(gòu)造器參數(shù)
  • 通常使用單例對象的環(huán)境:
    • 作為存放工具函數(shù)或常量的地方
    • 共享單個不可變實例
    • 利用單個實例協(xié)調(diào)某個服務(wù)


8.1.2 伴生對象

  • 當一個單例對象存在同名類的時候,稱為伴生對象
    • class HELLOWORLD{...}
    • objectHELLOWORLD{...}
  • 類和其伴生對象可以互相訪問私有屬性,但必須存在同一個源文件中
  • 類的伴生對象可以被訪問,但并不在作用域中,如;
    • class HELLOWORLD{...}
    • object HELLOWORLD{ def NOW{...} }
  • HELLOWORLD 類必須通過HELLOWORLD.NOW調(diào)用伴生對象中的NOW方法,而不能直接用NOW來調(diào)用

8.1.3 Apply方法

  • 需要構(gòu)造有參數(shù)需求的伴生對象時,可定義并使用apply方法
class HELLOWORLD(var m:String,n:Char){...}
object HELLOWORLD{
def apply(n:Char)=new HELLOWORLD("",n) 
} 

val hi=HELLOWORLD('j')

8.2 繼承-1

  • 拓展
  • 重寫
  • 抽象

8.2.1 拓展

  • extends是Scala中實現(xiàn)繼承的保留字
  • class week extends month{...}
    • week類繼承了month類所有非私有成員
    • week類是month類的子類,month類是week類的超類
    • 子類能重寫超類的成員(具有相同名稱和參數(shù))
  • class week(val num:Int) extendsmonth(var no.:Int){...}
  • object day extendsweek{...}
    • 單例對象同樣能從類中繼承,與類的繼承語法相同

8.2.2 重寫

  • Scala中使用override保留字進行方法、字段重寫
    • class week extends month{
    • override def firstday = {...}
    • }
  • override保留字實際使用類似于private,聲明這個保留字后的定義、聲明是對超類的重寫,因此,其也可以寫在類定義的參數(shù)中
    • class week(override val lastday:String)extends month{...}
  • 子類的重寫或修改Scala會檢查其超類,但是,超類的修改并不會檢查其子類
  • 重寫包括字段和方法,但參數(shù)不同的方法可以不重寫
    • class month{ def secondday(m:String)={...}}
    • class week extends month{ def secondday ={...}}

8.2.2.1 重寫規(guī)則

  • 重寫def
    • 用val :利用val能重寫超類用沒有參數(shù)的方法(getter)
    • 用def:子類的方法與超類方法重名
    • 用var:同時重寫getter、setter方法,只重寫getter方法報錯
  • 重寫val
    • 用val:子類的一個私有字段與超類的字段重名,getter方法重寫超類的getter方法
  • 重寫var
    • 用var:且當超類的var是抽象的才能被重寫,否則超類的var都會被繼承

8.2.2.2 重寫示例

  • class month{
  • val one = 25 //可在子類中用val重寫
  • var two = 15 //不可在子類中用var重寫,因為不是抽象的
  • var three:Int
  • def firstday = //可在子類中用val重寫
  • def now = //可在子類中用var重寫
  • def now_ =
  • def lastday(m:Char)={} //可在子類中用def重寫
  • }
  • 子類中,def只能重寫超類的def,val能重寫超類的val或不帶參數(shù)的def,var只能重寫超類中抽象的var或者超類的getter/setter對

8.2.3 抽象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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