在java中创建类实例的问题

在java中创建类实例的问题,java,oop,instantiation,Java,Oop,Instantiation,我试图制作一个“赛车模拟器”,在其中创建和比较车辆。它包括定义车辆的类别和比较车辆速度的主要类别。当我创建两个Vehicle实例并在两个实例上使用getSpeed方法时,速度是相同的。知道为什么吗 主要内容: 车辆: public class Vehicle { static int _weight, _topSpeed; static double _zeroToSixty; static String _vehicleName; public Vehicl

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

主要内容:

车辆:

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的输出是:


“Bike:12 Jeep:12”

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


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

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

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

您尝试过使用吗

this._topSpeed()
并使用正常变量,而不是静态变量。 为什么要用下划线?

你试过用下划线吗

this._topSpeed()
并使用正常变量,而不是静态变量。
为什么要使用下划线?

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

如果希望每个实例都有自己的
\u topSpeed
,则应删除
静态
限定符。这就足够了:

int _weight, _topSpeed;
double _zeroToSixty;
String _vehicleName;
作为最后的注释,除非您确实需要使用另一种访问类型,否则通常最好将字段声明为
private
。所以你通常会写:

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

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

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

如果希望每个实例都有自己的
\u topSpeed
,则应删除
静态
限定符。这就足够了:

int _weight, _topSpeed;
double _zeroToSixty;
String _vehicleName;
作为最后的注释,除非您确实需要使用另一种访问类型,否则通常最好将字段声明为
private
。所以你通常会写:

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

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

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

更改以下内容:

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


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

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

更改以下内容:

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


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

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

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

\u topSpeed
静态的
,因此存在问题。从变量声明中删除
static
修饰符。
\u topSpeed
static
因此出现问题。从变量声明中删除
静态
修饰符。每个类加载器?你是说,如果你从不同的类加载器加载同一个类,它们会被认为是不同的吗?或者是否有其他有效的锥减额?只是curious@gpeche是的,但是很难进入这样一个问题。这里有一个人工场景:每个类加载器?你是说,如果你从不同的类加载器加载同一个类,它们会被认为是不同的吗?或者是否有其他有效的锥减额?只是curious@gpeche是的,但是很难进入这样一个问题。下面是一个人工场景: