scala - Scala:运行覆盖的值父代码,但未在父级分配值
问题描述
运行以下代码:
class Parent {
val value = {
println("Setting value in parent")
"ParentVal"
}
println(s"Parent value is ${value}")
}
class Child extends Parent {
override val value = {
println("Setting value in child")
"ChildVal"
}
println(s"Child value is ${value}")
}
new Child
产生这个输出:
Setting value in parent
Parent value is null
Setting value in child
Child value is ChildVal
因此,与父值分配关联的代码运行,但是该值并未真正在父级分配。之后子代码运行并按预期分配值。
有人可以在较低级别解释这里的事件链吗?
解决方案
您可以将val
其视为没有 setter 的私有成员变量 + getter 方法的组合。如果你在没有val
s 的情况下重写你的代码,它会是这样的:
class Parent {
private[this] var parentValue = {
println("Setting value in parent")
"ParentVal"
}
def value: String = parentValue
println(s"Parent value is ${value}")
}
class Child extends Parent {
private[this] var childValue = {
println("Setting value in child")
"ChildVal"
}
override def value = childValue
println(s"Child value is ${value}")
}
new Child
就像原来的一样,它打印:
Setting value in parent
Parent value is null
Setting value in child
Child value is ChildVal
这是因为父构造函数调用了该方法 value
,但该方法被def value = childValue
. 返回childValue
的是null
,因为当父构造函数被调用时,子构造函数还没有被调用。
您可以在此处阅读有关对象初始化顺序的更多信息。
相关答案:
推荐阅读
- python - 自定义 CNN 给出错误的输出形状
- javascript - 如何在具有更多轮播的页面中控制单个轮播?
- algorithm - 如何遍历该节点图以生成代码?
- kotlin - 检查数组是否包含子字符串?
- amazon-web-services - docker-machine 显示我的 ec2 docker 节点超时
- kubernetes - 识别未处于就绪状态的 pod
- c++ - 如何从一些不同的编译时间中选择类型?
- python - 喀拉斯。基本模型的权重设置为“无”,但出现错误
- c - 将指针地址分配给指针的问题
- java - 基于 Android Studio 和 Swing 的应用程序文本/用户界面已损坏