代码之家  ›  专栏  ›  技术社区  ›  lehermj

在java中创建类实例的问题

  •  0
  • lehermj  · 技术社区  · 7 年前

    我试图制作一个“赛车模拟器”,在其中创建和比较车辆。它包括定义车辆的类别和比较其速度的主要类别。当我创建两个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 回复  |  直到 7 年前
        1
  •  1
  •   Sean Patrick Floyd    7 年前

    每个类加载器只存在一个静态字段。 将静态字段转换为实例字段,这样就可以了。

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

        2
  •  1
  •   VHS    7 年前

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

    更改以下内容:

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

    int _weight, _topSpeed;
    double _zeroToSixty;
    String _vehicleName;
    

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

        3
  •  0
  •   gpeche    7 年前

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

    如果希望每个实例都有自己的 _最高速度 ,您应该放下 静止的 合格者这就足够了:

    int _weight, _topSpeed;
    double _zeroToSixty;
    String _vehicleName;
    

    作为最后的评论,通常最好将字段声明为 private

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

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

        4
  •  0
  •   gpopides    7 年前

    你试过使用吗

    this._topSpeed()
    

    并使用正态变量,而不是静态变量。 为什么用下划线?

        5
  •  0
  •   Ash_s94    7 年前

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