2017-08-29 145 views
0

我正在從JavaTpoint中練習這段代碼,以學習Scala中的繼承。但是我無法從班級車輛中獲得成員自行車,其價值已初始化爲零。我嘗試了超類型參考,但它仍然顯示重寫的值。爲什麼它不允許訪問超類字段並指向重寫的子類字段(速度)。這裏是代碼和輸出。 預先感謝。Scala:爲什麼我們不能做super.val?

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.

回答

1

正如我們所知,後斯卡拉編譯,斯卡拉將被轉移到Java字節碼,它是兼容JVM

以及類Vehicle變量val speed,編譯後是可見的爲它的子類Bike(在protected變量),我們可以查看Vehiclebytecode

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 

我們可以看到,它的init的speed的值中的Vehicle構造方法。

,我們還可以找到Bike構造函數初始化動作:

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 

它在構造方法中設置100speed

所以initBike對象時,該speed字段的值已經在superclassVehicle更新100。所以super.val在那裏沒有意義。

還有另外一個需要東西叫出來:當你直接在你的子類Bike使用super.speed,編譯器會拋出:

super may not be used on value speed 

所以拋出此編譯器錯誤也是造成上述原因。

+0

「正如我們所知,在Scala編譯之後,它將轉移到Java字節碼以與JVM兼容。」這句話沒有意義。你使用谷歌翻譯? – pedrofurla

+0

@pedrofurla,;) – chengpohi

相關問題