2017-06-18 70 views
1

我想要放置的"my name - new name""my name - null"打印:scala如何初始化重写字段?

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() 
} 

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

回答

0

name更改为像下面的方法来解决此错误。这是因为超类在初始化子类在scala中初始化之前被初始化并且vals在超类和子类都被初始化后被最初初始化。在示例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 = [email protected] 
+0

谢谢,这works.BTW,为什么不打印'我的名字 - 默认name'如果在我的代码超第一初始化? – LoranceChen

+0

多数民众赞成在多数民众赞成,因为'val's初始化后,超类和子类都初始化。 –

+0

@LoranceChen更新了答案 –