【问题标题】:Are 2 references to an object == to each other?对一个对象的 2 个引用 == 是相互的吗?
【发布时间】:2021-11-28 10:52:31
【问题描述】:

我有一个方法move(xSteps, ySteps),它取一个点并根据方法上的参数通过增加或减少x和y来移动它。

但是当 xSteps 和 ySteps 都为 0 时,我想将移动的点(实际上并没有移动)存储在与原始点相同的内存位置,因为 x 和 y 值应该相同。

移动方法如下

public Point move(int xSteps, int ySteps) {
    Point p;
    Point p2;
    if (xSteps == 0 && ySteps == 0) {
        p = new Point(x, y);
        p2 = p
        return p2;
    } else {
        p2 = new Point(x + xSteps, y + ySteps);
    }
    return p2;
}

但是当我运行这个测试时,

moved = point.move(0,0);

        Assertions.assertTrue(p == moved);

它返回 false,但它应该是 true。为什么会这样?

【问题讨论】:

    标签: java tdd


    【解决方案1】:

    == 检查对象 pmoved 是否是同一个对象。由于您创建了一个新对象 (p = new Point),因此 moved 将不是同一个对象,即使它具有相同的值。

    如果要比较值,可以使用 equals()。 所以:Assertions.assertTrue( p.equals(moved) );

    【讨论】:

    • 假设 equals 被正确覆盖。
    【解决方案2】:

    p == moved 测试pmoved 是否引用同一个对象。

    由于move() 方法总是返回new Point(),因此您当前实现的move() 方法将失败。

    如果您想要将移动的点(实际上并未移动)存储在与原始点相同的内存位置,那么您需要将移动方法更改为

    public Point move(int xSteps, int ySteps) {
        if (xSteps == 0 && ySteps == 0) {
            return this;
        } else {
            return new Point(x + xSteps, y + ySteps);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多