類(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")
-