我目前正在编写Java程序,但得到的结果似乎很奇怪。我正在构造SimulatedExchange类的对象,该类具有以下构造函数:

public class SimulatedExchange {
public static String exchangeName;
SimulatorData sim;

public static double Fee;
public static Limit buyLimit;
public static Limit sellLimit;

public SimulatedExchange(String exchangename, SimulatorData simdata){
    exchangeName = exchangename;
    sim = simdata;
    if (exchangename.contentEquals("Exchange1")) Fee = .005;
    if (exchangename.contentEquals("Exchange2")) Fee = .0055;
    if (exchangename.contentEquals("Exchange3")) Fee = .002;
    buyLimit = new Limit();
    sellLimit=new Limit();

}


我的主班看起来像这样:

     public static void main (String[] args){
            SimulatorData fake = new SimulatorData("c:/users/el nico/documents/SimulatorData.xls");
    SimulatedExchange Exchange1 = new SimulatedExchange("Exchange1", fake);
      SimulatedExchange Exchange2 = new SimulatedExchange("Exchange2", fake);
    SimulatedExchange Exchange3 = new SimulatedExchange("Exchange3", fake);

       System.out.println("1st exchange name: " + Exchange1.exchangeName);
       System.out.println("2nd exchange name: " + Exchange2.exchangeName);
       System.out.println("3rd exchange name: " + Exchange3.exchangeName);

   }


SimulatorData对象包含一个ArrayList数据,它在构造时从文件中读取。

我得到以下输出:

第一个交易所名称:Exchange3

第二交易所名称:Exchange3

第三交易所名称:Exchange3

这对我来说很奇怪,因为我已经向SimulatedExchange对象名称Exchange1,Exchange2和Exchange3的三个不同的构造函数中输入了不同的字符串,所以我会认为构造函数将对它们的每个exchangeName属性进行不同的设置。我对Java有点陌生,我不确定为什么这种情况可能不会发生。我不认为我将不同交易所的地址设置为指向堆中的同一对象,因为每次都在构造一个新对象。

我注意到的一件事是,对象在构造之后就具有正确的exchangeName属性(以及所有其他属性),因此这意味着仅在构造相同类的另一个对象时才对其进行更改。这对我来说表明Exchange1,Exchange2和Exchange3都指向堆中的同一对象。但是我不知道为什么会这样。

任何见解将不胜感激!如果答案很明显,我必须提前道歉,看来必须如此。我只是似乎无法指出问题所在。
谢谢,
保罗

最佳答案

您的exchangeName成员是static,这意味着该类只有一个实例,而不是每个实例。

每次调用构造函数时,它都会被覆盖。
只需删除static修饰符使其成为实例变量,就可以了。

编辑:
其他成员也一样-FeebuyLimitsellLimit

10-05 21:07
查看更多