Scala中object、class與trait的區(qū)別

轉(zhuǎn)自 《https://blog.csdn.net/fjse51/article/details/52152362

class

在scala中,類(class)名可以和對(duì)象(object)名為同一個(gè)名字,該對(duì)象(object)稱為該類(class)的伴生對(duì)象,類和伴生對(duì)象可以相互訪問(wèn)他們的私有屬性,但是他們必須在同一個(gè)源文件內(nèi)。類只會(huì)被編譯,不能直接被執(zhí)行,類的申明和主構(gòu)造器在一起被申明,在一個(gè)類中,主構(gòu)造器只有一個(gè)所有必須在內(nèi)部申明主構(gòu)造器或者是其他申明主構(gòu)造器的輔構(gòu)造器,主構(gòu)造器會(huì)執(zhí)行類定義中的所有語(yǔ)句。scala對(duì)每個(gè)字段都會(huì)提供getter和setter方法,同時(shí)也可以顯示的申明,但是針對(duì)val類型,只提供getter方法,默認(rèn)情況下,字段為公有類型,可以在setter方法中增加限制條件來(lái)限定變量的變化范圍,在scala中方法可以訪問(wèn)改類所有對(duì)象的私有字段。

abstract class

用abstract關(guān)鍵字聲明的類稱為abstract class。抽象類可以具有抽象方法和非抽象方法。抽象類用于實(shí)現(xiàn)抽象。抽象是一個(gè)過(guò)程, 在該過(guò)程中, 我們隱藏了復(fù)雜的實(shí)現(xiàn)細(xì)節(jié), 并僅向用戶顯示功能。

擴(kuò)展抽象類的類必須提供其所有抽象方法的實(shí)現(xiàn)。你不能創(chuàng)建抽象類的對(duì)象。

object

在scala類中沒(méi)有靜態(tài)方法和靜態(tài)字段,所以在scala中可以用object來(lái)實(shí)現(xiàn)這些功能,直接用對(duì)象名調(diào)用的方法都是采用這種實(shí)現(xiàn)方式,例如Array.toString。對(duì)象的構(gòu)造器在第一次使用的時(shí)候會(huì)被調(diào)用,如果一個(gè)對(duì)象從未被使用,那么他的構(gòu)造器也不會(huì)被執(zhí)行;對(duì)象本質(zhì)上擁有類(scala中)的所有特性,除此之外,object還可以一擴(kuò)展類以及一個(gè)或者多個(gè)特質(zhì),例如:

abstract class ClassName(val parameter){}
object Test extends ClassName(val parameter){}

注意:object不能提供構(gòu)造器參數(shù),也就是說(shuō)object必須是無(wú)參的

trait

在java中可以通過(guò)interface實(shí)現(xiàn)多重繼承,在Scala中可以通過(guò)特征(trait)實(shí)現(xiàn)多重繼承,不過(guò)與java不同的是,它可以定義自己的屬性和實(shí)現(xiàn)方法體,在沒(méi)有自己的實(shí)現(xiàn)方法體時(shí)可以認(rèn)為它時(shí)java interface是等價(jià)的,在Scala中也是一般只能繼承一個(gè)父類,可以通過(guò)多個(gè)with進(jìn)行多重繼承。

trait TraitA{}
trait TraitB{}
trait TraitC{}
object Test1 extends TraitA with TraitB with TraitC {}
最后編輯于
?著作權(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)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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