2011-10-30 67 views
3

我知道,在父類中有一個受保護的變量是個不好的設計,因爲所有子類都可以更改該值。但是,我試圖測試它,但我在這裏做錯了什麼。它告訴我,在Truck類中找不到符號speed = 999999;。我認爲子類可以訪問父類中的受保護變量speed子類從Java中的父類中更改受保護的變量

public class Vehicle { 
    protected double speed; 
    protected double maxSpeed; 

    public Vehicle(double speed, double maxSpeedIn) throws InvalidDataException{ 
     setSpeed(speed); 
     maxSpeed = maxSpeedIn; 
    } 

    public void setSpeed(double s) throws InvalidDataException { 
     if (s < 0.0) { 
      throw new InvalidDataException("Negative speed is not valid"); 
     } 
     if (s > maxSpeed) { 
      throw new InvalidDataException("Speed cannot exceed maximum spped:"); 
     } 
     speed = s; 
    } 


} 

public class Truck extends Vehicle { 

    public Truck(double speedin, double maxSpeedin) throws InvalidDataException { 
     super(speedin,maxSpeedin); 
    } 

    speed = 999999; 

} 

回答

2

您的speed = 99999;行的方式無效,你把它放在卡車班。嘗試把它放在別的地方。

例如,你可以,只爲你的測試目的,將其放在卡車的構造函數,調用後超級

請注意,你必須有完全相同的錯誤,如果你選擇了另一名altogher,就像這樣:

public Truck extends Vehicle { 

    public Truck(double speedin, double maxSpeedin) throws InvalidDataException { 
     super(speedin,maxSpeedin); 
    } 

    justTesting = 999999; 

} 
+0

現在就工作,謝謝! – Dan

1

您試圖訪問一個方法體之外的變量,它需要在子類中的構造函數或方法中,以便以您想要的方式訪問它。

2

在Java中,您不能簡單地在類的中間寫入指令(如speed = 999999;)。指令必須寫在方法(函數)中。你究竟是什麼意思?你想要什麼時候執行這條指令?

順便說一句,當setSpeedVehicle構造maxSpeed尚未初始化,當您嘗試比較smaxSpeed這將導致錯誤調用。

+0

是的,我注意到我一直在得到maxSpeed錯誤檢查 – Dan

1

在我看來,保護變量不一定是件壞事。在某些情況下,它確實可能是必要的。但它取決於當然的設計:)

在這種情況下,我認爲它是非常有意義的。您應該可以更改Truck類中的speed值。這裏的問題是(可能)行speed = 999999;沒有放在類中的方法中。我可能是錯的,但在我看來,Java將它編譯爲與類無關的代碼,因此無法找到速度變量。嘗試把它放在構造函數中,看看會發生什麼。

相關問題