斯卡拉:为什么我们不能做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() } } 解决方法
我们知道,在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 所以这个抛出的编译器错误也是由上述原因引起的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |