技术环境:Scala2.12.10 因为各版本间可能存在差异,所以其他版本的表现只能由读者自己去验证了,此只作为该Scala版本的验证依据
Scala的继承类构造函数的执行顺序永远遵循下面两个原则
无论入口在哪,首先执行主构造器,再执行辅助构造器
若存在继承关系,则首先执行基类的构造器,再执行子类的构造器
下面的代码可以验证这两个原则
package com.datacrafts.digitalevers.test
object Test {
def main(args: Array[String]): Unit = {
val test = new Sub(123,"zhangsan")
}
}
class Base(){
println("Base主构造器执行完毕~")
def this(inAge:Int){
this
println("Base第一个辅助构造器执行完毕~")
}
}
class Sub(inAge:Int) extends Base(inAge:Int){
var name:String = ""
var age:Int = 10
println("Sub主构造器执行完毕~")
def this(name:String) = {
this(10)
this.name = name
println("Sub第一个辅助构造器执行完毕~")
}
def this(age:Int,name:String) = {
this(age)
this.age = age
this.name = name
println("Sub第二个辅助构造器执行完毕~")
}
}
最后的输出结果
Base主构造器执行完毕~
Base第一个辅助构造器执行完毕~
Sub主构造器执行完毕~
Sub第二个辅助构造器执行完毕~
这里补充两个注意事项
Scala类的主构造器和辅助构造器之间及辅助构造器与辅助构造器之间都不能存在雷同的参数样式。这里的雷同是指参数个数相同并且参数的类型也一致,因为只要这样的雷同函数发生,Scala的类在实例化的时候就会很迷惑,不知道该何去何从,该执行哪个构造器
如果类之间存在继承关系,既不能在子类的辅助构造器内也不能子类的主构造器内显式调用super来执行基类的构造器,只能由子类的主构造器隐式调用。而基类构造器需要的参数也需要在子类的主构造器上传递过来,如下形式
class Sub(inAge:Int) extends Base(inAge:Int){
………..
}
近期评论