我对以下内容感到困惑:
class A(val s: String) {
def supershow {
println(s)
}
}
class B(override val s: String) extends A("why don't I see this?"){
def show {
println(s)
}
def showSuper {
super.supershow
}
}
object A extends App {
val b = new B("mystring")
b.show
b.showSuper
}
我在期待:
mystring
why don't I see this?
但我明白了:
mystring
mystring
在java中,如果覆盖超级类中的变量或“影子”,超类就有自己的变量。但是在这里,即使我认为我使用不同的字符串显式初始化父级,父级也会设置为与子类相同的值?
答案 0 :(得分:9)
scala
val
与java
中的getter方法类似。您甚至可以使用def
覆盖val
。
如果您需要与java
中的字段类似的内容,则应使用private[this] val
:
class A(private[this] val s: String) {
def superShow() = println(s)
}
class B(private[this] val s: String) extends A("why don't I see this?") {
def show() = println(s)
}
val b = new B("message")
b.show
// message
b.superShow()
// why don't I see this?