scala如何初始化覆盖字段?

时间:2017-06-18 02:57:26

标签: scala

我希望打印"my name - new name",但"my name - null"放置:

trait SomeTrait {
  val name = "default name"
  println(s"my name - $name")
}    
class SomeClass extends SomeTrait {
  override val name: String = "new name"
}
object Main extends App {
  val constructTest = new SomeClass()
}

执行Main时,控制台输出: my name - null
为什么要打印null而不是new name

1 个答案:

答案 0 :(得分:0)

name更改为以下方法以解决此错误。这是因为在scala中初始化子类之前初始化了超类,并且在初始化超类和子类之后最后初始化了val。在示例中,name在初始化default name时不能为SomeTrait,而在初始化"new name"时它变为SomeClass因为name应该是name不可变的价值。因此,在完成所有构造函数之后初始化trait SomeTrait { def name = "default name" //def instead of a val println(s"my name - $name") } class SomeClass extends SomeTrait { override def name: String = "new name" } 值。

scala> new SomeClass()
my name - new name
res0: SomeClass = SomeClass@58f4b31a

<强>输出:

endl;