Java Pass-by-reference不起作用?

时间:2015-06-10 21:50:43

标签: java variables reference pass-by-reference

我试图用Java创建这个小游戏,但我似乎偶然发现了一个变量引用问题。 Player扩展的My Entity类保留Dimension类型的变量。 这个Dimension通过Entity类的构造函数设置,如下所示:

protected Dimension dimension;

public Entity(Dimension dimension) {
    this.dimension = dimension;
}

在我的播放器类中,这是我通过构造函数传递维度对象的方式:

public Player(Dimension dimension) {
    super(dimension);
}

我还有一个Game类,它保留所有可能的维度,加上一个名为activedimension的额外变量,它保留对活动游戏维度的引用。

private Dimension activedimension;
private Dimension overworld;
private Dimension otherdimension;

public Game() {
    overworld = new OverWorldDimension();
    otherdimension = new OtherDimension();
    activedimension = overworld;
}

当我想重置我的世界范围时,我使用这种方法:

public void resetOverWorld() {
    overworld = new OverWorldDimension();
    activedimension = overworld;
}

现在,每当我从任何地方调用这个resetOverWorld方法时,似乎我的activedimension确实刷新了,但是我的Player / Enitity类中存储的维度并没有。 我对Java很新,所以我不知道我是否通过构造函数和方法传递了变量引用。 我的应用程序似乎在某处复制了维度对象而不是传递引用,但我无法弄清楚在哪里。

欢迎任何帮助或想法。 提前致谢 〜Krikke

4 个答案:

答案 0 :(得分:3)

问题是您没有更新Player课程中的参考资料。将Dimension存储在Entity构造函数中时,您将在内存中存储对该Dimension的引用。在resetOverWorld()方法中,您将overworldactivedimension变量更改为指向新的OverWorldDimension,但其他地方的所有引用(例如您的Entity对象)都没有改变了。它们仍然引用它们构造的初始Dimension

您可能希望考虑使用DimensionTracker可以容纳的Entity课程,允许您从单个位置更改内部Dimension。否则,您需要更新每个Entity以引用新的Dimension

public class DimensionTracker {
    public Dimension dimension;
    public DimensionTracker(Dimension d) {
        dimension = d;
    }
}

...

protected DimensionTracker dimensionTracker;

public Entity(DimensionTracker dt) {

    dimensionTracker = dt;
}

...

public Player(DimensionTracker dt){
    super(dt);
}

...

private DimensionTracker activedimension;
private Dimension overworld;
private Dimension otherdimension;

public Game() {
    overworld = new OverWorldDimension();
    otherdimension = new OtherDimension();
    activedimension.dimension = overworld;
}

...

public void resetOverWorld() {
    overworld = new OverWorldDimension();
    activedimension.dimension = overworld;
}

答案 1 :(得分:1)

public void resetOverWorld() {
    overworld = new OverWorldDimension();
    activedimension = overworld;
}

这只会更新Game类变量private Dimension activedimension ;

调用resetOverWorld()后,您必须通过执行类似

的操作来设置对Entity类的新引用
entity.setDimension(activedimension)

答案 2 :(得分:0)

你不能保存对变量世界的引用,而是保存对世界的价值:

this.dimension = dimension;

因此,当游戏中的引用发生变化时,您必须手动更新实体的引用,否则它将指向旧值,因为它独立于变量的世界。

答案 3 :(得分:0)

您将维度对象传递给iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j DNAT --to 10.x.x.x:1234 对象,并在其某个字段中存储对该对象的引用。

Player对象中,您设置Game以引用activedimension对象。通过更改其值,您可以将其更改为引用不同的Dimension对象。

即使Dimension用于引用传递给activedimension的相同Dimension对象,将其更改为其他Player对象也不会更改引用的对象在Dimension

考虑一下,如果系统像这样开始:

Player

Game - activedimension --> Dimension object A Player - dimension --> Dimension object A Dimension object A对象都会看到对Player的更改。

但是,将Game更改为指向activedimension,完全不同的对象不会使Dimension object B更改为指向它。

dimension