4

私は次のことで混乱しています:

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 では、スーパー クラスの変数をオーバーライドまたは「シャドウ」する場合、スーパー クラスには独自の変数があります。しかし、ここでは、親を別の文字列で明示的に初期化していると思いますが、親はサブクラスと同じ値に設定されますか?

4

1 に答える 1

9

の getter メソッドにscala val似ていjavaます。でオーバーライドすることもできdefますval

field from に似たものが必要な場合は、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?
于 2013-11-13T10:59:23.827 に答える