是否可以更新 class 点的位置?

Is it possible to update location of Point class?

我有一个带有 Point 场的粒子。我想抓住这个 Point,在它周围创建一个假想的正方形点(仅整数),并将所有点添加到列表中,只要它们不在列表中 getstuck。这大概是我想要的样子:

public void pointStuck(Particle particle) {
    Point ps = particle.getPoint();
    for (int i = -3; i < 4; i++) {
        for (int j = -3; j < 4; j++) {
            ps += (i,j);
            if (getstuck.contains(ps) == false) {
                getstuck.add(ps);
            }
        }
    }
}

问题是语法 ps += (i,j); 不起作用,我可以使用类似的东西吗?

我知道我可以每次抓取粒子点然后像这样分别加上ij

Point ps = new Point(particle.getX()+i, particle.getY()+j)

但这使我的代码效率低下。我只想从 particle 调用 point 一次,然后为每个 forloop 更新它,而不必再次调用 point

如果我们讨论的是 java.awt.Point 对象,那么 Point 对象的 x 和 y 字段就是 public 字段,因此您可以简单地更新 Point 的 x 和 y 字段直接反对:

ps.x += i; 
for (int j = -3; j < 4; j++) {
    ps.y += j;
    if (!getstuck.contains(ps)) {
        getstuck.add(ps);
    }
}

为坐标 xy 提供设置器。您无需再次创建新实例,而是将值设置为您已经获得的实例:

ps.setX(ps.getX() + i);
ps.setY(ps.getY() + j);

请注意,它使 class 可变。不再有最终坐标。


说法ps += (i,j);完全不正确。您不能通过 (i, j) 构建对象。您也不能为 Point 重载 += 运算符。

但是您可以通过静态方法绕过运算符重载 merge(Point a, Point b)。它没有意义,因为您需要形成第二个参数并传递它。

方法 merge(Point p, int x, int y) 不是面向对象的方法。

您可以通过阅读 Point class 的 Java API 文档来回答此类问题。从谷歌搜索 "java point" 开始,它应该会给你一个 link 到 https://docs.oracle.com/javase/8/docs/api/java/awt/Point.html.

然后向下滚动到字段,您将看到 int xint y 的描述。由于这些显示在文档中,您自动知道您可以访问它们。要检查它们是 public 还是受保护,请单击字段名称以获取更多详细信息。 When you click on x,你会看到它是public。这意味着您可以直接访问它并按照您希望的任何方式修改它,如其他答案所示。

阅读此类文档是学习如何在 Java 中编程的一项关键技能。