我希望打印"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
?
答案 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;