斯卡拉:为什么我们不能做super.val?

前端之家收集整理的这篇文章主要介绍了斯卡拉:为什么我们不能做super.val?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在练习 JavaTpoint中的代码来学习Scala中的继承.但我无法从类的车辆访问成员Bike,其值已初始化为零.我试过超类型引用,但它仍然显示被覆盖的值.为什么它不允许访问超类字段并指向被重写的子类字段(速度).这是代码输出.
提前感谢.

@H_403_9@

@H_403_9@

class Vehicle {
  val speed = 0
  println("In vehicle constructor " +speed)
  def run() {
    println(s"vehicle is running at $speed")
  }
}

class Bike extends Vehicle {
  override val speed = 100
  override def run() {
    super.run()
    println(s"Bike is running at $speed km/hr")
  }
}

object MainObject3 {
  def main(args:Array[String]) {
    var b = new Bike()
    b.run()
    var v = new Vehicle()
    v.run()
    var ve:Vehicle=new Bike()
    println("SuperType reference" + ve.speed)
    ve.run()
  }
}

How do I get the result using instance of Bike.

@H_403_9@

解决方法

我们知道,在Scala编译之后,Scala将转换为Java字节码,它与JVM兼容.

@H_403_9@

而对于类变量val的速度,在编译后它的子类Bike(受保护变量)可见,我们可以查看Vehicle的字节码:@H_403_9@

@H_403_9@

public Vehicle();
    Code:
       0: aload_0
       1: invokespecial #63                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: bipush        10
       7: putfield      #13                 // Field speed:I
      10: return

我们可以看到,它在Vehicle构造函数方法中初始化了速度值10.@H_403_9@

我们也可以在Bike构造函数方法中找到init动作:@H_403_9@

@H_403_9@

public Bike();
    Code:
       0: aload_0
       1: invokespecial #67                 // Method Vehicle."<init>":()V
       4: aload_0
       5: bipush        100
       7: putfield      #13                 // Field speed:I
      10: return

它在构造函数方法中设置为100的速度.@H_403_9@

因此,在初始化Bike对象时,速度字段的值已在超类Vehicle中更新为100.所以super.val在那里没有意义.@H_403_9@

还有另一件事需要调用:当您在子类Bike中直接使用super.speed时,编译器将抛出:@H_403_9@

@H_403_9@

super may not be used on value speed

所以这个抛出的编译器错误也是由上述原因引起的.@H_403_9@

猜你在找的Scala相关文章