轉(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 {}