scala 主构造函数_Scala-构造函数
/*
scala的構(gòu)造函數(shù)分為主構(gòu)造函數(shù)和輔助構(gòu)造函數(shù)。
一、主構(gòu)造函數(shù)
在Scala中,每個(gè)類都有主構(gòu)造函數(shù),和類的定義交織在一起。
一個(gè)Scala類的主構(gòu)造函數(shù)包括:1、構(gòu)造函數(shù)的參數(shù);2、類體中調(diào)用的方法;3、在類體中執(zhí)行的語句和表達(dá)式。
如果類名之后沒有參數(shù),則該類具備一個(gè)無參主構(gòu)造函數(shù),這樣一個(gè)構(gòu)造函數(shù)僅僅是簡單地執(zhí)行類體中的所有語句。
二、輔助構(gòu)造函數(shù)
1.輔助構(gòu)造函數(shù)的名稱為this,這主要是考慮到在C++和Java中,構(gòu)造函數(shù)名與類名同名,當(dāng)更改類名時(shí)需要同時(shí)修改構(gòu)造函數(shù)名,因此使用this為構(gòu)造函數(shù)名使程序可靠性更強(qiáng);
2.每一個(gè)輔助構(gòu)造函數(shù)都必須以一個(gè)對(duì)先前已定義的其他輔助構(gòu)造函數(shù)或主構(gòu)造函數(shù)的調(diào)用開始
三、Scala提供一個(gè)主構(gòu)造函數(shù)和任意多個(gè)輔助構(gòu)造函數(shù)
1.如果不指定主構(gòu)造函數(shù),編譯器將創(chuàng)建一個(gè)主構(gòu)造函數(shù)的構(gòu)造函數(shù),所有類的主體的聲明都被視為構(gòu)造函數(shù)的一部分。它也被稱為默認(rèn)構(gòu)造函數(shù)。
2.如果代碼只有一個(gè)構(gòu)造函數(shù),則可以不需要定義明確的構(gòu)造函數(shù)。它有助于優(yōu)化代碼,可以創(chuàng)建具有零個(gè)或多個(gè)參數(shù)的主構(gòu)造函數(shù)。
3.必須要從輔助構(gòu)造函數(shù)內(nèi)部調(diào)用主構(gòu)造函數(shù)。this關(guān)鍵字用于從其他構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)。當(dāng)調(diào)用其他構(gòu)造函數(shù)時(shí),要將其放在構(gòu)造函數(shù)中的第一行。
4.在scala中,可以重載構(gòu)造函數(shù)。
四、主構(gòu)造函數(shù)的參數(shù)(類參數(shù))
1.在主構(gòu)造函數(shù)的參數(shù)列表中聲明的參數(shù)和在類體中聲明的變量本質(zhì)上沒有任何不同;
2.如果只有var/val修飾,則字段總是對(duì)外可見的,即默認(rèn)是public的
3.如果連var/val也沒有,則字段對(duì)外不可見,同時(shí)內(nèi)部只讀,不可改寫,即默認(rèn)是:private val
4.上一條不適用于case class,case class的類參數(shù)在不指定val/var修飾時(shí),會(huì)自動(dòng)編譯為public val,即對(duì)外只讀,如果需要case class的字段外部可寫,可以顯式地指定var關(guān)鍵字!
五、類字段的getter/setter
1.對(duì)于var修飾的參數(shù):外部可讀/可改寫 (實(shí)際上是:編譯器為該類參數(shù)(字段)自動(dòng)生成了getter和setter)
2.對(duì)于val修飾的參數(shù):外部可讀/不可改寫(實(shí)際上是:編譯器為該類參數(shù)(字段)只生成了getter沒有生成setter)
3.對(duì)于private var修飾的參數(shù):內(nèi)部可讀/可改寫 (編譯器不會(huì)為私有類參數(shù)(字段)自動(dòng)生成getter和setter)
4.對(duì)于private val修飾的參數(shù):內(nèi)部可讀/不可改寫 (編譯器不會(huì)為該類參數(shù)(字段)自動(dòng)生成getter和setter)
*/
/*** 重寫 :可以重寫成員變量和成員方法(重寫字段或者方法)
* 子類繼承父類*/
classPerson(val name : String,var age : Int) {
println("The primarry constructor of Person")
val school= "BJU"def sleep= "8 hours"override def toString= "I am a person !"}/*** woker 繼承自person ,name,age,salary是woker的成員變量
* 子類必須把父類的主構(gòu)造器中的參數(shù)都填充滿(和java不同:繼承時(shí)采用 super使用父類的成員)*/
class Worker(name : String ,age : Int ,val salary :Long ) extendsPerson(name,age){
println("This is the subClass of person,primary constructor of woker")
override val school= "Spark" //復(fù)寫字段或者是方法都要進(jìn)行 添加重寫
override def toString= "I am a worker !" + super.sleep
}
object Person {
def main(args: Array[String]): Unit={//構(gòu)建時(shí) 先構(gòu)建父類
val w = new Worker("spark",5,100000)
println("School :" +w.school )
println(w.toString())
}
}
總結(jié)
以上是生活随笔為你收集整理的scala 主构造函数_Scala-构造函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python拷贝是什么知识点_地址对象p
- 下一篇: java自动转换_java类型转换详解(