为什么在构造函数中重写的val为null?

sas*_*has 1 overriding scala nullpointerexception

在以下情况下

class A(name:String, job:String) 
{ 
   def profile = name + " " + job 
}

class B(name:String, job:String) 
{ 
  val a = new A(name,job)
  val b = a.profile
}
Run Code Online (Sandbox Code Playgroud)

关于初始化B和覆盖val a

val b = new B("Sasha","Day dream") 
{ override val a = new A("John-Wick","Kill") }
Run Code Online (Sandbox Code Playgroud)

我得到NullPointerExceptionval b = a.profile。我的问题是为什么重写的valnull?做上面的事情是不好的做法吗?

Ale*_*nov 5

这是几个事实的组合:

  1. ain val b = a.profile是指getter方法,它是var由覆盖的getter(和setter,用于)override val a。因此,它从子类返回该字段的值。

  2. 子类字段在子类构造函数中初始化。

  3. B构造函数运行的子类的构造函数,而子类字段的默认值null

常见的解决方法是将切换vallazy val,因此在首次使用时将它们初始化。