scala - Scala 类中已初始化变量,但打印的内容为空?
问题描述
object ObjectExample {
def main(args: Array[String]): Unit = {
val student = new Student("zhu", 18, "zz")
println(student.gender)
}
}
class People(val name: String, val age: Int) {
println("constructor")
println(name)
val gender: String = "male"
println(gender)
def this(name1: String) = { //it is useless in here
this("ci", 18)
println("subconstructor")
println(name)
println(gender)
}
}
class Student(name: String, age: Int, val school: String) extends People(name, age){
println("derived constructor")
println(name)
println(school)
override val gender: String = "female"
println(gender)
}
gender
我认为我已经初始化的第一个,但它打印的是空的。我尝试在Student
课堂上覆盖它并打印“女性”。
这是结果,第三行是People
什么gender
输出
constructor
zhu
null
derived constructor
zhu
zz
female
female
解决方案
Scala 常见问题解答中对此进行了解释-为什么我的抽象或覆盖的 val 为空?
页面引用:
“严格”或“急切”的 val 是没有标记为惰性的。
在没有“早期定义”(见下文)的情况下,严格 val 的初始化按以下顺序完成。
超类在子类之前完全初始化。否则,按申报顺序。自然,当一个 val 被覆盖时,它不会被多次初始化。因此,尽管上面示例中的 x2 似乎在每个点上都定义了,但情况并非如此:在超类的构造过程中,被覆盖的 val 将显示为 null,抽象 val 也是如此。
有一个编译器标志可用于识别这种情况:
-Xcheckinit:向字段访问器添加运行时检查。
Page 还提供了三种解决方案(详见常见问题页面):
- 使用惰性 val
- 使用早期定义(正如@jwvh 已经建议的那样)
- 使用常量值定义
推荐阅读
- c# - 如何使用 ASP .NET CORE 从控制器传递 AJAX 响应(真/假)
- azure - 将图像上传到 blob 容器的字节数为零
- r - match.names(clabs, names(xi)) 中的错误:名称与以前的名称不匹配
- ssl - 奇怪的 SSL 公用名不匹配
- php - 在外部脚本中使用 wordpress 操作
- plsql - 行级触发器问题
- python - 当 pred_fn_pairs 从 for 循环构建时,Tensorflow 案例功能不起作用
- javascript - 如何在发送对象的同时使用护照进行身份验证
- c# - 我无法再使用 Azure Function 从 local.setting.json 获取值
- python - 获取请求历史记录的日期/时间