加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:09:40 所属栏目:安全 来源:网络整理
导读:我正在练习 JavaTpoint中的代码来学习Scala中的继承.但我无法从类的车辆访问成员Bike,其值已初始化为零.我试过超类型引用,但它仍然显示被覆盖的值.为什么它不允许访问超类字段并指向被重写的子类字段(速度).这是代码和输出. 提前感谢. class Vehicle { val s
我正在练习 JavaTpoint中的代码来学习Scala中的继承.但我无法从类的车辆访问成员Bike,其值已初始化为零.我试过超类型引用,但它仍然显示被覆盖的值.为什么它不允许访问超类字段并指向被重写的子类字段(速度).这是代码和输出.
提前感谢.

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.

解决方法

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

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

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.

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

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的速度.

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

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

super may not be used on value speed

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读