在java中创建类的实例的问题

时间:2017-11-06 20:50:56

标签: java oop instantiation

我正在尝试创建一个“赛车模拟器”,在其中创建和比较车辆。它包括一个定义车辆的类和一个比较速度的主类。当我创建两个Vehicle实例并在两个实例上使用我的getSpeed方法时,速度是相同的。知道为什么吗?

主:

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;
    }
}

main的输出是:

“自行车:12吉普车:12”

5 个答案:

答案 0 :(得分:1)

每个ClassLoader只存在一次静态字段。 将静态字段转换为实例字段,你应该没问题。

如果您愿意,可以将主类中的变量保持为静态,但Vehicle类中的所有变量都需要丢失static关键字

答案 1 :(得分:1)

每个车辆实例都应该有自己的名称,最高速度,重量等。换句话说,它们应该被声明为实例变量,而不是静态。

更改以下内容:

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

int _weight, _topSpeed;
double _zeroToSixty;
String _vehicleName;

此外,作为一种良好做法,请为private使用范围限定符。

答案 2 :(得分:0)

您是否尝试过使用

this._topSpeed()

使用普通变量,而不是静态变量。 为什么你使用下划线?

答案 3 :(得分:0)

您将字段声明为static。这意味着该字段在类的所有实例之间共享。作为分配给的最后一个值 _topSpeed为12(从第二次调用构造函数开始),这是您为该类的两个实例看到的值。

如果您希望每个实例都有自己的_topSpeed,则应删除static限定符。这就足够了:

int _weight, _topSpeed;
double _zeroToSixty;
String _vehicleName;

作为最后的评论,将字段声明为private通常是个好主意,除非您确实需要它们具有其他类型的访问权限。所以你通常会写:

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

将每个字段放在自己的行中也有助于查看每个字段的整个声明。

答案 4 :(得分:0)

对于每个车辆对象应该唯一的要素,您有静态变量。 Static使其成为类的属性而不是对象。制作这些实例变量应该有助于解决您的问题。