1

我目前正在编写一个 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有点陌生,我不确定为什么这可能不会发生。我不认为我将不同 Exchange 的地址设置为指向堆中的同一个对象,因为我每次都在构造一个新对象。

我注意到的一件事是,对象在构造之后就具有正确的 exchangeName 属性(以及所有其他属性),因此这意味着只有在构造同一类的另一个对象时才会更改它。这表明 Exchange1、Exchange2 和 Exchange3 都指向堆中的同一个对象。但我不明白为什么会发生这种情况。

任何见解将不胜感激!如果答案非常明显,我提前道歉,这似乎是必须的。我似乎无法确定问题所在。谢谢,保罗

4

3 回答 3

5

您已exchangeName设置为static. exchangeName这意味着无论您有多少个实例,都只会有一个实例SimulatedExchange。使其成为非静态的。此外,this在构造函数中添加实例变量,例如this.exchangeName = exchangename;.

于 2013-10-09T05:33:16.817 回答
3

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

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

编辑:您的其他成员也是如此-Fee和.buyLimitsellLimit

于 2013-10-09T05:32:51.383 回答
1

您的exchangeName变量是静态的,因此它属于类而不是SimulatedExchange实例。

如果您删除静态,它应该可以工作;

public String exchangeName;
于 2013-10-09T05:33:13.493 回答