2017-11-06 20 views
0

私は車両の作成と比較を行う「レーシングシミュレータ」を作ろうとしています。車両が定義されているクラスと、速度が比較されるメインクラスが含まれます。 Vehicleのインスタンスを2つ作成し、両方のインスタンスでgetSpeedメソッドを使用すると、速度は同じになります。どんな考え?Javaでクラスのインスタンスを作成する際の問題

メイン:

public class Main { 

    static Vehicle bike, jeep; 
    //static Race race; 

    public static void main(String args[]) { 
     bike = new Vehicle(4000, 20, 30.5, "bike"); 
     jeep = new Vehicle(3000, 12, 9.8, "Jeep"); 
     //race = new Race(bike, jeep, 0); 
     System.out.println("Bike: " + bike.getTopSpeed() + " Jeep: " + jeep.getTopSpeed()); 
    } 
} 

ビヒクル:

public class Vehicle { 

    static int _weight, _topSpeed; 
    static double _zeroToSixty; 
    static String _vehicleName; 

    public Vehicle(int weight, int topSpeed, double zeroToSixty, String vehicleName) { 
     _weight = weight; 
     _topSpeed = topSpeed; 
     _zeroToSixty = zeroToSixty; 
     _vehicleName = vehicleName; 
    } 

    public static void setVehicleName(String name) { 
     _vehicleName = name; 
    } 

    public static void setWeight(int weight) { 
     _weight = weight; 
    } 

    public static void setTopSpeed(int topSpeed) { 
     _weight = topSpeed; 
    } 

    public static void setZeroToSixty(double zeroToSixty) { 
     _zeroToSixty = zeroToSixty; 
    } 

    public static String getVehicleName() { 
     return _vehicleName; 
    } 

    public static int getWeight() { 
     return _weight; 
    } 

    public static int getTopSpeed() { 
     return _topSpeed; 
    } 

    public static double getZeroToSixty() { 
     return _zeroToSixty; 
    } 
} 

メインの出力である:

"バイク:12ジープ:12"

+1

「_topSpeed」は「静的」なので、問題です。変数宣言から 'static'修飾子を削除してください。 ClassLoaderごとに –

答えて

0

フィールドをstaticと宣言しています。つまり、フィールドはで、クラスのすべてのインスタンス間で共有されます。です。 _topSpeedに割り当てられた最後の値は12です(コンストラクタの2番目の呼び出しから)。これは、クラスの両方のインスタンスに表示される値です。

各インスタンスに独自の_topSpeedを設定する場合は、static修飾子を削除する必要があります。これは十分であろう。最終的解説として

int _weight, _topSpeed; 
double _zeroToSixty; 
String _vehicleName; 

、それは通常は良いアイデアをあなたが本当にアクセスの別のタイプを持っているそれらを必要としない限り、privateとしてフィールドを宣言します。だから、一般的に記述します。

private int _weight; 
private int _topSpeed; 
private double _zeroToSixty; 
private String _vehicleName; 

独自の行の各フィールドを持つには、各フィールドの全体の宣言を煮するのに役立ちます。

1

静的フィールドのみごとに一度存在しますClassLoader 静的フィールドをインスタンスフィールドに変換してください。

あなたは、あなたが静的あなたのメインクラスの変数を維持することができますしたいのですが、Vehicleクラスのすべての変数が

+0

?異なるClassLoaderから同じクラスをロードすると、異なるとみなされるという事実を指していますか?それとも、他にも何らかの根拠があるのでしょうか?ちょうど好奇心が強い – gpeche

+0

@gpecheはい、それは問題である状況に入るのはかなり難しいです。人工的なシナリオは次のとおりです:https://ideone.com/e8z2Sv –

0

はあなたが

this._topSpeed() 

を使用しようとしましたstaticキーワードを失うする必要がある場合と静的ではなく、通常の変数を使用します。 なぜアンダースコアを使用しますか?

1

各車両インスタンスは、独自の名前、最高速度、重量などを持つ必要があります。つまり、静的ではなくインスタンス変数として宣言する必要があります。

変更以下:

static int _weight, _topSpeed; 
static double _zeroToSixty; 
static String _vehicleName; 

int _weight, _topSpeed; 
double _zeroToSixty; 
String _vehicleName; 

にも、良いプラクティスとして、これらのためにprivateのスコープ修飾子を使用します。

0

各車両オブジェクトに固有のフィーチャの静的変数があります。 Staticは、オブジェクトではなくクラスのプロパティにします。これらのインスタンス変数を作成すると、問題を解決するのに役立ちます。

関連する問題