在scala中覆盖val

时间:2013-11-13 10:50:43

标签: scala

我对以下内容感到困惑:

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中,如果覆盖超级类中的变量或“影子”,超类就有自己的变量。但是在这里,即使我认为我使用不同的字符串显式初始化父级,父级也会设置为与子类相同的值?

1 个答案:

答案 0 :(得分:9)

scala valjava中的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?