一、Scala主构造器实战
Scala构造器和Java构造器有很大的不同,若传入的参数以var或val来说明,那么这个参数会成为类的字段
class Teacher{ //这里省略了() 主构造器。构造器的定义和类定义交织在一起
var name : String = _ //私有字段,生成公有的getter和setter
private var age = 27 //私有字段,生成私有的getter和setter
private[this] var gender = "male" //对象私有字段,不生成getter和setter
def this(name : String) { //重载构造器,也叫附属构造器。任何一个重载构造器都必须调用其他的重载构造器或主构造器
this //实际上是this(),省略了括号
this.name = name
}
def sayHello(){
println(this.name +","+ this. age +","+ this.gender)
}
}
object ssa {
def main(args: Array[String]): Unit = {
var p = new Teacher("lili")
p.sayHello
p.name = "spark"
p.sayHello
//p.gender = "female"//这里会报错,因为这个字段是对象私有字段,不会生成setter
}
}
输出:
lili,27,male
spark,27,male
二、私有构造器实战、构造器重载实战
class Student (var name : String, var age : Int){ //主构造器,传入的参数以var或val来说明,那么这个参数会成为类的字段
println("this is a primary constructor!")
var gender : String = _
println(gender)
def this(name : String, age : Int, gender : String){ //附属构造器、辅助构造器,或重载构造器
this(name, age) //每一个辅助构造器都必须以一个对先前已定义的其他辅助构造器或主构造器的调用开始
this.gender = gender
}
}
object ssa {
def main(args: Array[String]): Unit = {
var s = new Student("lili",22) //除了方法外,其他语句都会被执行
println(s.name)
}
}
输出:(主构造器会执行类定义中的所有语句)
this is a primary constructor!
null
lili
如果不想让别人使用主构造器,那么就在类名后面加一个private,调用时候就只能使用辅助构造器了
class Student private (var name : String, var age : Int) { ... }
参考资料来源于 DT大数据梦工厂 Scala零基础实战经典第8课 由王家林老师讲解和《快学Scala》